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, Debug, Default)]
 38pub struct MouseDownEvent {
 39    pub button: MouseButton,
 40    pub position: Point<Pixels>,
 41    pub modifiers: Modifiers,
 42    pub click_count: usize,
 43}
 44
 45#[derive(Clone, Debug, Default)]
 46pub struct MouseUpEvent {
 47    pub button: MouseButton,
 48    pub position: Point<Pixels>,
 49    pub modifiers: Modifiers,
 50    pub click_count: usize,
 51}
 52
 53#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 54pub enum MouseButton {
 55    Left,
 56    Right,
 57    Middle,
 58    Navigate(NavigationDirection),
 59}
 60
 61impl MouseButton {
 62    pub fn all() -> Vec<Self> {
 63        vec![
 64            MouseButton::Left,
 65            MouseButton::Right,
 66            MouseButton::Middle,
 67            MouseButton::Navigate(NavigationDirection::Back),
 68            MouseButton::Navigate(NavigationDirection::Forward),
 69        ]
 70    }
 71}
 72
 73impl Default for MouseButton {
 74    fn default() -> Self {
 75        Self::Left
 76    }
 77}
 78
 79#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 80pub enum NavigationDirection {
 81    Back,
 82    Forward,
 83}
 84
 85impl Default for NavigationDirection {
 86    fn default() -> Self {
 87        Self::Back
 88    }
 89}
 90
 91#[derive(Clone, Debug, Default)]
 92pub struct MouseMoveEvent {
 93    pub position: Point<Pixels>,
 94    pub pressed_button: Option<MouseButton>,
 95    pub modifiers: Modifiers,
 96}
 97
 98#[derive(Clone, Debug)]
 99pub struct ScrollWheelEvent {
100    pub position: Point<Pixels>,
101    pub delta: ScrollDelta,
102    pub modifiers: Modifiers,
103    pub touch_phase: TouchPhase,
104}
105
106impl Deref for ScrollWheelEvent {
107    type Target = Modifiers;
108
109    fn deref(&self) -> &Self::Target {
110        &self.modifiers
111    }
112}
113
114#[derive(Clone, Copy, Debug)]
115pub enum ScrollDelta {
116    Pixels(Point<Pixels>),
117    Lines(Point<f32>),
118}
119
120impl Default for ScrollDelta {
121    fn default() -> Self {
122        Self::Lines(Default::default())
123    }
124}
125
126impl ScrollDelta {
127    pub fn precise(&self) -> bool {
128        match self {
129            ScrollDelta::Pixels(_) => true,
130            ScrollDelta::Lines(_) => false,
131        }
132    }
133
134    pub fn pixel_delta(&self, line_height: Pixels) -> Point<Pixels> {
135        match self {
136            ScrollDelta::Pixels(delta) => *delta,
137            ScrollDelta::Lines(delta) => point(line_height * delta.x, line_height * delta.y),
138        }
139    }
140}
141
142#[derive(Clone, Debug, Default)]
143pub struct MouseExitEvent {
144    pub position: Point<Pixels>,
145    pub pressed_button: Option<MouseButton>,
146    pub modifiers: Modifiers,
147}
148
149impl Deref for MouseExitEvent {
150    type Target = Modifiers;
151
152    fn deref(&self) -> &Self::Target {
153        &self.modifiers
154    }
155}
156
157#[derive(Clone, Debug)]
158pub enum Event {
159    KeyDown(KeyDownEvent),
160    KeyUp(KeyUpEvent),
161    ModifiersChanged(ModifiersChangedEvent),
162    MouseDown(MouseDownEvent),
163    MouseUp(MouseUpEvent),
164    MouseMoved(MouseMoveEvent),
165    MouseExited(MouseExitEvent),
166    ScrollWheel(ScrollWheelEvent),
167}
168
169impl Event {
170    pub fn position(&self) -> Option<Point<Pixels>> {
171        match self {
172            Event::KeyDown { .. } => None,
173            Event::KeyUp { .. } => None,
174            Event::ModifiersChanged { .. } => None,
175            Event::MouseDown(event) => Some(event.position),
176            Event::MouseUp(event) => Some(event.position),
177            Event::MouseMoved(event) => Some(event.position),
178            Event::MouseExited(event) => Some(event.position),
179            Event::ScrollWheel(event) => Some(event.position),
180        }
181    }
182
183    pub fn mouse_event<'a>(&'a self) -> Option<&'a dyn Any> {
184        match self {
185            Event::KeyDown { .. } => None,
186            Event::KeyUp { .. } => None,
187            Event::ModifiersChanged { .. } => None,
188            Event::MouseDown(event) => Some(event),
189            Event::MouseUp(event) => Some(event),
190            Event::MouseMoved(event) => Some(event),
191            Event::MouseExited(event) => Some(event),
192            Event::ScrollWheel(event) => Some(event),
193        }
194    }
195}