1use serde::{Deserialize, Serialize};
6use oak_json::JsonValueNode;
7
8#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
10pub enum EventType {
11 Mouse,
13 Keyboard,
15 Window,
17 Custom(String),
19}
20
21#[derive(Debug, Deserialize, Serialize)]
23pub struct MouseEvent {
24 pub x: i32,
26 pub y: i32,
28 pub button: MouseButton,
30 pub event_type: MouseEventType,
32}
33
34#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
36pub enum MouseButton {
37 Left,
39 Right,
41 Middle,
43 Other(u32),
45}
46
47#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
49pub enum MouseEventType {
50 Press,
52 Release,
54 Move,
56 Wheel,
58}
59
60#[derive(Debug, Deserialize, Serialize)]
62pub struct KeyboardEvent {
63 pub key: Key,
65 pub event_type: KeyboardEventType,
67 pub modifiers: Modifiers,
69}
70
71#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
73pub enum Key {
74 Alpha(char),
76 Digit(u32),
78 Function(u32),
80 Arrow(ArrowKey),
82 Special(SpecialKey),
84}
85
86#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
88pub enum ArrowKey {
89 Up,
91 Down,
93 Left,
95 Right,
97}
98
99#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
101pub enum SpecialKey {
102 Enter,
104 Tab,
106 Shift,
108 Ctrl,
110 Alt,
112 Space,
114 Escape,
116 Backspace,
118 Delete,
120 Home,
122 End,
124 PageUp,
126 PageDown,
128}
129
130#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
132pub enum KeyboardEventType {
133 Press,
135 Release,
137 Repeat,
139}
140
141#[derive(Debug, Deserialize, Serialize)]
143pub struct Modifiers {
144 pub shift: bool,
146 pub ctrl: bool,
148 pub alt: bool,
150 pub meta: bool,
152}
153
154#[derive(Debug, Deserialize, Serialize)]
156pub struct WindowEvent {
157 pub event_type: WindowEventType,
159 pub size: Option<(u32, u32)>,
161}
162
163#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
165pub enum WindowEventType {
166 Created,
168 Closed,
170 Resized,
172 Moved,
174 Activated,
176 Deactivated,
178 Minimized,
180 Maximized,
182 Restored,
184}
185
186#[derive(Debug, Deserialize, Serialize)]
188pub struct Event {
189 pub event_type: EventType,
191 pub data: EventData,
193}
194
195#[derive(Debug, Deserialize, Serialize)]
197pub enum EventData {
198 Mouse(MouseEvent),
200 Keyboard(KeyboardEvent),
202 Window(WindowEvent),
204 Custom(JsonValueNode),
206}
207
208pub type EventHandler = Box<dyn Fn(&Event) -> bool + Send + Sync>;
210
211pub struct EventManager {
213 handlers: Vec<(EventType, EventHandler)>,
215}
216
217impl EventManager {
218 pub fn new() -> Self {
223 Self { handlers: Vec::new() }
224 }
225
226 pub fn add_handler(&mut self, event_type: EventType, handler: EventHandler) {
232 self.handlers.push((event_type, handler));
233 }
234
235 pub fn dispatch(&self, event: &Event) -> bool {
243 let mut handled = false;
244 for (event_type, handler) in &self.handlers {
245 if *event_type == event.event_type || matches!(event_type, EventType::Custom(_)) {
246 if handler(event) {
247 handled = true;
248 }
249 }
250 }
251 handled
252 }
253}