1use viewport::Viewport;
2
3use crate::{Event, Input};
4
5#[derive(Copy, Clone, PartialEq, PartialOrd, Debug, Deserialize, Serialize)]
7pub struct ResizeArgs {
8 pub window_size: [f64; 2],
10 pub draw_size: [u32; 2],
12}
13
14impl ResizeArgs {
15 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
25pub trait ResizeEvent: Sized {
27 fn from_resize_args(args: &ResizeArgs, old_event: &Self) -> Option<Self>;
31 fn resize<U, F>(&self, f: F) -> Option<U>
33 where
34 F: FnMut(&ResizeArgs) -> U;
35 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}