vtui_core/
component.rs

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 {}