1 use {Event, Input}; 2 3 /// Close arguments. 4 #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Deserialize, Serialize, Hash)] 5 pub struct CloseArgs; 6 7 /// Window is closing. 8 pub trait CloseEvent: Sized { 9 /// Creates a close event from arguments. 10 /// 11 /// Preserves time stamp from original input event, if any. from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self>12 fn from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self>; 13 /// Calls closure if this is a close event. close<U, F>(&self, f: F) -> Option<U> where F: FnMut(&CloseArgs) -> U14 fn close<U, F>(&self, f: F) -> Option<U> where F: FnMut(&CloseArgs) -> U; 15 /// Returns close arguments. close_args(&self) -> Option<CloseArgs>16 fn close_args(&self) -> Option<CloseArgs> { 17 self.close(|args| args.clone()) 18 } 19 } 20 21 impl CloseEvent for Event { from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self>22 fn from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self> { 23 let timestamp = if let Event::Input(_, x) = old_event {*x} else {None}; 24 Some(Event::Input(Input::Close(*args), timestamp)) 25 } 26 close<U, F>(&self, mut f: F) -> Option<U> where F: FnMut(&CloseArgs) -> U27 fn close<U, F>(&self, mut f: F) -> Option<U> 28 where F: FnMut(&CloseArgs) -> U 29 { 30 match *self { 31 Event::Input(Input::Close(ref args), _) => Some(f(args)), 32 _ => None, 33 } 34 } 35 } 36 37 #[cfg(test)] 38 mod tests { 39 use super::*; 40 41 #[test] test_input_close()42 fn test_input_close() { 43 use CloseArgs; 44 use Event; 45 46 let e: Event = CloseArgs.into(); 47 let x: Option<Event> = CloseEvent::from_close_args(&CloseArgs, &e); 48 let y: Option<Event> = x.clone() 49 .unwrap() 50 .close(|args| CloseEvent::from_close_args(args, x.as_ref().unwrap())) 51 .unwrap(); 52 assert_eq!(x, y); 53 } 54 } 55