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, Debug, Default)]
38pub struct MouseDownEvent {
39 pub button: MouseButton,
40 pub position: Point<Pixels>,
41 pub modifiers: Modifiers,
42 pub click_count: usize,
43}
44
45#[derive(Clone, Debug, Default)]
46pub struct MouseUpEvent {
47 pub button: MouseButton,
48 pub position: Point<Pixels>,
49 pub modifiers: Modifiers,
50 pub click_count: usize,
51}
52
53#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
54pub enum MouseButton {
55 Left,
56 Right,
57 Middle,
58 Navigate(NavigationDirection),
59}
60
61impl MouseButton {
62 pub fn all() -> Vec<Self> {
63 vec![
64 MouseButton::Left,
65 MouseButton::Right,
66 MouseButton::Middle,
67 MouseButton::Navigate(NavigationDirection::Back),
68 MouseButton::Navigate(NavigationDirection::Forward),
69 ]
70 }
71}
72
73impl Default for MouseButton {
74 fn default() -> Self {
75 Self::Left
76 }
77}
78
79#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
80pub enum NavigationDirection {
81 Back,
82 Forward,
83}
84
85impl Default for NavigationDirection {
86 fn default() -> Self {
87 Self::Back
88 }
89}
90
91#[derive(Clone, Debug, Default)]
92pub struct MouseMoveEvent {
93 pub position: Point<Pixels>,
94 pub pressed_button: Option<MouseButton>,
95 pub modifiers: Modifiers,
96}
97
98#[derive(Clone, Debug)]
99pub struct ScrollWheelEvent {
100 pub position: Point<Pixels>,
101 pub delta: ScrollDelta,
102 pub modifiers: Modifiers,
103 pub touch_phase: TouchPhase,
104}
105
106impl Deref for ScrollWheelEvent {
107 type Target = Modifiers;
108
109 fn deref(&self) -> &Self::Target {
110 &self.modifiers
111 }
112}
113
114#[derive(Clone, Copy, Debug)]
115pub enum ScrollDelta {
116 Pixels(Point<Pixels>),
117 Lines(Point<f32>),
118}
119
120impl Default for ScrollDelta {
121 fn default() -> Self {
122 Self::Lines(Default::default())
123 }
124}
125
126impl ScrollDelta {
127 pub fn precise(&self) -> bool {
128 match self {
129 ScrollDelta::Pixels(_) => true,
130 ScrollDelta::Lines(_) => false,
131 }
132 }
133
134 pub fn pixel_delta(&self, line_height: Pixels) -> Point<Pixels> {
135 match self {
136 ScrollDelta::Pixels(delta) => *delta,
137 ScrollDelta::Lines(delta) => point(line_height * delta.x, line_height * delta.y),
138 }
139 }
140}
141
142#[derive(Clone, Debug, Default)]
143pub struct MouseExitEvent {
144 pub position: Point<Pixels>,
145 pub pressed_button: Option<MouseButton>,
146 pub modifiers: Modifiers,
147}
148
149impl Deref for MouseExitEvent {
150 type Target = Modifiers;
151
152 fn deref(&self) -> &Self::Target {
153 &self.modifiers
154 }
155}
156
157#[derive(Clone, Debug)]
158pub enum Event {
159 KeyDown(KeyDownEvent),
160 KeyUp(KeyUpEvent),
161 ModifiersChanged(ModifiersChangedEvent),
162 MouseDown(MouseDownEvent),
163 MouseUp(MouseUpEvent),
164 MouseMoved(MouseMoveEvent),
165 MouseExited(MouseExitEvent),
166 ScrollWheel(ScrollWheelEvent),
167}
168
169impl Event {
170 pub fn position(&self) -> Option<Point<Pixels>> {
171 match self {
172 Event::KeyDown { .. } => None,
173 Event::KeyUp { .. } => None,
174 Event::ModifiersChanged { .. } => None,
175 Event::MouseDown(event) => Some(event.position),
176 Event::MouseUp(event) => Some(event.position),
177 Event::MouseMoved(event) => Some(event.position),
178 Event::MouseExited(event) => Some(event.position),
179 Event::ScrollWheel(event) => Some(event.position),
180 }
181 }
182
183 pub fn mouse_event<'a>(&'a self) -> Option<&'a dyn Any> {
184 match self {
185 Event::KeyDown { .. } => None,
186 Event::KeyUp { .. } => None,
187 Event::ModifiersChanged { .. } => None,
188 Event::MouseDown(event) => Some(event),
189 Event::MouseUp(event) => Some(event),
190 Event::MouseMoved(event) => Some(event),
191 Event::MouseExited(event) => Some(event),
192 Event::ScrollWheel(event) => Some(event),
193 }
194 }
195}