event.rs

  1use crate::{geometry::vector::Vector2F, keymap::Keystroke};
  2
  3#[derive(Clone, Debug)]
  4pub struct KeyDownEvent {
  5    pub keystroke: Keystroke,
  6    pub is_held: bool,
  7}
  8
  9#[derive(Clone, Debug)]
 10pub struct KeyUpEvent {
 11    pub keystroke: Keystroke,
 12}
 13
 14#[derive(Clone, Copy, Debug)]
 15pub struct ModifiersChangedEvent {
 16    pub ctrl: bool,
 17    pub alt: bool,
 18    pub shift: bool,
 19    pub cmd: bool,
 20}
 21
 22#[derive(Clone, Copy, Debug, Default)]
 23pub struct ScrollWheelEvent {
 24    pub position: Vector2F,
 25    pub delta: Vector2F,
 26    pub precise: bool,
 27    pub ctrl: bool,
 28    pub alt: bool,
 29    pub shift: bool,
 30    pub cmd: bool,
 31}
 32
 33#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 34pub enum NavigationDirection {
 35    Back,
 36    Forward,
 37}
 38
 39impl Default for NavigationDirection {
 40    fn default() -> Self {
 41        Self::Back
 42    }
 43}
 44
 45#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
 46pub enum MouseButton {
 47    Left,
 48    Right,
 49    Middle,
 50    Navigate(NavigationDirection),
 51}
 52
 53impl MouseButton {
 54    pub fn all() -> Vec<Self> {
 55        vec![
 56            MouseButton::Left,
 57            MouseButton::Right,
 58            MouseButton::Middle,
 59            MouseButton::Navigate(NavigationDirection::Back),
 60            MouseButton::Navigate(NavigationDirection::Forward),
 61        ]
 62    }
 63}
 64
 65impl Default for MouseButton {
 66    fn default() -> Self {
 67        Self::Left
 68    }
 69}
 70
 71#[derive(Clone, Copy, Debug, Default)]
 72pub struct MouseButtonEvent {
 73    pub button: MouseButton,
 74    pub position: Vector2F,
 75    pub ctrl: bool,
 76    pub alt: bool,
 77    pub shift: bool,
 78    pub cmd: bool,
 79    pub click_count: usize,
 80}
 81
 82#[derive(Clone, Copy, Debug, Default)]
 83pub struct MouseMovedEvent {
 84    pub position: Vector2F,
 85    pub pressed_button: Option<MouseButton>,
 86    pub ctrl: bool,
 87    pub cmd: bool,
 88    pub alt: bool,
 89    pub shift: bool,
 90}
 91
 92impl MouseMovedEvent {
 93    pub fn to_button_event(&self, button: MouseButton) -> MouseButtonEvent {
 94        MouseButtonEvent {
 95            position: self.position,
 96            button: self.pressed_button.unwrap_or(button),
 97            ctrl: self.ctrl,
 98            alt: self.alt,
 99            shift: self.shift,
100            cmd: self.cmd,
101            click_count: 0,
102        }
103    }
104}
105
106#[derive(Clone, Debug)]
107pub enum Event {
108    KeyDown(KeyDownEvent),
109    KeyUp(KeyUpEvent),
110    ModifiersChanged(ModifiersChangedEvent),
111    MouseDown(MouseButtonEvent),
112    MouseUp(MouseButtonEvent),
113    MouseMoved(MouseMovedEvent),
114    ScrollWheel(ScrollWheelEvent),
115}
116
117impl Event {
118    pub fn position(&self) -> Option<Vector2F> {
119        match self {
120            Event::KeyDown { .. } => None,
121            Event::KeyUp { .. } => None,
122            Event::ModifiersChanged { .. } => None,
123            Event::MouseDown(event) | Event::MouseUp(event) => Some(event.position),
124            Event::MouseMoved(event) => Some(event.position),
125            Event::ScrollWheel(event) => Some(event.position),
126        }
127    }
128}