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}