mouse_event.rs

  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}