diff options
author | 2019-11-21 18:00:27 +0100 | |
---|---|---|
committer | 2019-11-21 18:00:27 +0100 | |
commit | ba56a561b254c9a5f3d23cb54d23dc311759ab4c (patch) | |
tree | 3d262b1e892d83f7493a99737a267204a191e317 /src/application.rs | |
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 'src/application.rs')
-rw-r--r-- | src/application.rs | 69 |
1 files changed, 69 insertions, 0 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() + } +} |