furnace/
component.rs

1use crate::{dispatcher::Handle, model::Update};
2
3pub trait RenderContext {
4    type Widget;
5    type Queue: RenderQueue;
6
7    fn show(&mut self, widget: Self::Widget);
8    fn main_loop<'a>(&'a mut self, f: impl FnMut(&Self) -> () + 'a);
9    fn queue(&mut self) -> Self::Queue;
10    fn quit(&self);
11}
12
13pub trait RenderQueue: Send + Sync + 'static {
14    fn execute(&self, f: Box<dyn FnOnce()>);
15}
16
17/// Building block of user interface.
18pub trait Component {
19    type Renderer: RenderContext;
20    type Model: Update;
21
22    fn root(&self) -> <Self::Renderer as RenderContext>::Widget;
23    fn view(ui: &Self::Renderer, handle: Handle<<Self::Model as Update>::Action>, model: &Self::Model) -> Self;
24    #[allow(unused_variables)]
25    fn update(&mut self, ui: &Self::Renderer, model: &Self::Model) {}
26}