1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub enum ComponentEvent {
9 Click {
11 x: f32,
12 y: f32,
13 button: MouseButton,
14 },
15
16 KeyDown {
18 key: Key,
19 modifiers: ModifierKeys,
20 },
21
22 KeyUp {
24 key: Key,
25 modifiers: ModifierKeys,
26 },
27
28 Focus,
30
31 Blur,
33
34 Change {
36 value: String,
37 },
38
39 Input {
41 value: String,
42 },
43
44 PointerEnter,
46
47 PointerLeave,
49
50 TouchStart {
52 x: f32,
53 y: f32,
54 },
55
56 TouchEnd,
58
59 Custom {
61 name: String,
62 data: serde_json::Value,
63 },
64}
65
66#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
71pub struct EventResult {
72 pub prevent_default: bool,
74 pub stop_propagation: bool,
76 pub state_changed: bool,
78}
79
80impl EventResult {
81 pub fn state_changed() -> Self {
83 Self {
84 prevent_default: false,
85 stop_propagation: false,
86 state_changed: true,
87 }
88 }
89
90 pub fn prevent_and_changed() -> Self {
92 Self {
93 prevent_default: true,
94 stop_propagation: false,
95 state_changed: true,
96 }
97 }
98}
99
100#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
102pub enum MouseButton {
103 Left,
104 Middle,
105 Right,
106}
107
108#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
113pub enum Key {
114 Enter,
115 Space,
116 Escape,
117 Tab,
118 ArrowUp,
119 ArrowDown,
120 ArrowLeft,
121 ArrowRight,
122 Home,
123 End,
124 PageUp,
125 PageDown,
126 Backspace,
127 Delete,
128 Char(char),
130 F(u8),
132 Other(String),
134}
135
136#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
138pub struct ModifierKeys {
139 pub shift: bool,
140 pub ctrl: bool,
141 pub alt: bool,
142 pub meta: bool,
143}
144
145#[cfg(test)]
146mod tests {
147 use super::*;
148
149 #[test]
150 fn event_result_default_is_no_op() {
151 let result = EventResult::default();
152 assert!(!result.prevent_default);
153 assert!(!result.stop_propagation);
154 assert!(!result.state_changed);
155 }
156
157 #[test]
158 fn event_result_state_changed() {
159 let result = EventResult::state_changed();
160 assert!(!result.prevent_default);
161 assert!(result.state_changed);
162 }
163
164 #[test]
165 fn event_result_prevent_and_changed() {
166 let result = EventResult::prevent_and_changed();
167 assert!(result.prevent_default);
168 assert!(result.state_changed);
169 }
170
171 #[test]
172 fn component_event_serialization() {
173 let event = ComponentEvent::Click {
174 x: 10.0,
175 y: 20.0,
176 button: MouseButton::Left,
177 };
178 let json = serde_json::to_string(&event).unwrap();
179 let deserialized: ComponentEvent = serde_json::from_str(&json).unwrap();
180 assert_eq!(event, deserialized);
181 }
182
183 #[test]
184 fn modifier_keys_default() {
185 let mods = ModifierKeys::default();
186 assert!(!mods.shift);
187 assert!(!mods.ctrl);
188 assert!(!mods.alt);
189 assert!(!mods.meta);
190 }
191
192 #[test]
193 fn key_char_variant() {
194 let key = Key::Char('a');
195 assert_eq!(key, Key::Char('a'));
196 assert_ne!(key, Key::Char('b'));
197 }
198}