1use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
9pub enum EventType {
10 Mouse,
12 Keyboard,
14 Window,
16 Custom(String),
18}
19
20#[derive(Debug, Deserialize, Serialize)]
22pub struct MouseEvent {
23 pub x: i32,
25 pub y: i32,
27 pub button: MouseButton,
29 pub event_type: MouseEventType,
31}
32
33#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
35pub enum MouseButton {
36 Left,
38 Right,
40 Middle,
42 Other(u32),
44}
45
46#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
48pub enum MouseEventType {
49 Press,
51 Release,
53 Move,
55 Wheel,
57}
58
59#[derive(Debug, Deserialize, Serialize)]
61pub struct KeyboardEvent {
62 pub key: Key,
64 pub event_type: KeyboardEventType,
66 pub modifiers: Modifiers,
68}
69
70#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
72pub enum Key {
73 Alpha(char),
75 Digit(u32),
77 Function(u32),
79 Arrow(ArrowKey),
81 Special(SpecialKey),
83}
84
85#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
87pub enum ArrowKey {
88 Up,
90 Down,
92 Left,
94 Right,
96}
97
98#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
100pub enum SpecialKey {
101 Enter,
103 Tab,
105 Shift,
107 Ctrl,
109 Alt,
111 Space,
113 Escape,
115 Backspace,
117 Delete,
119 Home,
121 End,
123 PageUp,
125 PageDown,
127}
128
129#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
131pub enum KeyboardEventType {
132 Press,
134 Release,
136 Repeat,
138}
139
140#[derive(Debug, Deserialize, Serialize)]
142pub struct Modifiers {
143 pub shift: bool,
145 pub ctrl: bool,
147 pub alt: bool,
149 pub meta: bool,
151}
152
153#[derive(Debug, Deserialize, Serialize)]
155pub struct WindowEvent {
156 pub event_type: WindowEventType,
158 pub size: Option<(u32, u32)>,
160}
161
162#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
164pub enum WindowEventType {
165 Created,
167 Closed,
169 Resized,
171 Moved,
173 Activated,
175 Deactivated,
177 Minimized,
179 Maximized,
181 Restored,
183}
184
185#[derive(Debug, Deserialize, Serialize)]
187pub struct Event {
188 pub event_type: EventType,
190 pub data: EventData,
192}
193
194#[derive(Debug, Deserialize, Serialize)]
196pub enum EventData {
197 Mouse(MouseEvent),
199 Keyboard(KeyboardEvent),
201 Window(WindowEvent),
203 Custom(serde_json::Value),
205}
206
207pub type EventHandler = Box<dyn Fn(&Event) -> bool + Send + Sync>;
209
210pub struct EventManager {
212 handlers: Vec<(EventType, EventHandler)>,
214}
215
216impl EventManager {
217 pub fn new() -> Self {
222 Self { handlers: Vec::new() }
223 }
224
225 pub fn add_handler(&mut self, event_type: EventType, handler: EventHandler) {
231 self.handlers.push((event_type, handler));
232 }
233
234 pub fn dispatch(&self, event: &Event) -> bool {
242 let mut handled = false;
243 for (event_type, handler) in &self.handlers {
244 if *event_type == event.event_type || matches!(event_type, EventType::Custom(_)) {
245 if handler(event) {
246 handled = true;
247 }
248 }
249 }
250 handled
251 }
252}