diff options
Diffstat (limited to 'web/src/lib.rs')
-rw-r--r-- | web/src/lib.rs | 74 |
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()) + } +} |