Implement `WasmBindgen` executor and reorganize

This commit is contained in:
Héctor Ramón Jiménez 2020-01-20 05:43:09 +01:00
parent 90690702e1
commit 04086a90c9
11 changed files with 176 additions and 110 deletions

View File

@ -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"

View File

@ -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 {

View File

@ -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);
}
}

9
src/element.rs Normal file
View File

@ -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;

54
src/executor.rs Normal file
View File

@ -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);
}
}
}

View File

@ -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,
};

View File

@ -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>;

View File

@ -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);
}
}

View File

@ -1 +0,0 @@
pub use iced_web::*;

60
src/widget.rs Normal file
View File

@ -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::*;

View File

@ -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