Add Application::Executor associated type

This commit is contained in:
Héctor Ramón Jiménez 2020-01-20 04:47:36 +01:00
parent 35760ac68f
commit 90690702e1
29 changed files with 195 additions and 72 deletions

View file

@ -1,4 +1,4 @@
use crate::{window, Command, Element, Settings, Subscription};
use crate::{window, Command, Element, Executor, Settings, Subscription};
/// An interactive cross-platform application.
///
@ -19,7 +19,7 @@ use crate::{window, Command, Element, Settings, Subscription};
/// before](index.html#overview). We just need to fill in the gaps:
///
/// ```no_run
/// use iced::{button, Application, Button, Column, Command, Element, Settings, Text};
/// use iced::{button, executor, Application, Button, Column, Command, Element, Settings, Text};
///
/// pub fn main() {
/// Counter::run(Settings::default())
@ -39,6 +39,7 @@ use crate::{window, Command, Element, Settings, Subscription};
/// }
///
/// impl Application for Counter {
/// type Executor = executor::Null;
/// type Message = Message;
///
/// fn new() -> (Self, Command<Message>) {
@ -80,6 +81,14 @@ use crate::{window, Command, Element, Settings, Subscription};
/// }
/// ```
pub trait Application: Sized {
/// The [`Executor`] that will run commands and subscriptions.
///
/// The [`executor::Default`] can be a good starting point!
///
/// [`Executor`]: trait.Executor.html
/// [`executor::Default`]: executor/struct.Default.html
type Executor: Executor;
/// The type of __messages__ your [`Application`] will produce.
///
/// [`Application`]: trait.Application.html
@ -185,6 +194,7 @@ where
A: Application,
{
type Renderer = iced_wgpu::Renderer;
type Executor = A::Executor;
type Message = A::Message;
fn new() -> (Self, Command<A::Message>) {

View file

@ -180,18 +180,26 @@
#![deny(unsafe_code)]
#![deny(rust_2018_idioms)]
mod application;
#[cfg(target_arch = "wasm32")]
#[path = "web.rs"]
mod platform;
#[cfg(not(target_arch = "wasm32"))]
#[path = "native.rs"]
mod platform;
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 settings;
pub mod window;
#[doc(no_inline)]
pub use executor::Executor;
pub use application::Application;
pub use platform::*;
pub use sandbox::Sandbox;
pub use settings::Settings;

View file

@ -3,6 +3,8 @@ pub use iced_winit::{
Space, Subscription, Vector, VerticalAlignment,
};
pub mod executor;
pub mod widget {
//! Display information and interactive controls in your application.
//!

23
src/native/executor.rs Normal file
View file

@ -0,0 +1,23 @@
//! 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,4 +1,4 @@
use crate::{Application, Command, Element, Settings, Subscription};
use crate::{executor, Application, Command, Element, Settings, Subscription};
/// A sandboxed [`Application`].
///
@ -133,6 +133,7 @@ impl<T> Application for T
where
T: Sandbox,
{
type Executor = executor::Null;
type Message = T::Message;
fn new() -> (Self, Command<T::Message>) {