1use crate::{
2 canvas::Canvas,
3 context::{Context, EventContext},
4 events::{Event, Message},
5 listeners::{DrawListener, ListenerStore},
6 state::{State, StateOwner},
7};
8
9pub type FactoryFn = fn(&mut Component) -> Inner;
10
11#[derive(Default)]
12pub struct Component {
13 draw_listener: Option<DrawListener>,
14 listeners: ListenerStore,
15 state_arena: StateOwner,
16 inner: Inner,
17}
18
19impl Component {
20 fn set_inner(&mut self, inner: Inner) {
21 self.inner = inner;
22 }
23}
24
25impl Component {
26 pub fn with_factory(factory: FactoryFn) -> Self {
27 let mut component = Component::default();
28 let inner = factory(&mut component);
29 component.set_inner(inner);
30 component
31 }
32
33 pub fn draw(&mut self, listener: impl Fn(&mut Canvas) + 'static) {
34 self.draw_listener = Some(Box::new(listener));
35 }
36
37 pub fn listen<E: Event>(&mut self, listener: impl FnMut(&mut EventContext<E>) + 'static) {
38 self.listeners.push(Box::new(listener))
39 }
40
41 pub fn state<T: 'static>(&self, value: T) -> State<T> {
42 self.state_arena.insert(value)
43 }
44}
45
46impl Component {
47 pub(crate) fn render(&self, ctx: &mut Canvas) {
48 if let Some(ref draw_listener) = self.draw_listener {
49 draw_listener(ctx)
50 }
51 }
52
53 pub(crate) fn update(&mut self, msg: &Message, ctx: &mut Context) {
54 if let Some(listeners) = self.listeners.get_mut(msg) {
55 listeners.dispatch(msg, ctx);
56 }
57 }
58}
59
60#[derive(Default)]
61pub struct Inner {}