Allow passing external state to Application::new
This commit is contained in:
parent
6e9ab1cd6f
commit
c4c5216e3b
13 changed files with 103 additions and 60 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue