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