summaryrefslogtreecommitdiffstats
path: root/web/src/lib.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2019-09-24 15:39:33 +0200
committerLibravatar GitHub <noreply@github.com>2019-09-24 15:39:33 +0200
commit68c4752e998dca1d618380ce4e7d8ac52b710056 (patch)
tree35e386030b072c189509bb2ed3adeaec5b0fd4d1 /web/src/lib.rs
parentbb5cac49d028eb53c259ae58e3a007ebfb736fd4 (diff)
parent05c7c39ecb8910c75b82dc4052a7720fb2d42b4a (diff)
downloadiced-68c4752e998dca1d618380ce4e7d8ac52b710056.tar.gz
iced-68c4752e998dca1d618380ce4e7d8ac52b710056.tar.bz2
iced-68c4752e998dca1d618380ce4e7d8ac52b710056.zip
Merge pull request #17 from hecrj/web
Basic web support (core, native, and web crates)
Diffstat (limited to 'web/src/lib.rs')
-rw-r--r--web/src/lib.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/web/src/lib.rs b/web/src/lib.rs
new file mode 100644
index 00000000..caf17df5
--- /dev/null
+++ b/web/src/lib.rs
@@ -0,0 +1,74 @@
+use dodrio::bumpalo;
+use futures::Future;
+use std::cell::RefCell;
+
+mod bus;
+mod element;
+pub mod widget;
+
+pub use bus::Bus;
+pub use element::Element;
+pub use iced_core::{Align, Color, Justify, Length};
+pub use widget::*;
+
+pub trait UserInterface {
+ type Message;
+
+ fn update(
+ &mut self,
+ message: Self::Message,
+ ) -> Option<Box<dyn Future<Output = Self::Message>>>;
+
+ fn view(&mut self) -> Element<Self::Message>;
+
+ fn run(self)
+ where
+ Self: 'static + Sized,
+ {
+ let window = web_sys::window().unwrap();
+ let document = window.document().unwrap();
+ let body = document.body().unwrap();
+
+ let app = Application::new(self);
+
+ let vdom = dodrio::Vdom::new(&body, app);
+ vdom.forget();
+ }
+}
+
+struct Application<Message> {
+ ui: RefCell<Box<dyn UserInterface<Message = Message>>>,
+}
+
+impl<Message> Application<Message> {
+ fn new(ui: impl UserInterface<Message = Message> + 'static) -> Self {
+ Self {
+ ui: RefCell::new(Box::new(ui)),
+ }
+ }
+
+ fn update(&mut self, message: Message) {
+ let mut ui = self.ui.borrow_mut();
+
+ // TODO: Resolve futures and publish resulting messages
+ let _ = ui.update(message);
+ }
+}
+
+impl<Message> dodrio::Render for Application<Message>
+where
+ Message: 'static,
+{
+ fn render<'a, 'bump>(
+ &'a self,
+ bump: &'bump bumpalo::Bump,
+ ) -> dodrio::Node<'bump>
+ where
+ 'a: 'bump,
+ {
+ let mut ui = self.ui.borrow_mut();
+ let element = ui.view();
+
+ element.widget.node(bump, &Bus::new())
+ }
+}