summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-01-20 05:43:09 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-01-20 05:43:09 +0100
commit04086a90c9e933ebfb42de378054e1115b33529d (patch)
treef0a9e25216807f9a20d757eadf420456d16f613f
parent90690702e1e4abab804ec91e8ff4183824bec436 (diff)
downloadiced-04086a90c9e933ebfb42de378054e1115b33529d.tar.gz
iced-04086a90c9e933ebfb42de378054e1115b33529d.tar.bz2
iced-04086a90c9e933ebfb42de378054e1115b33529d.zip
Implement `WasmBindgen` executor and reorganize
-rw-r--r--futures/Cargo.toml3
-rw-r--r--futures/src/executor.rs12
-rw-r--r--futures/src/executor/wasm_bindgen.rs17
-rw-r--r--src/element.rs9
-rw-r--r--src/executor.rs54
-rw-r--r--src/lib.rs30
-rw-r--r--src/native.rs68
-rw-r--r--src/native/executor.rs23
-rw-r--r--src/web.rs1
-rw-r--r--src/widget.rs60
-rw-r--r--web/src/lib.rs9
11 files changed, 176 insertions, 110 deletions
diff --git a/futures/Cargo.toml b/futures/Cargo.toml
index 13c2d6b7..91860e1e 100644
--- a/futures/Cargo.toml
+++ b/futures/Cargo.toml
@@ -27,3 +27,6 @@ features = ["rt-core"]
[dependencies.async-std]
version = "1.0"
optional = true
+
+[target.'cfg(target_arch = "wasm32")'.dependencies]
+wasm-bindgen-futures = "0.4"
diff --git a/futures/src/executor.rs b/futures/src/executor.rs
index 144a41f8..b2ff043e 100644
--- a/futures/src/executor.rs
+++ b/futures/src/executor.rs
@@ -4,23 +4,29 @@ mod null;
#[cfg(feature = "thread-pool")]
mod thread_pool;
-#[cfg(feature = "thread-pool")]
-pub use thread_pool::ThreadPool;
-
#[cfg(feature = "tokio")]
mod tokio;
#[cfg(feature = "async-std")]
mod async_std;
+#[cfg(target_arch = "wasm32")]
+mod wasm_bindgen;
+
pub use null::Null;
+#[cfg(feature = "thread-pool")]
+pub use thread_pool::ThreadPool;
+
#[cfg(feature = "tokio")]
pub use self::tokio::Tokio;
#[cfg(feature = "async-std")]
pub use self::async_std::AsyncStd;
+#[cfg(target_arch = "wasm32")]
+pub use wasm_bindgen::WasmBindgen;
+
use futures::Future;
pub trait Executor: Sized {
diff --git a/futures/src/executor/wasm_bindgen.rs b/futures/src/executor/wasm_bindgen.rs
new file mode 100644
index 00000000..70a8ea8e
--- /dev/null
+++ b/futures/src/executor/wasm_bindgen.rs
@@ -0,0 +1,17 @@
+use crate::Executor;
+
+#[derive(Debug)]
+pub struct WasmBindgen;
+
+impl Executor for WasmBindgen {
+ fn new() -> Result<Self, futures::io::Error> {
+ Ok(Self)
+ }
+
+ fn spawn(
+ &self,
+ future: impl futures::Future<Output = ()> + Send + 'static,
+ ) {
+ wasm_bindgen_futures::spawn_local(future);
+ }
+}
diff --git a/src/element.rs b/src/element.rs
new file mode 100644
index 00000000..e5356fb6
--- /dev/null
+++ b/src/element.rs
@@ -0,0 +1,9 @@
+/// A generic widget.
+///
+/// This is an alias of an `iced_native` element with a default `Renderer`.
+#[cfg(not(target_arch = "wasm32"))]
+pub type Element<'a, Message> =
+ iced_winit::Element<'a, Message, iced_wgpu::Renderer>;
+
+#[cfg(target_arch = "wasm32")]
+pub use iced_web::Element;
diff --git a/src/executor.rs b/src/executor.rs
new file mode 100644
index 00000000..cbbd8283
--- /dev/null
+++ b/src/executor.rs
@@ -0,0 +1,54 @@
+//! Choose your preferred executor to power your application.
+pub use crate::common::{executor::Null, Executor};
+
+pub use platform::Default;
+
+#[cfg(not(target_arch = "wasm32"))]
+mod platform {
+ use iced_winit::{executor::ThreadPool, futures, Executor};
+
+ /// A default cross-platform executor.
+ ///
+ /// - On native platforms, it will use a `iced_futures::executor::ThreadPool`.
+ /// - On the Web, it will use `iced_futures::executor::WasmBindgen`.
+ #[derive(Debug)]
+ pub struct Default(ThreadPool);
+
+ impl Executor for Default {
+ fn new() -> Result<Self, futures::io::Error> {
+ Ok(Default(ThreadPool::new()?))
+ }
+
+ fn spawn(
+ &self,
+ future: impl futures::Future<Output = ()> + Send + 'static,
+ ) {
+ self.0.spawn(future);
+ }
+ }
+}
+
+#[cfg(target_arch = "wasm32")]
+mod platform {
+ use iced_web::{executor::WasmBindgen, futures, Executor};
+
+ /// A default cross-platform executor.
+ ///
+ /// - On native platforms, it will use a `iced_futures::executor::ThreadPool`.
+ /// - On the Web, it will use `iced_futures::executor::WasmBindgen`.
+ #[derive(Debug)]
+ pub struct Default(WasmBindgen);
+
+ impl Executor for Default {
+ fn new() -> Result<Self, futures::io::Error> {
+ Ok(Default(WasmBindgen::new()?))
+ }
+
+ fn spawn(
+ &self,
+ future: impl futures::Future<Output = ()> + Send + 'static,
+ ) {
+ self.0.spawn(future);
+ }
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 18dfc098..9c9bcff5 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -180,26 +180,30 @@
#![deny(unsafe_code)]
#![deny(rust_2018_idioms)]
mod application;
+mod element;
mod sandbox;
-#[cfg(not(target_arch = "wasm32"))]
-mod native;
-
-#[cfg(not(target_arch = "wasm32"))]
-pub use native::*;
-
-#[cfg(target_arch = "wasm32")]
-mod web;
-
-#[cfg(target_arch = "wasm32")]
-pub use web::*;
-
+pub mod executor;
pub mod settings;
+pub mod widget;
pub mod window;
#[doc(no_inline)]
-pub use executor::Executor;
+pub use widget::*;
pub use application::Application;
+pub use element::Element;
+pub use executor::Executor;
pub use sandbox::Sandbox;
pub use settings::Settings;
+
+#[cfg(not(target_arch = "wasm32"))]
+use iced_winit as common;
+
+#[cfg(target_arch = "wasm32")]
+use iced_web as common;
+
+pub use common::{
+ Align, Background, Color, Command, Font, HorizontalAlignment, Length,
+ Space, Subscription, Vector, VerticalAlignment,
+};
diff --git a/src/native.rs b/src/native.rs
deleted file mode 100644
index 86ccffab..00000000
--- a/src/native.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-pub use iced_winit::{
- Align, Background, Color, Command, Font, HorizontalAlignment, Length,
- Space, Subscription, Vector, VerticalAlignment,
-};
-
-pub mod executor;
-
-pub mod widget {
- //! Display information and interactive controls in your application.
- //!
- //! # Re-exports
- //! For convenience, the contents of this module are available at the root
- //! module. Therefore, you can directly type:
- //!
- //! ```
- //! use iced::{button, Button};
- //! ```
- //!
- //! # Stateful widgets
- //! Some widgets need to keep track of __local state__.
- //!
- //! These widgets have their own module with a `State` type. For instance, a
- //! [`TextInput`] has some [`text_input::State`].
- //!
- //! [`TextInput`]: text_input/struct.TextInput.html
- //! [`text_input::State`]: text_input/struct.State.html
- pub use iced_wgpu::widget::*;
-
- pub mod image {
- //! Display images in your user interface.
- pub use iced_winit::image::{Handle, Image};
- }
-
- pub mod svg {
- //! Display vector graphics in your user interface.
- pub use iced_winit::svg::{Handle, Svg};
- }
-
- pub use iced_winit::Text;
-
- #[doc(no_inline)]
- pub use {
- button::Button, checkbox::Checkbox, container::Container, image::Image,
- progress_bar::ProgressBar, radio::Radio, scrollable::Scrollable,
- slider::Slider, svg::Svg, text_input::TextInput,
- };
-
- /// A container that distributes its contents vertically.
- ///
- /// This is an alias of an `iced_native` column with a default `Renderer`.
- pub type Column<'a, Message> =
- iced_winit::Column<'a, Message, iced_wgpu::Renderer>;
-
- /// A container that distributes its contents horizontally.
- ///
- /// This is an alias of an `iced_native` row with a default `Renderer`.
- pub type Row<'a, Message> =
- iced_winit::Row<'a, Message, iced_wgpu::Renderer>;
-}
-
-#[doc(no_inline)]
-pub use widget::*;
-
-/// A generic widget.
-///
-/// This is an alias of an `iced_native` element with a default `Renderer`.
-pub type Element<'a, Message> =
- iced_winit::Element<'a, Message, iced_wgpu::Renderer>;
diff --git a/src/native/executor.rs b/src/native/executor.rs
deleted file mode 100644
index 68a1d280..00000000
--- a/src/native/executor.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-//! Choose your preferred executor to power your application.
-pub use iced_winit::{executor::Null, Executor};
-use iced_winit::{executor::ThreadPool, futures};
-
-/// The default cross-platform executor.
-///
-/// - On native platforms, it will use a `ThreadPool`.
-/// - On the Web, it will use `wasm-bindgen-futures::spawn_local`.
-#[derive(Debug)]
-pub struct Default(ThreadPool);
-
-impl Executor for Default {
- fn new() -> Result<Self, futures::io::Error> {
- Ok(Default(ThreadPool::new()?))
- }
-
- fn spawn(
- &self,
- future: impl futures::Future<Output = ()> + Send + 'static,
- ) {
- self.0.spawn(future);
- }
-}
diff --git a/src/web.rs b/src/web.rs
deleted file mode 100644
index 31f1a6fc..00000000
--- a/src/web.rs
+++ /dev/null
@@ -1 +0,0 @@
-pub use iced_web::*;
diff --git a/src/widget.rs b/src/widget.rs
new file mode 100644
index 00000000..7d3a1cef
--- /dev/null
+++ b/src/widget.rs
@@ -0,0 +1,60 @@
+//! Display information and interactive controls in your application.
+//!
+//! # Re-exports
+//! For convenience, the contents of this module are available at the root
+//! module. Therefore, you can directly type:
+//!
+//! ```
+//! use iced::{button, Button};
+//! ```
+//!
+//! # Stateful widgets
+//! Some widgets need to keep track of __local state__.
+//!
+//! These widgets have their own module with a `State` type. For instance, a
+//! [`TextInput`] has some [`text_input::State`].
+//!
+//! [`TextInput`]: text_input/struct.TextInput.html
+//! [`text_input::State`]: text_input/struct.State.html
+#[cfg(not(target_arch = "wasm32"))]
+mod platform {
+ pub use iced_wgpu::widget::*;
+
+ pub mod image {
+ //! Display images in your user interface.
+ pub use iced_winit::image::{Handle, Image};
+ }
+
+ pub mod svg {
+ //! Display vector graphics in your user interface.
+ pub use iced_winit::svg::{Handle, Svg};
+ }
+
+ pub use iced_winit::Text;
+
+ #[doc(no_inline)]
+ pub use {
+ button::Button, checkbox::Checkbox, container::Container, image::Image,
+ progress_bar::ProgressBar, radio::Radio, scrollable::Scrollable,
+ slider::Slider, svg::Svg, text_input::TextInput,
+ };
+
+ /// A container that distributes its contents vertically.
+ ///
+ /// This is an alias of an `iced_native` column with a default `Renderer`.
+ pub type Column<'a, Message> =
+ iced_winit::Column<'a, Message, iced_wgpu::Renderer>;
+
+ /// A container that distributes its contents horizontally.
+ ///
+ /// This is an alias of an `iced_native` row with a default `Renderer`.
+ pub type Row<'a, Message> =
+ iced_winit::Row<'a, Message, iced_wgpu::Renderer>;
+}
+
+#[cfg(target_arch = "wasm32")]
+mod platform {
+ pub use iced_web::widget::*;
+}
+
+pub use platform::*;
diff --git a/web/src/lib.rs b/web/src/lib.rs
index c44b99b5..b1bb80e3 100644
--- a/web/src/lib.rs
+++ b/web/src/lib.rs
@@ -72,14 +72,19 @@ pub use dodrio;
pub use element::Element;
pub use hasher::Hasher;
pub use iced_core::{
- Align, Background, Color, Font, HorizontalAlignment, Length,
+ Align, Background, Color, Font, HorizontalAlignment, Length, Vector,
VerticalAlignment,
};
-pub use iced_futures::{futures, Command};
+pub use iced_futures::{executor, futures, Command};
pub use style::Style;
pub use subscription::Subscription;
+
+#[doc(no_inline)]
pub use widget::*;
+#[doc(no_inline)]
+pub use executor::Executor;
+
/// An interactive web application.
///
/// This trait is the main entrypoint of Iced. Once implemented, you can run