From c7ef9d0da705d8f27011fe41d2103c73aae42d2d Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 23 Oct 2019 02:33:07 +0200
Subject: Connect `iced_web` with `iced` properly

---
 src/lib.rs     | 36 ++++++++++++++++++++++++++----------
 src/web.rs     |  1 +
 src/winit.rs   | 11 +++++++++++
 web/Cargo.toml |  3 +--
 web/src/lib.rs | 13 +++----------
 5 files changed, 42 insertions(+), 22 deletions(-)
 create mode 100644 src/web.rs
 create mode 100644 src/winit.rs

diff --git a/src/lib.rs b/src/lib.rs
index 46574285..1bcdada2 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,13 +1,8 @@
-pub use iced_wgpu::{Primitive, Renderer};
-pub use iced_winit::{
-    button, slider, text, winit, Align, Background, Checkbox, Color, Image,
-    Justify, Length, Radio, Slider, Text,
-};
+#[cfg_attr(target_arch = "wasm32", path = "web.rs")]
+#[cfg_attr(not(target_arch = "wasm32"), path = "winit.rs")]
+mod platform;
 
-pub type Element<'a, Message> = iced_winit::Element<'a, Message, Renderer>;
-pub type Row<'a, Message> = iced_winit::Row<'a, Message, Renderer>;
-pub type Column<'a, Message> = iced_winit::Column<'a, Message, Renderer>;
-pub type Button<'a, Message> = iced_winit::Button<'a, Message, Renderer>;
+pub use platform::*;
 
 pub trait Application {
     type Message;
@@ -20,12 +15,17 @@ pub trait Application {
     where
         Self: 'static + Sized,
     {
-        iced_winit::Application::run(Instance(self))
+        #[cfg(not(target_arch = "wasm32"))]
+        iced_winit::Application::run(Instance(self));
+
+        #[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,
@@ -41,3 +41,19 @@ where
         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()
+    }
+}
diff --git a/src/web.rs b/src/web.rs
new file mode 100644
index 00000000..31f1a6fc
--- /dev/null
+++ b/src/web.rs
@@ -0,0 +1 @@
+pub use iced_web::*;
diff --git a/src/winit.rs b/src/winit.rs
new file mode 100644
index 00000000..64e301f4
--- /dev/null
+++ b/src/winit.rs
@@ -0,0 +1,11 @@
+pub use iced_wgpu::{Primitive, Renderer};
+
+pub use iced_winit::{
+    button, slider, text, winit, Align, Background, Checkbox, Color, Image,
+    Justify, Length, Radio, Slider, Text,
+};
+
+pub type Element<'a, Message> = iced_winit::Element<'a, Message, Renderer>;
+pub type Row<'a, Message> = iced_winit::Row<'a, Message, Renderer>;
+pub type Column<'a, Message> = iced_winit::Column<'a, Message, Renderer>;
+pub type Button<'a, Message> = iced_winit::Button<'a, Message, Renderer>;
diff --git a/web/Cargo.toml b/web/Cargo.toml
index d5a987b0..473bde17 100644
--- a/web/Cargo.toml
+++ b/web/Cargo.toml
@@ -17,8 +17,7 @@ maintenance = { status = "actively-developed" }
 [dependencies]
 iced_core = { version = "0.1.0-alpha", path = "../core" }
 dodrio = "0.1.0"
-futures-preview = "=0.3.0-alpha.18"
-wasm-bindgen = "0.2.50"
+wasm-bindgen = "0.2.51"
 
 [dependencies.web-sys]
 version = "0.3.27"
diff --git a/web/src/lib.rs b/web/src/lib.rs
index 04848d07..559a5af0 100644
--- a/web/src/lib.rs
+++ b/web/src/lib.rs
@@ -1,5 +1,4 @@
 use dodrio::bumpalo;
-use futures::Future;
 use std::cell::RefCell;
 
 mod bus;
@@ -8,16 +7,13 @@ pub mod widget;
 
 pub use bus::Bus;
 pub use element::Element;
-pub use iced_core::{Align, Color, Justify, Length};
+pub use iced_core::{Align, Background, Color, Justify, Length};
 pub use widget::*;
 
 pub trait Application {
     type Message;
 
-    fn update(
-        &mut self,
-        message: Self::Message,
-    ) -> Option<Box<dyn Future<Output = Self::Message>>>;
+    fn update(&mut self, message: Self::Message);
 
     fn view(&mut self) -> Element<Self::Message>;
 
@@ -48,10 +44,7 @@ impl<Message> Instance<Message> {
     }
 
     fn update(&mut self, message: Message) {
-        let mut ui = self.ui.borrow_mut();
-
-        // TODO: Resolve futures and publish resulting messages
-        let _ = ui.update(message);
+        self.ui.borrow_mut().update(message);
     }
 }
 
-- 
cgit