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 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}