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