diff options
| author | 2019-11-21 18:00:27 +0100 | |
|---|---|---|
| committer | 2019-11-21 18:00:27 +0100 | |
| commit | ba56a561b254c9a5f3d23cb54d23dc311759ab4c (patch) | |
| tree | 3d262b1e892d83f7493a99737a267204a191e317 /src | |
| parent | 428509c84a142a653be3ec4bbff0c23c466c44fa (diff) | |
| download | iced-ba56a561b254c9a5f3d23cb54d23dc311759ab4c.tar.gz iced-ba56a561b254c9a5f3d23cb54d23dc311759ab4c.tar.bz2 iced-ba56a561b254c9a5f3d23cb54d23dc311759ab4c.zip  | |
Implement `iced::Sandbox` trait for simple apps
Diffstat (limited to '')
| -rw-r--r-- | src/application.rs | 69 | ||||
| -rw-r--r-- | src/lib.rs | 72 | ||||
| -rw-r--r-- | src/sandbox.rs | 45 | 
3 files changed, 118 insertions, 68 deletions
diff --git a/src/application.rs b/src/application.rs new file mode 100644 index 00000000..ba8da446 --- /dev/null +++ b/src/application.rs @@ -0,0 +1,69 @@ +use crate::{Command, Element}; + +pub trait Application: Sized { +    type Message: std::fmt::Debug + Send; + +    fn new() -> (Self, Command<Self::Message>); + +    fn title(&self) -> String; + +    fn update(&mut self, message: Self::Message) -> Command<Self::Message>; + +    fn view(&mut self) -> Element<Self::Message>; + +    fn run() +    where +        Self: 'static + Sized, +    { +        #[cfg(not(target_arch = "wasm32"))] +        <Instance<Self> as iced_winit::Application>::run(); + +        #[cfg(target_arch = "wasm32")] +        iced_web::Application::run(Instance(self)); +    } +} + +struct Instance<A: Application>(A); + +#[cfg(not(target_arch = "wasm32"))] +impl<A> iced_winit::Application for Instance<A> +where +    A: Application, +{ +    type Renderer = iced_wgpu::Renderer; +    type Message = A::Message; + +    fn new() -> (Self, Command<A::Message>) { +        let (app, command) = A::new(); + +        (Instance(app), command) +    } + +    fn title(&self) -> String { +        self.0.title() +    } + +    fn update(&mut self, message: Self::Message) -> Command<Self::Message> { +        self.0.update(message) +    } + +    fn view(&mut self) -> Element<Self::Message> { +        self.0.view() +    } +} + +#[cfg(target_arch = "wasm32")] +impl<A> iced_web::Application for Instance<A> +where +    A: Application, +{ +    type Message = A::Message; + +    fn update(&mut self, message: Self::Message) { +        self.0.update(message); +    } + +    fn view(&mut self) -> Element<Self::Message> { +        self.0.view() +    } +} @@ -1,73 +1,9 @@ +mod application;  #[cfg_attr(target_arch = "wasm32", path = "web.rs")]  #[cfg_attr(not(target_arch = "wasm32"), path = "native.rs")]  mod platform; +mod sandbox; +pub use application::Application;  pub use platform::*; - -pub trait Application: Sized { -    type Message: std::fmt::Debug + Send; - -    fn new() -> (Self, Command<Self::Message>); - -    fn title(&self) -> String; - -    fn update(&mut self, message: Self::Message) -> Command<Self::Message>; - -    fn view(&mut self) -> Element<Self::Message>; - -    fn run() -    where -        Self: 'static + Sized, -    { -        #[cfg(not(target_arch = "wasm32"))] -        <Instance<Self> as iced_winit::Application>::run(); - -        #[cfg(target_arch = "wasm32")] -        iced_web::Application::run(Instance(self)); -    } -} - -struct Instance<A: Application>(A); - -#[cfg(not(target_arch = "wasm32"))] -impl<A> iced_winit::Application for Instance<A> -where -    A: Application, -{ -    type Renderer = iced_wgpu::Renderer; -    type Message = A::Message; - -    fn new() -> (Self, Command<A::Message>) { -        let (app, command) = A::new(); - -        (Instance(app), command) -    } - -    fn title(&self) -> String { -        self.0.title() -    } - -    fn update(&mut self, message: Self::Message) -> Command<Self::Message> { -        self.0.update(message) -    } - -    fn view(&mut self) -> Element<Self::Message> { -        self.0.view() -    } -} - -#[cfg(target_arch = "wasm32")] -impl<A> iced_web::Application for Instance<A> -where -    A: Application, -{ -    type Message = A::Message; - -    fn update(&mut self, message: Self::Message) { -        self.0.update(message); -    } - -    fn view(&mut self) -> Element<Self::Message> { -        self.0.view() -    } -} +pub use sandbox::Sandbox; diff --git a/src/sandbox.rs b/src/sandbox.rs new file mode 100644 index 00000000..8ff374f7 --- /dev/null +++ b/src/sandbox.rs @@ -0,0 +1,45 @@ +use crate::{Application, Command, Element}; + +pub trait Sandbox { +    type Message: std::fmt::Debug + Send; + +    fn new() -> Self; + +    fn title(&self) -> String; + +    fn update(&mut self, message: Self::Message); + +    fn view(&mut self) -> Element<Self::Message>; + +    fn run() +    where +        Self: 'static + Sized, +    { +        <Self as Application>::run() +    } +} + +impl<T> Application for T +where +    T: Sandbox, +{ +    type Message = T::Message; + +    fn new() -> (Self, Command<T::Message>) { +        (T::new(), Command::none()) +    } + +    fn title(&self) -> String { +        T::title(self) +    } + +    fn update(&mut self, message: T::Message) -> Command<T::Message> { +        T::update(self, message); + +        Command::none() +    } + +    fn view(&mut self) -> Element<T::Message> { +        T::view(self) +    } +}  | 
