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 '')
| -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,          }      }  }  | 
