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, 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, Debug, Default)]
23pub struct ScrollWheelEvent {
24 pub position: Vector2F,
25 pub delta: Vector2F,
26 pub precise: bool,
27}
28
29#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
30pub enum NavigationDirection {
31 Back,
32 Forward,
33}
34
35impl Default for NavigationDirection {
36 fn default() -> Self {
37 Self::Back
38 }
39}
40
41#[derive(Hash, PartialEq, Eq, Copy, Clone, Debug)]
42pub enum MouseButton {
43 Left,
44 Right,
45 Middle,
46 Navigate(NavigationDirection),
47}
48
49impl MouseButton {
50 pub fn all() -> Vec<Self> {
51 vec![
52 MouseButton::Left,
53 MouseButton::Right,
54 MouseButton::Middle,
55 MouseButton::Navigate(NavigationDirection::Back),
56 MouseButton::Navigate(NavigationDirection::Forward),
57 ]
58 }
59}
60
61impl Default for MouseButton {
62 fn default() -> Self {
63 Self::Left
64 }
65}
66
67#[derive(Clone, Debug, Default)]
68pub struct MouseButtonEvent {
69 pub button: MouseButton,
70 pub position: Vector2F,
71 pub ctrl: bool,
72 pub alt: bool,
73 pub shift: bool,
74 pub cmd: bool,
75 pub click_count: usize,
76}
77
78#[derive(Clone, Copy, Debug, Default)]
79pub struct MouseMovedEvent {
80 pub position: Vector2F,
81 pub pressed_button: Option<MouseButton>,
82 pub ctrl: bool,
83 pub cmd: bool,
84 pub alt: bool,
85 pub shift: bool,
86}
87
88#[derive(Clone, Debug)]
89pub enum Event {
90 KeyDown(KeyDownEvent),
91 KeyUp(KeyUpEvent),
92 ModifiersChanged(ModifiersChangedEvent),
93 MouseDown(MouseButtonEvent),
94 MouseUp(MouseButtonEvent),
95 MouseMoved(MouseMovedEvent),
96 ScrollWheel(ScrollWheelEvent),
97}
98
99impl Event {
100 pub fn position(&self) -> Option<Vector2F> {
101 match self {
102 Event::KeyDown { .. } => None,
103 Event::KeyUp { .. } => None,
104 Event::ModifiersChanged { .. } => None,
105 Event::MouseDown(event) | Event::MouseUp(event) => Some(event.position),
106 Event::MouseMoved(event) => Some(event.position),
107 Event::ScrollWheel(event) => Some(event.position),
108 }
109 }
110}