event.rs

  1use std::ops::Deref;
  2
  3use crate::{geometry::vector::Vector2F, keymap::Keystroke};
  4
  5#[derive(Clone, Debug)]
  6pub struct KeyDownEvent {
  7    pub keystroke: Keystroke,
  8    pub is_held: bool,
  9}
 10
 11#[derive(Clone, Debug)]
 12pub struct KeyUpEvent {
 13    pub keystroke: Keystroke,
 14}
 15
 16#[derive(Clone, Copy, Debug, Default, PartialEq)]
 17pub struct Modifiers {
 18    pub ctrl: bool,
 19    pub alt: bool,
 20    pub shift: bool,
 21    pub cmd: bool,
 22    pub fun: bool,
 23}
 24
 25#[derive(Clone, Copy, Debug, Default)]
 26pub struct ModifiersChangedEvent {
 27    pub modifiers: Modifiers,
 28}
 29
 30impl Deref for ModifiersChangedEvent {
 31    type Target = Modifiers;
 32
 33    fn deref(&self) -> &Self::Target {
 34        &self.modifiers
 35    }
 36}
 37
 38/// The phase of a touch motion event.
 39/// Based on the winit enum of the same name,
 40#[derive(Clone, Copy, Debug)]
 41pub enum TouchPhase {
 42    Started,
 43    Moved,
 44    Ended,
 45}
 46
 47#[derive(Clone, Copy, Debug, Default)]
 48pub struct ScrollWheelEvent {
 49    pub position: Vector2F,
 50    pub delta: Vector2F,
 51    pub precise: bool,
 52    pub modifiers: Modifiers,
 53    /// If the platform supports returning the phase of a scroll wheel event, it will be stored here
 54    pub phase: Option<TouchPhase>,
 55}
 56
 57impl Deref for ScrollWheelEvent {
 58    type Target = Modifiers;
 59
 60    fn deref(&self) -> &Self::Target {
 61        &self.modifiers
 62    }
 63}
 64
 65#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 66pub enum NavigationDirection {
 67    Back,
 68    Forward,
 69}
 70
 71impl Default for NavigationDirection {
 72    fn default() -> Self {
 73        Self::Back
 74    }
 75}
 76
 77#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 78pub enum MouseButton {
 79    Left,
 80    Right,
 81    Middle,
 82    Navigate(NavigationDirection),
 83}
 84
 85impl MouseButton {
 86    pub fn all() -> Vec<Self> {
 87        vec![
 88            MouseButton::Left,
 89            MouseButton::Right,
 90            MouseButton::Middle,
 91            MouseButton::Navigate(NavigationDirection::Back),
 92            MouseButton::Navigate(NavigationDirection::Forward),
 93        ]
 94    }
 95}
 96
 97impl Default for MouseButton {
 98    fn default() -> Self {
 99        Self::Left
100    }
101}
102
103#[derive(Clone, Copy, Debug, Default)]
104pub struct MouseButtonEvent {
105    pub button: MouseButton,
106    pub position: Vector2F,
107    pub modifiers: Modifiers,
108    pub click_count: usize,
109}
110
111impl Deref for MouseButtonEvent {
112    type Target = Modifiers;
113
114    fn deref(&self) -> &Self::Target {
115        &self.modifiers
116    }
117}
118
119#[derive(Clone, Copy, Debug, Default)]
120pub struct MouseMovedEvent {
121    pub position: Vector2F,
122    pub pressed_button: Option<MouseButton>,
123    pub modifiers: Modifiers,
124}
125
126impl Deref for MouseMovedEvent {
127    type Target = Modifiers;
128
129    fn deref(&self) -> &Self::Target {
130        &self.modifiers
131    }
132}
133
134impl MouseMovedEvent {
135    pub fn to_button_event(&self, button: MouseButton) -> MouseButtonEvent {
136        MouseButtonEvent {
137            position: self.position,
138            button: self.pressed_button.unwrap_or(button),
139            modifiers: self.modifiers,
140            click_count: 0,
141        }
142    }
143}
144
145#[derive(Clone, Debug)]
146pub enum Event {
147    KeyDown(KeyDownEvent),
148    KeyUp(KeyUpEvent),
149    ModifiersChanged(ModifiersChangedEvent),
150    MouseDown(MouseButtonEvent),
151    MouseUp(MouseButtonEvent),
152    MouseMoved(MouseMovedEvent),
153    ScrollWheel(ScrollWheelEvent),
154}
155
156impl Event {
157    pub fn position(&self) -> Option<Vector2F> {
158        match self {
159            Event::KeyDown { .. } => None,
160            Event::KeyUp { .. } => None,
161            Event::ModifiersChanged { .. } => None,
162            Event::MouseDown(event) | Event::MouseUp(event) => Some(event.position),
163            Event::MouseMoved(event) => Some(event.position),
164            Event::ScrollWheel(event) => Some(event.position),
165        }
166    }
167}