Skip to main content

pixelab_rs/
lib.rs

1use pixelab_core::{
2    Bitmap, Color, DisplayDevice, Event, EventReader, Handler, PixelabError, Widget,
3};
4
5pub struct Screen {
6    pub display_device: Box<dyn DisplayDevice>,
7    pub bitmap: Box<dyn Bitmap>,
8    pub widgets: Vec<Box<dyn Widget>>,
9    pub event: EventReader,
10    pub background_color: Color,
11}
12
13impl Screen {
14    pub fn new(mut display_device: Box<dyn DisplayDevice>) -> Self {
15        let bitmap = display_device.create_bitmap();
16        Self {
17            display_device,
18            bitmap,
19            widgets: vec![],
20            event: EventReader::new(),
21            background_color: Color::black(),
22        }
23    }
24
25    pub fn draw(&mut self) -> Result<(), PixelabError> {
26        self.bitmap.fill(self.background_color)?;
27        for widget in self.widgets.iter_mut() {
28            if widget.backend().visible {
29                widget.draw(&mut self.bitmap);
30                match widget.backend().overlay(&mut self.bitmap) {
31                    Ok(_) => {}
32                    Err(e) => match e {
33                        PixelabError::BitmapOutOfBounds {
34                            point,
35                            main_bound,
36                            sub_bound,
37                        } => {
38                            return Err(PixelabError::BitmapOutOfBounds {
39                                point,
40                                main_bound,
41                                sub_bound,
42                            })
43                        }
44                        PixelabError::BitmapFormatMismatch => {
45                            return Err(PixelabError::BitmapFormatMismatch)
46                        }
47                        _ => {}
48                    },
49                };
50            }
51        }
52        self.display_device.write(&mut self.bitmap)?;
53        Ok(())
54    }
55
56    pub fn add(&mut self, mut widget: impl Widget + 'static) {
57        widget.backend().bitmap_type = Some(self.bitmap.create(widget.backend().area));
58        widget.init();
59        self.widgets.push(Box::new(widget));
60    }
61    pub fn send_event(&mut self, event: Event, handler: &mut Handler) {
62        for widget in self.widgets.iter_mut() {
63            widget.event(event.clone(), handler);
64        }
65    }
66
67    pub fn run<F>(&mut self, mut closure: F) -> Result<(), PixelabError>
68    where
69        F: FnMut(&mut Self, Event, &mut Handler),
70    {
71        self.draw()?;
72        let mut handler = Handler::new();
73        loop {
74            self.event.read_all()?;
75            match self.event.get() {
76                Ok(event) => {
77                    self.send_event(event.clone(), &mut handler);
78                    closure(self, event.clone(), &mut handler);
79                    for message in handler.messages.clone() {
80                        self.event.send(Event::Message(message));
81                    }
82                    if handler.need_update {
83                        self.draw()?;
84                    }
85                    handler.empty();
86                }
87                Err(_) => {}
88            };
89        }
90    }
91}