diff options
author | 2020-03-30 18:00:15 +0200 | |
---|---|---|
committer | 2020-03-30 18:10:15 +0200 | |
commit | c4c5216e3b69d732b0518d510f95675a4ba7010b (patch) | |
tree | 25e14890319bbab46aeb5133ef1c694959b9f694 /src | |
parent | 6e9ab1cd6f5358d323040379e3aadbed2cc4f7f8 (diff) | |
download | iced-c4c5216e3b69d732b0518d510f95675a4ba7010b.tar.gz iced-c4c5216e3b69d732b0518d510f95675a4ba7010b.tar.bz2 iced-c4c5216e3b69d732b0518d510f95675a4ba7010b.zip |
Allow passing external state to `Application::new`
Diffstat (limited to 'src')
-rw-r--r-- | src/application.rs | 49 | ||||
-rw-r--r-- | src/sandbox.rs | 5 | ||||
-rw-r--r-- | src/settings.rs | 12 |
3 files changed, 44 insertions, 22 deletions
diff --git a/src/application.rs b/src/application.rs index 2ee3337f..551a9a79 100644 --- a/src/application.rs +++ b/src/application.rs @@ -41,8 +41,9 @@ use crate::{window, Command, Element, Executor, Settings, Subscription}; /// impl Application for Counter { /// type Executor = executor::Null; /// type Message = Message; +/// type Flags = (); /// -/// fn new() -> (Self, Command<Message>) { +/// fn new(_flags: ()) -> (Self, Command<Message>) { /// (Self::default(), Command::none()) /// } /// @@ -94,7 +95,13 @@ pub trait Application: Sized { /// [`Application`]: trait.Application.html type Message: std::fmt::Debug + Send; - /// Initializes the [`Application`]. + /// The data needed to initialize your [`Application`]. + /// + /// [`Application`]: trait.Application.html + type Flags; + + /// Initializes the [`Application`] with the flags provided to + /// [`run`] as part of the [`Settings`]: /// /// Here is where you should return the initial state of your app. /// @@ -104,7 +111,9 @@ pub trait Application: Sized { /// request, etc. /// /// [`Application`]: trait.Application.html - fn new() -> (Self, Command<Self::Message>); + /// [`run`]: #method.run.html + /// [`Settings`]: struct.Settings.html + fn new(flags: Self::Flags) -> (Self, Command<Self::Message>); /// Returns the current title of the [`Application`]. /// @@ -169,26 +178,30 @@ pub trait Application: Sized { /// It should probably be that last thing you call in your `main` function. /// /// [`Application`]: trait.Application.html - fn run(_settings: Settings) + fn run(settings: Settings<Self::Flags>) where Self: 'static, { #[cfg(not(target_arch = "wasm32"))] - <Instance<Self> as iced_winit::Application>::run( - _settings.into(), - iced_wgpu::Settings { - default_font: _settings.default_font, - antialiasing: if _settings.antialiasing { + { + let wgpu_settings = iced_wgpu::Settings { + default_font: settings.default_font, + antialiasing: if settings.antialiasing { Some(iced_wgpu::settings::Antialiasing::MSAAx4) } else { None }, ..iced_wgpu::Settings::default() - }, - ); + }; + + <Instance<Self> as iced_winit::Application>::run( + settings.into(), + wgpu_settings, + ); + } #[cfg(target_arch = "wasm32")] - <Instance<Self> as iced_web::Application>::run(); + <Instance<Self> as iced_web::Application>::run(settings.flags); } } @@ -201,10 +214,11 @@ where { type Backend = iced_wgpu::window::Backend; type Executor = A::Executor; + type Flags = A::Flags; type Message = A::Message; - fn new() -> (Self, Command<A::Message>) { - let (app, command) = A::new(); + fn new(flags: Self::Flags) -> (Self, Command<A::Message>) { + let (app, command) = A::new(flags); (Instance(app), command) } @@ -238,11 +252,12 @@ impl<A> iced_web::Application for Instance<A> where A: Application, { - type Message = A::Message; type Executor = A::Executor; + type Message = A::Message; + type Flags = A::Flags; - fn new() -> (Self, Command<A::Message>) { - let (app, command) = A::new(); + fn new(flags: Self::Flags) -> (Self, Command<A::Message>) { + let (app, command) = A::new(flags); (Instance(app), command) } diff --git a/src/sandbox.rs b/src/sandbox.rs index 2c0332ff..4ea8de98 100644 --- a/src/sandbox.rs +++ b/src/sandbox.rs @@ -121,7 +121,7 @@ pub trait Sandbox { /// It should probably be that last thing you call in your `main` function. /// /// [`Sandbox`]: trait.Sandbox.html - fn run(settings: Settings) + fn run(settings: Settings<()>) where Self: 'static + Sized, { @@ -134,9 +134,10 @@ where T: Sandbox, { type Executor = executor::Null; + type Flags = (); type Message = T::Message; - fn new() -> (Self, Command<T::Message>) { + fn new(_flags: ()) -> (Self, Command<T::Message>) { (T::new(), Command::none()) } diff --git a/src/settings.rs b/src/settings.rs index 32ec583c..f36ec85f 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -3,7 +3,7 @@ use crate::window; /// The settings of an application. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] -pub struct Settings { +pub struct Settings<Flags> { /// The window settings. /// /// They will be ignored on the Web. @@ -11,6 +11,11 @@ pub struct Settings { /// [`Window`]: struct.Window.html pub window: window::Settings, + /// The data needed to initialize an [`Application`]. + /// + /// [`Application`]: trait.Application.html + pub flags: Flags, + /// The bytes of the font that will be used by default. /// /// If `None` is provided, a default system font will be chosen. @@ -28,8 +33,8 @@ pub struct Settings { } #[cfg(not(target_arch = "wasm32"))] -impl From<Settings> for iced_winit::Settings { - fn from(settings: Settings) -> iced_winit::Settings { +impl<Flags> From<Settings<Flags>> for iced_winit::Settings<Flags> { + fn from(settings: Settings<Flags>) -> iced_winit::Settings<Flags> { iced_winit::Settings { window: iced_winit::settings::Window { size: settings.window.size, @@ -37,6 +42,7 @@ impl From<Settings> for iced_winit::Settings { decorations: settings.window.decorations, platform_specific: Default::default(), }, + flags: settings.flags, } } } |