events.rs

  1use crate::{point, Keystroke, Modifiers, Pixels, Point};
  2use std::{any::Any, ops::Deref};
  3
  4#[derive(Clone, Debug, Eq, PartialEq)]
  5pub struct KeyDownEvent {
  6    pub keystroke: Keystroke,
  7    pub is_held: bool,
  8}
  9
 10#[derive(Clone, Debug)]
 11pub struct KeyUpEvent {
 12    pub keystroke: Keystroke,
 13}
 14
 15#[derive(Clone, Debug, Default)]
 16pub struct ModifiersChangedEvent {
 17    pub modifiers: Modifiers,
 18}
 19
 20impl Deref for ModifiersChangedEvent {
 21    type Target = Modifiers;
 22
 23    fn deref(&self) -> &Self::Target {
 24        &self.modifiers
 25    }
 26}
 27
 28/// The phase of a touch motion event.
 29/// Based on the winit enum of the same name,
 30#[derive(Clone, Copy, Debug)]
 31pub enum TouchPhase {
 32    Started,
 33    Moved,
 34    Ended,
 35}
 36
 37#[derive(Clone, Copy, Debug)]
 38pub enum ScrollDelta {
 39    Pixels(Point<Pixels>),
 40    Lines(Point<f32>),
 41}
 42
 43impl Default for ScrollDelta {
 44    fn default() -> Self {
 45        Self::Lines(Default::default())
 46    }
 47}
 48
 49impl ScrollDelta {
 50    pub fn precise(&self) -> bool {
 51        match self {
 52            ScrollDelta::Pixels(_) => true,
 53            ScrollDelta::Lines(_) => false,
 54        }
 55    }
 56
 57    pub fn pixel_delta(&self, line_height: Pixels) -> Point<Pixels> {
 58        match self {
 59            ScrollDelta::Pixels(delta) => *delta,
 60            ScrollDelta::Lines(delta) => point(line_height * delta.x, line_height * delta.y),
 61        }
 62    }
 63}
 64
 65#[derive(Clone, Debug, Default)]
 66pub struct ScrollWheelEvent {
 67    pub position: Point<Pixels>,
 68    pub delta: ScrollDelta,
 69    pub modifiers: Modifiers,
 70    /// If the platform supports returning the phase of a scroll wheel event, it will be stored here
 71    pub phase: Option<TouchPhase>,
 72}
 73
 74impl Deref for ScrollWheelEvent {
 75    type Target = Modifiers;
 76
 77    fn deref(&self) -> &Self::Target {
 78        &self.modifiers
 79    }
 80}
 81
 82#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 83pub enum NavigationDirection {
 84    Back,
 85    Forward,
 86}
 87
 88impl Default for NavigationDirection {
 89    fn default() -> Self {
 90        Self::Back
 91    }
 92}
 93
 94#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 95pub enum MouseButton {
 96    Left,
 97    Right,
 98    Middle,
 99    Navigate(NavigationDirection),
100}
101
102impl MouseButton {
103    pub fn all() -> Vec<Self> {
104        vec![
105            MouseButton::Left,
106            MouseButton::Right,
107            MouseButton::Middle,
108            MouseButton::Navigate(NavigationDirection::Back),
109            MouseButton::Navigate(NavigationDirection::Forward),
110        ]
111    }
112}
113
114impl Default for MouseButton {
115    fn default() -> Self {
116        Self::Left
117    }
118}
119
120#[derive(Clone, Debug, Default)]
121pub struct MouseDownEvent {
122    pub button: MouseButton,
123    pub position: Point<Pixels>,
124    pub modifiers: Modifiers,
125    pub click_count: usize,
126}
127
128#[derive(Clone, Debug, Default)]
129pub struct MouseUpEvent {
130    pub button: MouseButton,
131    pub position: Point<Pixels>,
132    pub modifiers: Modifiers,
133    pub click_count: usize,
134}
135
136#[derive(Clone, Debug, Default)]
137pub struct MouseUp {
138    pub button: MouseButton,
139    pub position: Point<Pixels>,
140    pub modifiers: Modifiers,
141    pub click_count: usize,
142}
143
144#[derive(Clone, Debug, Default)]
145pub struct MouseMovedEvent {
146    pub position: Point<Pixels>,
147    pub pressed_button: Option<MouseButton>,
148    pub modifiers: Modifiers,
149}
150
151#[derive(Clone, Debug, Default)]
152pub struct MouseExitedEvent {
153    pub position: Point<Pixels>,
154    pub pressed_button: Option<MouseButton>,
155    pub modifiers: Modifiers,
156}
157
158impl Deref for MouseExitedEvent {
159    type Target = Modifiers;
160
161    fn deref(&self) -> &Self::Target {
162        &self.modifiers
163    }
164}
165
166#[derive(Clone, Debug)]
167pub enum Event {
168    KeyDown(KeyDownEvent),
169    KeyUp(KeyUpEvent),
170    ModifiersChanged(ModifiersChangedEvent),
171    MouseDown(MouseDownEvent),
172    MouseUp(MouseUpEvent),
173    MouseMoved(MouseMovedEvent),
174    MouseExited(MouseExitedEvent),
175    ScrollWheel(ScrollWheelEvent),
176}
177
178impl Event {
179    pub fn position(&self) -> Option<Point<Pixels>> {
180        match self {
181            Event::KeyDown { .. } => None,
182            Event::KeyUp { .. } => None,
183            Event::ModifiersChanged { .. } => None,
184            Event::MouseDown(event) => Some(event.position),
185            Event::MouseUp(event) => Some(event.position),
186            Event::MouseMoved(event) => Some(event.position),
187            Event::MouseExited(event) => Some(event.position),
188            Event::ScrollWheel(event) => Some(event.position),
189        }
190    }
191
192    pub fn mouse_event<'a>(&'a self) -> Option<&'a dyn Any> {
193        match self {
194            Event::KeyDown { .. } => None,
195            Event::KeyUp { .. } => None,
196            Event::ModifiersChanged { .. } => None,
197            Event::MouseDown(event) => Some(event),
198            Event::MouseUp(event) => Some(event),
199            Event::MouseMoved(event) => Some(event),
200            Event::MouseExited(event) => Some(event),
201            Event::ScrollWheel(event) => Some(event),
202        }
203    }
204}