1use std::*;
7
8
9use crate::types::*;
10
11use super::buffer::Buff;
12use super::layer::Layer;
13
14use crate::graphics::{Graphics, Renderable};
15
16pub struct Window<'a, Pixel> {
18 base: Layer<'a, Pixel>,
19 on_load: Option<&'a mut (OnLoad + 'a)>,
20 on_unload: Option<&'a mut (OnUnload + 'a)>,
21 on_event: Option<&'a mut (OnEvent + 'a)>
22}
23
24pub trait OnLoad {
26 fn on_load(&mut self);
27}
28
29pub trait OnUnload {
31 fn on_unload(&mut self);
32}
33
34pub trait OnEvent {
36 fn on_event(&mut self, e: &Event);
37}
38
39impl <'a, Pixel>Window<'a, Pixel> {
40 pub fn new(w: usize, h: usize, renderer: Option<&'a mut (Renderable<Pixel> + 'a)>) -> Self {
42 let bounds = Rect::new(0, 0, w, h);
43 let base = Layer::new(bounds, renderer);
44 return Window{base: base, on_load: None, on_event: None, on_unload: None}
45 }
46
47 pub fn bind_handlers(&mut self, on_load: Option<&'a mut OnLoad>, on_unload: Option<&'a mut OnUnload>, on_event: Option<&'a mut OnEvent>) {
49 self.on_load = on_load;
50 self.on_unload = on_unload;
51 self.on_event = on_event;
52 }
53
54 pub fn render(&mut self, graphics: &mut Graphics<Pixel>, buffer: &mut Buff<Pixel>) {
56 self.base.render(graphics, buffer);
57 }
58}
59
60impl <'a, Pixel>OnLoad for Window<'a, Pixel> {
61 fn on_load(&mut self) {
62 match self.on_load {
63 Some(ref mut h) => h.on_load(),
64 None => ()
65 }
66 }
67}
68
69impl <'a, Pixel>OnUnload for Window<'a, Pixel> {
70 fn on_unload(&mut self) {
71 match self.on_unload {
72 Some(ref mut h) => h.on_unload(),
73 None => ()
74 }
75 }
76}
77
78impl <'a, Pixel>OnEvent for Window<'a, Pixel> {
79 fn on_event(&mut self, e: &events::Event) {
80 match self.on_event {
81 Some(ref mut h) => h.on_event(e),
82 None => ()
83 }
84 }
85}
86