1use crate::{geometry::vector::Vector2F, keymap::Keystroke};
2
3#[derive(Clone, Debug)]
4pub struct KeyDownEvent {
5 pub keystroke: Keystroke,
6 pub is_held: bool,
7}
8
9#[derive(Clone, Debug)]
10pub struct KeyUpEvent {
11 pub keystroke: Keystroke,
12}
13
14#[derive(Clone, Copy, Debug)]
15pub struct ModifiersChangedEvent {
16 pub ctrl: bool,
17 pub alt: bool,
18 pub shift: bool,
19 pub cmd: bool,
20}
21
22#[derive(Clone, Copy, Debug, Default)]
23pub struct ScrollWheelEvent {
24 pub position: Vector2F,
25 pub delta: Vector2F,
26 pub precise: bool,
27 pub ctrl: bool,
28 pub alt: bool,
29 pub shift: bool,
30 pub cmd: bool,
31}
32
33#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
34pub enum NavigationDirection {
35 Back,
36 Forward,
37}
38
39impl Default for NavigationDirection {
40 fn default() -> Self {
41 Self::Back
42 }
43}
44
45#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
46pub enum MouseButton {
47 Left,
48 Right,
49 Middle,
50 Navigate(NavigationDirection),
51}
52
53impl MouseButton {
54 pub fn all() -> Vec<Self> {
55 vec![
56 MouseButton::Left,
57 MouseButton::Right,
58 MouseButton::Middle,
59 MouseButton::Navigate(NavigationDirection::Back),
60 MouseButton::Navigate(NavigationDirection::Forward),
61 ]
62 }
63}
64
65impl Default for MouseButton {
66 fn default() -> Self {
67 Self::Left
68 }
69}
70
71#[derive(Clone, Copy, Debug, Default)]
72pub struct MouseButtonEvent {
73 pub button: MouseButton,
74 pub position: Vector2F,
75 pub ctrl: bool,
76 pub alt: bool,
77 pub shift: bool,
78 pub cmd: bool,
79 pub click_count: usize,
80}
81
82#[derive(Clone, Copy, Debug, Default)]
83pub struct MouseMovedEvent {
84 pub position: Vector2F,
85 pub pressed_button: Option<MouseButton>,
86 pub ctrl: bool,
87 pub cmd: bool,
88 pub alt: bool,
89 pub shift: bool,
90}
91
92impl MouseMovedEvent {
93 pub fn to_button_event(&self, button: MouseButton) -> MouseButtonEvent {
94 MouseButtonEvent {
95 position: self.position,
96 button: self.pressed_button.unwrap_or(button),
97 ctrl: self.ctrl,
98 alt: self.alt,
99 shift: self.shift,
100 cmd: self.cmd,
101 click_count: 0,
102 }
103 }
104}
105
106#[derive(Clone, Debug)]
107pub enum Event {
108 KeyDown(KeyDownEvent),
109 KeyUp(KeyUpEvent),
110 ModifiersChanged(ModifiersChangedEvent),
111 MouseDown(MouseButtonEvent),
112 MouseUp(MouseButtonEvent),
113 MouseMoved(MouseMovedEvent),
114 ScrollWheel(ScrollWheelEvent),
115}
116
117impl Event {
118 pub fn position(&self) -> Option<Vector2F> {
119 match self {
120 Event::KeyDown { .. } => None,
121 Event::KeyUp { .. } => None,
122 Event::ModifiersChanged { .. } => None,
123 Event::MouseDown(event) | Event::MouseUp(event) => Some(event.position),
124 Event::MouseMoved(event) => Some(event.position),
125 Event::ScrollWheel(event) => Some(event.position),
126 }
127 }
128}