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