1use crate::{point, Keystroke, Modifiers, Pixels, Point};
2use std::{any::Any, ops::Deref};
3
4#[derive(Clone, Debug, Eq, PartialEq)]
5pub struct KeyDownEvent {
6 pub keystroke: Keystroke,
7 pub is_held: bool,
8}
9
10#[derive(Clone, Debug)]
11pub struct KeyUpEvent {
12 pub keystroke: Keystroke,
13}
14
15#[derive(Clone, Debug, Default)]
16pub struct ModifiersChangedEvent {
17 pub modifiers: Modifiers,
18}
19
20impl Deref for ModifiersChangedEvent {
21 type Target = Modifiers;
22
23 fn deref(&self) -> &Self::Target {
24 &self.modifiers
25 }
26}
27
28/// The phase of a touch motion event.
29/// Based on the winit enum of the same name,
30#[derive(Clone, Copy, Debug)]
31pub enum TouchPhase {
32 Started,
33 Moved,
34 Ended,
35}
36
37#[derive(Clone, Copy, Debug)]
38pub enum ScrollDelta {
39 Pixels(Point<Pixels>),
40 Lines(Point<f32>),
41}
42
43impl Default for ScrollDelta {
44 fn default() -> Self {
45 Self::Lines(Default::default())
46 }
47}
48
49impl ScrollDelta {
50 pub fn precise(&self) -> bool {
51 match self {
52 ScrollDelta::Pixels(_) => true,
53 ScrollDelta::Lines(_) => false,
54 }
55 }
56
57 pub fn pixel_delta(&self, line_height: Pixels) -> Point<Pixels> {
58 match self {
59 ScrollDelta::Pixels(delta) => *delta,
60 ScrollDelta::Lines(delta) => point(line_height * delta.x, line_height * delta.y),
61 }
62 }
63}
64
65#[derive(Clone, Debug, Default)]
66pub struct ScrollWheelEvent {
67 pub position: Point<Pixels>,
68 pub delta: ScrollDelta,
69 pub modifiers: Modifiers,
70 /// If the platform supports returning the phase of a scroll wheel event, it will be stored here
71 pub phase: Option<TouchPhase>,
72}
73
74impl Deref for ScrollWheelEvent {
75 type Target = Modifiers;
76
77 fn deref(&self) -> &Self::Target {
78 &self.modifiers
79 }
80}
81
82#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
83pub enum NavigationDirection {
84 Back,
85 Forward,
86}
87
88impl Default for NavigationDirection {
89 fn default() -> Self {
90 Self::Back
91 }
92}
93
94#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
95pub enum MouseButton {
96 Left,
97 Right,
98 Middle,
99 Navigate(NavigationDirection),
100}
101
102impl MouseButton {
103 pub fn all() -> Vec<Self> {
104 vec![
105 MouseButton::Left,
106 MouseButton::Right,
107 MouseButton::Middle,
108 MouseButton::Navigate(NavigationDirection::Back),
109 MouseButton::Navigate(NavigationDirection::Forward),
110 ]
111 }
112}
113
114impl Default for MouseButton {
115 fn default() -> Self {
116 Self::Left
117 }
118}
119
120#[derive(Clone, Debug, Default)]
121pub struct MouseDownEvent {
122 pub button: MouseButton,
123 pub position: Point<Pixels>,
124 pub modifiers: Modifiers,
125 pub click_count: usize,
126}
127
128#[derive(Clone, Debug, Default)]
129pub struct MouseUpEvent {
130 pub button: MouseButton,
131 pub position: Point<Pixels>,
132 pub modifiers: Modifiers,
133 pub click_count: usize,
134}
135
136#[derive(Clone, Debug, Default)]
137pub struct MouseUp {
138 pub button: MouseButton,
139 pub position: Point<Pixels>,
140 pub modifiers: Modifiers,
141 pub click_count: usize,
142}
143
144#[derive(Clone, Debug, Default)]
145pub struct MouseMovedEvent {
146 pub position: Point<Pixels>,
147 pub pressed_button: Option<MouseButton>,
148 pub modifiers: Modifiers,
149}
150
151#[derive(Clone, Debug, Default)]
152pub struct MouseExitedEvent {
153 pub position: Point<Pixels>,
154 pub pressed_button: Option<MouseButton>,
155 pub modifiers: Modifiers,
156}
157
158impl Deref for MouseExitedEvent {
159 type Target = Modifiers;
160
161 fn deref(&self) -> &Self::Target {
162 &self.modifiers
163 }
164}
165
166#[derive(Clone, Debug)]
167pub enum Event {
168 KeyDown(KeyDownEvent),
169 KeyUp(KeyUpEvent),
170 ModifiersChanged(ModifiersChangedEvent),
171 MouseDown(MouseDownEvent),
172 MouseUp(MouseUpEvent),
173 MouseMoved(MouseMovedEvent),
174 MouseExited(MouseExitedEvent),
175 ScrollWheel(ScrollWheelEvent),
176}
177
178impl Event {
179 pub fn position(&self) -> Option<Point<Pixels>> {
180 match self {
181 Event::KeyDown { .. } => None,
182 Event::KeyUp { .. } => None,
183 Event::ModifiersChanged { .. } => None,
184 Event::MouseDown(event) => Some(event.position),
185 Event::MouseUp(event) => Some(event.position),
186 Event::MouseMoved(event) => Some(event.position),
187 Event::MouseExited(event) => Some(event.position),
188 Event::ScrollWheel(event) => Some(event.position),
189 }
190 }
191
192 pub fn mouse_event<'a>(&'a self) -> Option<&'a dyn Any> {
193 match self {
194 Event::KeyDown { .. } => None,
195 Event::KeyUp { .. } => None,
196 Event::ModifiersChanged { .. } => None,
197 Event::MouseDown(event) => Some(event),
198 Event::MouseUp(event) => Some(event),
199 Event::MouseMoved(event) => Some(event),
200 Event::MouseExited(event) => Some(event),
201 Event::ScrollWheel(event) => Some(event),
202 }
203 }
204}