1 use viewport::Viewport;
2 
3 use {Event, Input};
4 
5 /// Resize arguments.
6 #[derive(Copy, Clone, PartialEq, PartialOrd, Debug, Deserialize, Serialize)]
7 pub 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 
14 impl ResizeArgs {
15     /// Returns viewport information filling entire render area.
viewport(&self) -> Viewport16     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.
26 pub trait ResizeEvent: Sized {
27     /// Creates a resize event.
28     ///
29     /// Preserves time stamp from original input event, if any.
from_resize_args(args: &ResizeArgs, old_event: &Self) -> Option<Self>30     fn from_resize_args(args: &ResizeArgs, old_event: &Self) -> Option<Self>;
31     /// Calls closure if this is a resize event.
resize<U, F>(&self, f: F) -> Option<U> where F: FnMut(&ResizeArgs) -> U32     fn resize<U, F>(&self, f: F) -> Option<U> where F: FnMut(&ResizeArgs) -> U;
33     /// Returns resize arguments.
resize_args(&self) -> Option<ResizeArgs>34     fn resize_args(&self) -> Option<ResizeArgs> {
35         self.resize(|args| args.clone())
36     }
37 }
38 
39 impl ResizeEvent for Event {
from_resize_args(args: &ResizeArgs, old_event: &Self) -> Option<Self>40     fn from_resize_args(args: &ResizeArgs, old_event: &Self) -> Option<Self> {
41         let timestamp = if let Event::Input(_, x) = old_event {*x} else {None};
42         Some(Event::Input(Input::Resize(*args), timestamp))
43     }
44 
resize<U, F>(&self, mut f: F) -> Option<U> where F: FnMut(&ResizeArgs) -> U45     fn resize<U, F>(&self, mut f: F) -> Option<U>
46         where F: FnMut(&ResizeArgs) -> U
47     {
48         match *self {
49             Event::Input(Input::Resize(ref args), _) => Some(f(args)),
50             _ => None,
51         }
52     }
53 }
54 
55 #[cfg(test)]
56 mod tests {
57     use super::*;
58 
59     #[test]
test_input_resize()60     fn test_input_resize() {
61         use super::super::Input;
62 
63         let args = ResizeArgs {
64             window_size: [100.0, 100.0], draw_size: [100, 100],
65         };
66         let e: Event = Input::Resize(args).into();
67         let x: Option<Event> = ResizeEvent::from_resize_args(&args, &e);
68         let y: Option<Event> = x.clone()
69             .unwrap()
70             .resize(|args| ResizeEvent::from_resize_args(args, x.as_ref().unwrap()))
71             .unwrap();
72         assert_eq!(x, y);
73     }
74 }
75