1use std::ops::Deref;
2
3use crate::{geometry::vector::Vector2F, keymap::Keystroke};
4
5#[derive(Clone, Debug)]
6pub struct KeyDownEvent {
7 pub keystroke: Keystroke,
8 pub is_held: bool,
9}
10
11#[derive(Clone, Debug)]
12pub struct KeyUpEvent {
13 pub keystroke: Keystroke,
14}
15
16#[derive(Clone, Copy, Debug, Default, PartialEq)]
17pub struct Modifiers {
18 pub ctrl: bool,
19 pub alt: bool,
20 pub shift: bool,
21 pub cmd: bool,
22 pub fun: bool,
23}
24
25#[derive(Clone, Copy, Debug, Default)]
26pub struct ModifiersChangedEvent {
27 pub modifiers: Modifiers,
28}
29
30impl Deref for ModifiersChangedEvent {
31 type Target = Modifiers;
32
33 fn deref(&self) -> &Self::Target {
34 &self.modifiers
35 }
36}
37
38/// The phase of a touch motion event.
39/// Based on the winit enum of the same name,
40#[derive(Clone, Copy, Debug)]
41pub enum TouchPhase {
42 Started,
43 Moved,
44 Ended,
45}
46
47#[derive(Clone, Copy, Debug, Default)]
48pub struct ScrollWheelEvent {
49 pub position: Vector2F,
50 pub delta: Vector2F,
51 pub precise: bool,
52 pub modifiers: Modifiers,
53 /// If the platform supports returning the phase of a scroll wheel event, it will be stored here
54 pub phase: Option<TouchPhase>,
55}
56
57impl Deref for ScrollWheelEvent {
58 type Target = Modifiers;
59
60 fn deref(&self) -> &Self::Target {
61 &self.modifiers
62 }
63}
64
65#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
66pub enum NavigationDirection {
67 Back,
68 Forward,
69}
70
71impl Default for NavigationDirection {
72 fn default() -> Self {
73 Self::Back
74 }
75}
76
77#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
78pub enum MouseButton {
79 Left,
80 Right,
81 Middle,
82 Navigate(NavigationDirection),
83}
84
85impl MouseButton {
86 pub fn all() -> Vec<Self> {
87 vec![
88 MouseButton::Left,
89 MouseButton::Right,
90 MouseButton::Middle,
91 MouseButton::Navigate(NavigationDirection::Back),
92 MouseButton::Navigate(NavigationDirection::Forward),
93 ]
94 }
95}
96
97impl Default for MouseButton {
98 fn default() -> Self {
99 Self::Left
100 }
101}
102
103#[derive(Clone, Copy, Debug, Default)]
104pub struct MouseButtonEvent {
105 pub button: MouseButton,
106 pub position: Vector2F,
107 pub modifiers: Modifiers,
108 pub click_count: usize,
109}
110
111impl Deref for MouseButtonEvent {
112 type Target = Modifiers;
113
114 fn deref(&self) -> &Self::Target {
115 &self.modifiers
116 }
117}
118
119#[derive(Clone, Copy, Debug, Default)]
120pub struct MouseMovedEvent {
121 pub position: Vector2F,
122 pub pressed_button: Option<MouseButton>,
123 pub modifiers: Modifiers,
124}
125
126impl Deref for MouseMovedEvent {
127 type Target = Modifiers;
128
129 fn deref(&self) -> &Self::Target {
130 &self.modifiers
131 }
132}
133
134impl MouseMovedEvent {
135 pub fn to_button_event(&self, button: MouseButton) -> MouseButtonEvent {
136 MouseButtonEvent {
137 position: self.position,
138 button: self.pressed_button.unwrap_or(button),
139 modifiers: self.modifiers,
140 click_count: 0,
141 }
142 }
143}
144
145#[derive(Clone, Debug)]
146pub enum Event {
147 KeyDown(KeyDownEvent),
148 KeyUp(KeyUpEvent),
149 ModifiersChanged(ModifiersChangedEvent),
150 MouseDown(MouseButtonEvent),
151 MouseUp(MouseButtonEvent),
152 MouseMoved(MouseMovedEvent),
153 ScrollWheel(ScrollWheelEvent),
154}
155
156impl Event {
157 pub fn position(&self) -> Option<Vector2F> {
158 match self {
159 Event::KeyDown { .. } => None,
160 Event::KeyUp { .. } => None,
161 Event::ModifiersChanged { .. } => None,
162 Event::MouseDown(event) | Event::MouseUp(event) => Some(event.position),
163 Event::MouseMoved(event) => Some(event.position),
164 Event::ScrollWheel(event) => Some(event.position),
165 }
166 }
167}