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 MouseDownOut {
104 pub region: RectF,
105 pub platform_event: MouseButtonEvent,
106}
107
108impl Deref for MouseDownOut {
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 MouseUpOut {
118 pub region: RectF,
119 pub platform_event: MouseButtonEvent,
120}
121
122impl Deref for MouseUpOut {
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 MouseScrollWheel {
132 pub region: RectF,
133 pub platform_event: ScrollWheelEvent,
134}
135
136impl Deref for MouseScrollWheel {
137 type Target = ScrollWheelEvent;
138
139 fn deref(&self) -> &Self::Target {
140 &self.platform_event
141 }
142}
143
144#[derive(Debug, Clone)]
145pub enum MouseEvent {
146 Move(MouseMove),
147 MoveOut(MouseMoveOut),
148 Drag(MouseDrag),
149 Hover(MouseHover),
150 Down(MouseDown),
151 Up(MouseUp),
152 Click(MouseClick),
153 DownOut(MouseDownOut),
154 UpOut(MouseUpOut),
155 ScrollWheel(MouseScrollWheel),
156}
157
158impl MouseEvent {
159 pub fn set_region(&mut self, region: RectF) {
160 match self {
161 MouseEvent::Move(r) => r.region = region,
162 MouseEvent::MoveOut(r) => r.region = region,
163 MouseEvent::Drag(r) => r.region = region,
164 MouseEvent::Hover(r) => r.region = region,
165 MouseEvent::Down(r) => r.region = region,
166 MouseEvent::Up(r) => r.region = region,
167 MouseEvent::Click(r) => r.region = region,
168 MouseEvent::DownOut(r) => r.region = region,
169 MouseEvent::UpOut(r) => r.region = region,
170 MouseEvent::ScrollWheel(r) => r.region = region,
171 }
172 }
173
174 /// When true, mouse event handlers must call cx.propagate_event() to bubble
175 /// the event to handlers they are painted on top of.
176 pub fn is_capturable(&self) -> bool {
177 match self {
178 MouseEvent::Move(_) => true,
179 MouseEvent::MoveOut(_) => false,
180 MouseEvent::Drag(_) => true,
181 MouseEvent::Hover(_) => false,
182 MouseEvent::Down(_) => true,
183 MouseEvent::Up(_) => true,
184 MouseEvent::Click(_) => true,
185 MouseEvent::DownOut(_) => false,
186 MouseEvent::UpOut(_) => false,
187 MouseEvent::ScrollWheel(_) => true,
188 }
189 }
190}
191
192impl MouseEvent {
193 pub fn move_disc() -> Discriminant<MouseEvent> {
194 discriminant(&MouseEvent::Move(Default::default()))
195 }
196
197 pub fn move_out_disc() -> Discriminant<MouseEvent> {
198 discriminant(&MouseEvent::MoveOut(Default::default()))
199 }
200
201 pub fn drag_disc() -> Discriminant<MouseEvent> {
202 discriminant(&MouseEvent::Drag(Default::default()))
203 }
204
205 pub fn hover_disc() -> Discriminant<MouseEvent> {
206 discriminant(&MouseEvent::Hover(Default::default()))
207 }
208
209 pub fn down_disc() -> Discriminant<MouseEvent> {
210 discriminant(&MouseEvent::Down(Default::default()))
211 }
212
213 pub fn up_disc() -> Discriminant<MouseEvent> {
214 discriminant(&MouseEvent::Up(Default::default()))
215 }
216
217 pub fn up_out_disc() -> Discriminant<MouseEvent> {
218 discriminant(&MouseEvent::UpOut(Default::default()))
219 }
220
221 pub fn click_disc() -> Discriminant<MouseEvent> {
222 discriminant(&MouseEvent::Click(Default::default()))
223 }
224
225 pub fn down_out_disc() -> Discriminant<MouseEvent> {
226 discriminant(&MouseEvent::DownOut(Default::default()))
227 }
228
229 pub fn scroll_wheel_disc() -> Discriminant<MouseEvent> {
230 discriminant(&MouseEvent::ScrollWheel(Default::default()))
231 }
232
233 pub fn handler_key(&self) -> HandlerKey {
234 match self {
235 MouseEvent::Move(_) => HandlerKey::new(Self::move_disc(), None),
236 MouseEvent::MoveOut(_) => HandlerKey::new(Self::move_out_disc(), None),
237 MouseEvent::Drag(e) => HandlerKey::new(Self::drag_disc(), e.pressed_button),
238 MouseEvent::Hover(_) => HandlerKey::new(Self::hover_disc(), None),
239 MouseEvent::Down(e) => HandlerKey::new(Self::down_disc(), Some(e.button)),
240 MouseEvent::Up(e) => HandlerKey::new(Self::up_disc(), Some(e.button)),
241 MouseEvent::Click(e) => HandlerKey::new(Self::click_disc(), Some(e.button)),
242 MouseEvent::UpOut(e) => HandlerKey::new(Self::up_out_disc(), Some(e.button)),
243 MouseEvent::DownOut(e) => HandlerKey::new(Self::down_out_disc(), Some(e.button)),
244 MouseEvent::ScrollWheel(_) => HandlerKey::new(Self::scroll_wheel_disc(), None),
245 }
246 }
247}