use serde::{Deserialize, Serialize};
use oak_json::JsonValueNode;
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum EventType {
Mouse,
Keyboard,
Window,
Custom(String),
}
#[derive(Debug, Deserialize, Serialize)]
pub struct MouseEvent {
pub x: i32,
pub y: i32,
pub button: MouseButton,
pub event_type: MouseEventType,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum MouseButton {
Left,
Right,
Middle,
Other(u32),
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum MouseEventType {
Press,
Release,
Move,
Wheel,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct KeyboardEvent {
pub key: Key,
pub event_type: KeyboardEventType,
pub modifiers: Modifiers,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum Key {
Alpha(char),
Digit(u32),
Function(u32),
Arrow(ArrowKey),
Special(SpecialKey),
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum ArrowKey {
Up,
Down,
Left,
Right,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum SpecialKey {
Enter,
Tab,
Shift,
Ctrl,
Alt,
Space,
Escape,
Backspace,
Delete,
Home,
End,
PageUp,
PageDown,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum KeyboardEventType {
Press,
Release,
Repeat,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Modifiers {
pub shift: bool,
pub ctrl: bool,
pub alt: bool,
pub meta: bool,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct WindowEvent {
pub event_type: WindowEventType,
pub size: Option<(u32, u32)>,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub enum WindowEventType {
Created,
Closed,
Resized,
Moved,
Activated,
Deactivated,
Minimized,
Maximized,
Restored,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Event {
pub event_type: EventType,
pub data: EventData,
}
#[derive(Debug, Deserialize, Serialize)]
pub enum EventData {
Mouse(MouseEvent),
Keyboard(KeyboardEvent),
Window(WindowEvent),
Custom(JsonValueNode),
}
pub type EventHandler = Box<dyn Fn(&Event) -> bool + Send + Sync>;
pub struct EventManager {
handlers: Vec<(EventType, EventHandler)>,
}
impl EventManager {
pub fn new() -> Self {
Self { handlers: Vec::new() }
}
pub fn add_handler(&mut self, event_type: EventType, handler: EventHandler) {
self.handlers.push((event_type, handler));
}
pub fn dispatch(&self, event: &Event) -> bool {
let mut handled = false;
for (event_type, handler) in &self.handlers {
if *event_type == event.event_type || matches!(event_type, EventType::Custom(_)) {
if handler(event) {
handled = true;
}
}
}
handled
}
}