micro_gui/core/
window.rs

1//! Window implements the top level GUI abstraction.
2//! Windows can create and consume events, and contain a base layer from which windows can be implemented.
3//!
4//! Copyright 2017 Ryan Kurte
5
6use std::*;
7
8
9use crate::types::*;
10
11use super::buffer::Buff;
12use super::layer::Layer;
13
14use crate::graphics::{Graphics, Renderable};
15
16/// Window object contains renderable layers and handles events
17pub 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
24/// OnLoad trait called when a window is loaded
25pub trait OnLoad {
26    fn on_load(&mut self);
27}
28
29/// OnUnload trait called when a window is unloaded
30pub trait OnUnload {
31    fn on_unload(&mut self);
32}
33
34/// OnEvent trait called to receive an event
35pub trait OnEvent {
36    fn on_event(&mut self, e: &Event);
37}
38
39impl <'a, Pixel>Window<'a, Pixel> {
40    /// Create a new window for rendering
41    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    /// Bind optional load, unload, and event handlers.
48    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    /// Render the layer
55    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