vtui_core/
component.rs

1use crate::{
2    events::{Event, Message},
3    listeners::{DrawContext, DrawListener, ListenerStore, UpdateContext},
4};
5
6#[derive(Default)]
7pub struct Component {
8    draw_listener: Option<DrawListener>,
9    listeners: ListenerStore,
10}
11
12impl Component {
13    pub fn draw(&mut self, listener: impl Fn(&mut DrawContext) + 'static) {
14        self.draw_listener = Some(Box::new(listener));
15    }
16
17    pub fn listen<E: Event>(&mut self, listener: impl FnMut(&UpdateContext<E>) + 'static) {
18        self.listeners.push(Box::new(listener))
19    }
20
21    pub(crate) fn render(&self, ctx: &mut DrawContext) {
22        if let Some(ref draw_listener) = self.draw_listener {
23            draw_listener(ctx)
24        }
25    }
26
27    pub(crate) fn update(&mut self, msg: &Message) {
28        self.listeners.dispatch(msg)
29    }
30}