1use crate::{
2 platform::{MouseButtonEvent, MouseMovedEvent, ScrollWheelEvent},
3 scene::mouse_region::HandlerKey,
4};
5use pathfinder_geometry::{rect::RectF, vector::Vector2F};
6use std::{
7 mem::{discriminant, Discriminant},
8 ops::Deref,
9};
10
11#[derive(Debug, Default, Clone)]
12pub struct MouseMove {
13 pub region: RectF,
14 pub platform_event: MouseMovedEvent,
15}
16
17impl Deref for MouseMove {
18 type Target = MouseMovedEvent;
19
20 fn deref(&self) -> &Self::Target {
21 &self.platform_event
22 }
23}
24
25#[derive(Debug, Default, Clone)]
26pub struct MouseMoveOut {
27 pub region: RectF,
28}
29
30#[derive(Debug, Default, Clone)]
31pub struct MouseDrag {
32 pub region: RectF,
33 pub prev_mouse_position: Vector2F,
34 pub platform_event: MouseMovedEvent,
35 pub end: bool,
36}
37
38impl Deref for MouseDrag {
39 type Target = MouseMovedEvent;
40
41 fn deref(&self) -> &Self::Target {
42 &self.platform_event
43 }
44}
45
46#[derive(Debug, Default, Clone)]
47pub struct MouseHover {
48 pub region: RectF,
49 pub started: bool,
50 pub platform_event: MouseMovedEvent,
51}
52
53impl Deref for MouseHover {
54 type Target = MouseMovedEvent;
55
56 fn deref(&self) -> &Self::Target {
57 &self.platform_event
58 }
59}
60
61#[derive(Debug, Default, Clone)]
62pub struct MouseDown {
63 pub region: RectF,
64 pub platform_event: MouseButtonEvent,
65}
66
67impl Deref for MouseDown {
68 type Target = MouseButtonEvent;
69
70 fn deref(&self) -> &Self::Target {
71 &self.platform_event
72 }
73}
74
75#[derive(Debug, Default, Clone)]
76pub struct MouseUp {
77 pub region: RectF,
78 pub platform_event: MouseButtonEvent,
79}
80
81impl Deref for MouseUp {
82 type Target = MouseButtonEvent;
83
84 fn deref(&self) -> &Self::Target {
85 &self.platform_event
86 }
87}
88
89#[derive(Debug, Default, Clone)]
90pub struct MouseClick {
91 pub region: RectF,
92 pub platform_event: MouseButtonEvent,
93}
94
95impl Deref for MouseClick {
96 type Target = MouseButtonEvent;
97
98 fn deref(&self) -> &Self::Target {
99 &self.platform_event
100 }
101}
102
103#[derive(Debug, Default, Clone)]
104pub struct MouseClickOut {
105 pub region: RectF,
106 pub platform_event: MouseButtonEvent,
107}
108
109impl Deref for MouseClickOut {
110 type Target = MouseButtonEvent;
111
112 fn deref(&self) -> &Self::Target {
113 &self.platform_event
114 }
115}
116
117#[derive(Debug, Default, Clone)]
118pub struct MouseDownOut {
119 pub region: RectF,
120 pub platform_event: MouseButtonEvent,
121}
122
123impl Deref for MouseDownOut {
124 type Target = MouseButtonEvent;
125
126 fn deref(&self) -> &Self::Target {
127 &self.platform_event
128 }
129}
130
131#[derive(Debug, Default, Clone)]
132pub struct MouseUpOut {
133 pub region: RectF,
134 pub platform_event: MouseButtonEvent,
135}
136
137impl Deref for MouseUpOut {
138 type Target = MouseButtonEvent;
139
140 fn deref(&self) -> &Self::Target {
141 &self.platform_event
142 }
143}
144
145#[derive(Debug, Default, Clone)]
146pub struct MouseScrollWheel {
147 pub region: RectF,
148 pub platform_event: ScrollWheelEvent,
149}
150
151impl Deref for MouseScrollWheel {
152 type Target = ScrollWheelEvent;
153
154 fn deref(&self) -> &Self::Target {
155 &self.platform_event
156 }
157}
158
159#[derive(Debug, Clone)]
160pub enum MouseEvent {
161 Move(MouseMove),
162 MoveOut(MouseMoveOut),
163 Drag(MouseDrag),
164 Hover(MouseHover),
165 Down(MouseDown),
166 Up(MouseUp),
167 Click(MouseClick),
168 ClickOut(MouseClickOut),
169 DownOut(MouseDownOut),
170 UpOut(MouseUpOut),
171 ScrollWheel(MouseScrollWheel),
172}
173
174impl MouseEvent {
175 pub fn set_region(&mut self, region: RectF) {
176 match self {
177 MouseEvent::Move(r) => r.region = region,
178 MouseEvent::MoveOut(r) => r.region = region,
179 MouseEvent::Drag(r) => r.region = region,
180 MouseEvent::Hover(r) => r.region = region,
181 MouseEvent::Down(r) => r.region = region,
182 MouseEvent::Up(r) => r.region = region,
183 MouseEvent::Click(r) => r.region = region,
184 MouseEvent::ClickOut(r) => r.region = region,
185 MouseEvent::DownOut(r) => r.region = region,
186 MouseEvent::UpOut(r) => r.region = region,
187 MouseEvent::ScrollWheel(r) => r.region = region,
188 }
189 }
190
191 /// When true, mouse event handlers must call cx.propagate_event() to bubble
192 /// the event to handlers they are painted on top of.
193 pub fn is_capturable(&self) -> bool {
194 match self {
195 MouseEvent::Move(_) => true,
196 MouseEvent::MoveOut(_) => false,
197 MouseEvent::Drag(_) => true,
198 MouseEvent::Hover(_) => false,
199 MouseEvent::Down(_) => true,
200 MouseEvent::Up(_) => true,
201 MouseEvent::Click(_) => true,
202 MouseEvent::ClickOut(_) => true,
203 MouseEvent::DownOut(_) => false,
204 MouseEvent::UpOut(_) => false,
205 MouseEvent::ScrollWheel(_) => true,
206 }
207 }
208}
209
210impl MouseEvent {
211 pub fn move_disc() -> Discriminant<MouseEvent> {
212 discriminant(&MouseEvent::Move(Default::default()))
213 }
214
215 pub fn move_out_disc() -> Discriminant<MouseEvent> {
216 discriminant(&MouseEvent::MoveOut(Default::default()))
217 }
218
219 pub fn drag_disc() -> Discriminant<MouseEvent> {
220 discriminant(&MouseEvent::Drag(Default::default()))
221 }
222
223 pub fn hover_disc() -> Discriminant<MouseEvent> {
224 discriminant(&MouseEvent::Hover(Default::default()))
225 }
226
227 pub fn down_disc() -> Discriminant<MouseEvent> {
228 discriminant(&MouseEvent::Down(Default::default()))
229 }
230
231 pub fn up_disc() -> Discriminant<MouseEvent> {
232 discriminant(&MouseEvent::Up(Default::default()))
233 }
234
235 pub fn up_out_disc() -> Discriminant<MouseEvent> {
236 discriminant(&MouseEvent::UpOut(Default::default()))
237 }
238
239 pub fn click_disc() -> Discriminant<MouseEvent> {
240 discriminant(&MouseEvent::Click(Default::default()))
241 }
242
243 pub fn click_out_disc() -> Discriminant<MouseEvent> {
244 discriminant(&MouseEvent::ClickOut(Default::default()))
245 }
246
247 pub fn down_out_disc() -> Discriminant<MouseEvent> {
248 discriminant(&MouseEvent::DownOut(Default::default()))
249 }
250
251 pub fn scroll_wheel_disc() -> Discriminant<MouseEvent> {
252 discriminant(&MouseEvent::ScrollWheel(Default::default()))
253 }
254
255 pub fn handler_key(&self) -> HandlerKey {
256 match self {
257 MouseEvent::Move(_) => HandlerKey::new(Self::move_disc(), None),
258 MouseEvent::MoveOut(_) => HandlerKey::new(Self::move_out_disc(), None),
259 MouseEvent::Drag(e) => HandlerKey::new(Self::drag_disc(), e.pressed_button),
260 MouseEvent::Hover(_) => HandlerKey::new(Self::hover_disc(), None),
261 MouseEvent::Down(e) => HandlerKey::new(Self::down_disc(), Some(e.button)),
262 MouseEvent::Up(e) => HandlerKey::new(Self::up_disc(), Some(e.button)),
263 MouseEvent::Click(e) => HandlerKey::new(Self::click_disc(), Some(e.button)),
264 MouseEvent::ClickOut(e) => HandlerKey::new(Self::click_out_disc(), Some(e.button)),
265 MouseEvent::UpOut(e) => HandlerKey::new(Self::up_out_disc(), Some(e.button)),
266 MouseEvent::DownOut(e) => HandlerKey::new(Self::down_out_disc(), Some(e.button)),
267 MouseEvent::ScrollWheel(_) => HandlerKey::new(Self::scroll_wheel_disc(), None),
268 }
269 }
270}