summaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2020-03-31 17:49:56 +0200
committerLibravatar GitHub <noreply@github.com>2020-03-31 17:49:56 +0200
commite79e832092385346beec47f63e40f24800c535f8 (patch)
treec29df36b1987de66a58cfb981c5958d25712d51e /web
parent327347501c78a1c8e55a39fe1b5d54d7c2fcbcab (diff)
parentf0ebcc24742aba79cc779a4145a188f2534a5e35 (diff)
downloadiced-e79e832092385346beec47f63e40f24800c535f8.tar.gz
iced-e79e832092385346beec47f63e40f24800c535f8.tar.bz2
iced-e79e832092385346beec47f63e40f24800c535f8.zip
Merge pull request #246 from hecrj/feature/application-flags
Application flags
Diffstat (limited to 'web')
-rw-r--r--web/src/lib.rs39
1 files changed, 25 insertions, 14 deletions
diff --git a/web/src/lib.rs b/web/src/lib.rs
index 1de00545..a0b39c4a 100644
--- a/web/src/lib.rs
+++ b/web/src/lib.rs
@@ -94,11 +94,6 @@ pub use executor::Executor;
/// An [`Application`](trait.Application.html) can execute asynchronous actions
/// by returning a [`Command`](struct.Command.html) in some of its methods.
pub trait Application {
- /// The type of __messages__ your [`Application`] will produce.
- ///
- /// [`Application`]: trait.Application.html
- type Message: Send;
-
/// The [`Executor`] that will run commands and subscriptions.
///
/// The [`executor::WasmBindgen`] can be a good choice for the Web.
@@ -107,6 +102,16 @@ pub trait Application {
/// [`executor::Default`]: executor/struct.Default.html
type Executor: Executor;
+ /// The type of __messages__ your [`Application`] will produce.
+ ///
+ /// [`Application`]: trait.Application.html
+ type Message: Send;
+
+ /// The data needed to initialize your [`Application`].
+ ///
+ /// [`Application`]: trait.Application.html
+ type Flags;
+
/// Initializes the [`Application`].
///
/// Here is where you should return the initial state of your app.
@@ -117,7 +122,7 @@ pub trait Application {
/// request, etc.
///
/// [`Application`]: trait.Application.html
- fn new() -> (Self, Command<Self::Message>)
+ fn new(flags: Self::Flags) -> (Self, Command<Self::Message>)
where
Self: Sized;
@@ -165,21 +170,16 @@ pub trait Application {
/// Runs the [`Application`].
///
/// [`Application`]: trait.Application.html
- fn run()
+ fn run(flags: Self::Flags)
where
Self: 'static + Sized,
{
use futures::stream::StreamExt;
- let (app, command) = Self::new();
-
let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let body = document.body().unwrap();
- let mut title = app.title();
- document.set_title(&title);
-
let (sender, receiver) =
iced_futures::futures::channel::mpsc::unbounded();
@@ -187,6 +187,12 @@ pub trait Application {
Self::Executor::new().expect("Create executor"),
sender.clone(),
);
+
+ let (app, command) = runtime.enter(|| Self::new(flags));
+
+ let mut title = app.title();
+ document.set_title(&title);
+
runtime.spawn(command);
let application = Rc::new(RefCell::new(app));
@@ -199,8 +205,13 @@ pub trait Application {
let vdom = dodrio::Vdom::new(&body, instance);
let event_loop = receiver.for_each(move |message| {
- let command = application.borrow_mut().update(message);
- let subscription = application.borrow().subscription();
+ let (command, subscription) = runtime.enter(|| {
+ let command = application.borrow_mut().update(message);
+ let subscription = application.borrow().subscription();
+
+ (command, subscription)
+ });
+
let new_title = application.borrow().title();
runtime.spawn(command);