charm_ui/
app.rs

1use super::{CharmResult, Color, Window};
2
3use sdl2::event::Event;
4use sdl2::keyboard::Keycode;
5
6pub struct App<Store = ()> {
7    store: Store,
8    windows: Vec<Window<Store>>,
9}
10
11impl App<()> {
12    pub fn new() -> Self {
13        Self {
14            store: (),
15            windows: Vec::new(),
16        }
17    }
18}
19
20impl<Store> App<Store> {
21    pub fn with_store(store: Store) -> Self {
22        Self {
23            store,
24            windows: Vec::new(),
25        }
26    }
27
28    pub fn add_window(&mut self, window: Window<Store>) -> &mut Self {
29        self.windows.push(window);
30
31        self
32    }
33
34    pub fn run(self) -> CharmResult<()> {
35        let sdl_context = sdl2::init().unwrap();
36        let video_subsystem = sdl_context.video().unwrap();
37
38        let mut windows = Vec::new();
39
40        for window in self.windows {
41            let sdl_window = video_subsystem
42                .window(
43                    window.title.as_ref().unwrap_or(&String::new()),
44                    window.size.0 as u32,
45                    window.size.1 as u32,
46                )
47                .position_centered()
48                .build()
49                .unwrap();
50
51            let canvas = sdl_window.into_canvas().build().unwrap();
52
53            windows.push((window, canvas));
54        }
55
56        let mut event_pump = sdl_context.event_pump().unwrap();
57
58        'running: loop {
59            for event in event_pump.poll_iter() {
60                match event {
61                    Event::Quit { .. }
62                    | Event::KeyDown {
63                        keycode: Some(Keycode::Escape),
64                        ..
65                    } => {
66                        break 'running;
67                    }
68                    _ => {}
69                }
70            }
71
72            for (window, ref mut canvas) in &mut windows {
73                canvas.set_draw_color(window.background.unwrap_or(Color::from((0, 0, 0))));
74                canvas.clear();
75
76                window.render(canvas, &self.store)?;
77
78                canvas.present();
79            }
80        }
81
82        Ok(())
83    }
84}