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}