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