use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ComponentEvent {
Click {
x: f32,
y: f32,
button: MouseButton,
},
KeyDown {
key: Key,
modifiers: ModifierKeys,
},
KeyUp {
key: Key,
modifiers: ModifierKeys,
},
Focus,
Blur,
Change {
value: String,
},
Input {
value: String,
},
PointerEnter,
PointerLeave,
TouchStart {
x: f32,
y: f32,
},
TouchEnd,
Custom {
name: String,
data: serde_json::Value,
},
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct EventResult {
pub prevent_default: bool,
pub stop_propagation: bool,
pub state_changed: bool,
}
impl EventResult {
pub fn state_changed() -> Self {
Self {
prevent_default: false,
stop_propagation: false,
state_changed: true,
}
}
pub fn prevent_and_changed() -> Self {
Self {
prevent_default: true,
stop_propagation: false,
state_changed: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MouseButton {
Left,
Middle,
Right,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Key {
Enter,
Space,
Escape,
Tab,
ArrowUp,
ArrowDown,
ArrowLeft,
ArrowRight,
Home,
End,
PageUp,
PageDown,
Backspace,
Delete,
Char(char),
F(u8),
Other(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
pub struct ModifierKeys {
pub shift: bool,
pub ctrl: bool,
pub alt: bool,
pub meta: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn event_result_default_is_no_op() {
let result = EventResult::default();
assert!(!result.prevent_default);
assert!(!result.stop_propagation);
assert!(!result.state_changed);
}
#[test]
fn event_result_state_changed() {
let result = EventResult::state_changed();
assert!(!result.prevent_default);
assert!(result.state_changed);
}
#[test]
fn event_result_prevent_and_changed() {
let result = EventResult::prevent_and_changed();
assert!(result.prevent_default);
assert!(result.state_changed);
}
#[test]
fn component_event_serialization() {
let event = ComponentEvent::Click {
x: 10.0,
y: 20.0,
button: MouseButton::Left,
};
let json = serde_json::to_string(&event).unwrap();
let deserialized: ComponentEvent = serde_json::from_str(&json).unwrap();
assert_eq!(event, deserialized);
}
#[test]
fn modifier_keys_default() {
let mods = ModifierKeys::default();
assert!(!mods.shift);
assert!(!mods.ctrl);
assert!(!mods.alt);
assert!(!mods.meta);
}
#[test]
fn key_char_variant() {
let key = Key::Char('a');
assert_eq!(key, Key::Char('a'));
assert_ne!(key, Key::Char('b'));
}
}