mouse_event.rs

  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}