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