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