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}