input/
resize.rs

1use viewport::Viewport;
2
3use crate::{Event, Input};
4
5/// Resize arguments.
6#[derive(Copy, Clone, PartialEq, PartialOrd, Debug, Deserialize, Serialize)]
7pub struct ResizeArgs {
8    /// The width and height of rendered area in points.
9    pub window_size: [f64; 2],
10    /// The width of rendered area in pixels.
11    pub draw_size: [u32; 2],
12}
13
14impl ResizeArgs {
15    /// Returns viewport information filling entire render area.
16    pub fn viewport(&self) -> Viewport {
17        Viewport {
18            rect: [0, 0, self.draw_size[0] as i32, self.draw_size[1] as i32],
19            window_size: self.window_size,
20            draw_size: self.draw_size,
21        }
22    }
23}
24
25/// When the window is resized.
26pub trait ResizeEvent: Sized {
27    /// Creates a resize event.
28    ///
29    /// Preserves time stamp from original input event, if any.
30    fn from_resize_args(args: &ResizeArgs, old_event: &Self) -> Option<Self>;
31    /// Calls closure if this is a resize event.
32    fn resize<U, F>(&self, f: F) -> Option<U>
33    where
34        F: FnMut(&ResizeArgs) -> U;
35    /// Returns resize arguments.
36    fn resize_args(&self) -> Option<ResizeArgs> {
37        self.resize(|args| *args)
38    }
39}
40
41impl ResizeEvent for Event {
42    fn from_resize_args(args: &ResizeArgs, old_event: &Self) -> Option<Self> {
43        let timestamp = if let Event::Input(_, x) = old_event {
44            *x
45        } else {
46            None
47        };
48        Some(Event::Input(Input::Resize(*args), timestamp))
49    }
50
51    fn resize<U, F>(&self, mut f: F) -> Option<U>
52    where
53        F: FnMut(&ResizeArgs) -> U,
54    {
55        match *self {
56            Event::Input(Input::Resize(ref args), _) => Some(f(args)),
57            _ => None,
58        }
59    }
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65
66    #[test]
67    fn test_input_resize() {
68        use super::super::Input;
69
70        let args = ResizeArgs {
71            window_size: [100.0, 100.0],
72            draw_size: [100, 100],
73        };
74        let e: Event = Input::Resize(args).into();
75        let x: Option<Event> = ResizeEvent::from_resize_args(&args, &e);
76        let y: Option<Event> = x
77            .clone()
78            .unwrap()
79            .resize(|args| ResizeEvent::from_resize_args(args, x.as_ref().unwrap()))
80            .unwrap();
81        assert_eq!(x, y);
82    }
83}