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