Skip to main content

itools_gui/
event.rs

1//! 事件处理模块
2//!
3//! 提供 GUI 事件系统,包括事件定义、分发和处理。
4
5use serde::{Deserialize, Serialize};
6
7/// 事件类型
8#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
9pub enum EventType {
10    /// 鼠标事件
11    Mouse,
12    /// 键盘事件
13    Keyboard,
14    /// 窗口事件
15    Window,
16    /// 自定义事件
17    Custom(String),
18}
19
20/// 鼠标事件
21#[derive(Debug, Deserialize, Serialize)]
22pub struct MouseEvent {
23    /// 鼠标位置 x 坐标
24    pub x: i32,
25    /// 鼠标位置 y 坐标
26    pub y: i32,
27    /// 鼠标按钮
28    pub button: MouseButton,
29    /// 事件类型
30    pub event_type: MouseEventType,
31}
32
33/// 鼠标按钮
34#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
35pub enum MouseButton {
36    /// 左键
37    Left,
38    /// 右键
39    Right,
40    /// 中键
41    Middle,
42    /// 其他按钮
43    Other(u32),
44}
45
46/// 鼠标事件类型
47#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
48pub enum MouseEventType {
49    /// 按下
50    Press,
51    /// 释放
52    Release,
53    /// 移动
54    Move,
55    /// 滚轮
56    Wheel,
57}
58
59/// 键盘事件
60#[derive(Debug, Deserialize, Serialize)]
61pub struct KeyboardEvent {
62    /// 按键
63    pub key: Key,
64    /// 事件类型
65    pub event_type: KeyboardEventType,
66    /// 是否按下修饰键
67    pub modifiers: Modifiers,
68}
69
70/// 按键
71#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
72pub enum Key {
73    /// 字母键
74    Alpha(char),
75    /// 数字键
76    Digit(u32),
77    /// 功能键
78    Function(u32),
79    /// 方向键
80    Arrow(ArrowKey),
81    /// 特殊键
82    Special(SpecialKey),
83}
84
85/// 方向键
86#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
87pub enum ArrowKey {
88    /// 上
89    Up,
90    /// 下
91    Down,
92    /// 左
93    Left,
94    /// 右
95    Right,
96}
97
98/// 特殊键
99#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
100pub enum SpecialKey {
101    /// Enter 键
102    Enter,
103    /// Tab 键
104    Tab,
105    /// Shift 键
106    Shift,
107    /// Ctrl 键
108    Ctrl,
109    /// Alt 键
110    Alt,
111    /// Space 键
112    Space,
113    /// Escape 键
114    Escape,
115    /// Backspace 键
116    Backspace,
117    /// Delete 键
118    Delete,
119    /// Home 键
120    Home,
121    /// End 键
122    End,
123    /// Page Up 键
124    PageUp,
125    /// Page Down 键
126    PageDown,
127}
128
129/// 键盘事件类型
130#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
131pub enum KeyboardEventType {
132    /// 按下
133    Press,
134    /// 释放
135    Release,
136    /// 重复
137    Repeat,
138}
139
140/// 修饰键状态
141#[derive(Debug, Deserialize, Serialize)]
142pub struct Modifiers {
143    /// 是否按下 Shift
144    pub shift: bool,
145    /// 是否按下 Ctrl
146    pub ctrl: bool,
147    /// 是否按下 Alt
148    pub alt: bool,
149    /// 是否按下 Meta
150    pub meta: bool,
151}
152
153/// 窗口事件
154#[derive(Debug, Deserialize, Serialize)]
155pub struct WindowEvent {
156    /// 事件类型
157    pub event_type: WindowEventType,
158    /// 窗口大小(如果适用)
159    pub size: Option<(u32, u32)>,
160}
161
162/// 窗口事件类型
163#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
164pub enum WindowEventType {
165    /// 窗口创建
166    Created,
167    /// 窗口关闭
168    Closed,
169    /// 窗口调整大小
170    Resized,
171    /// 窗口移动
172    Moved,
173    /// 窗口激活
174    Activated,
175    /// 窗口失活
176    Deactivated,
177    /// 窗口最小化
178    Minimized,
179    /// 窗口最大化
180    Maximized,
181    /// 窗口还原
182    Restored,
183}
184
185/// 事件结构体
186#[derive(Debug, Deserialize, Serialize)]
187pub struct Event {
188    /// 事件类型
189    pub event_type: EventType,
190    /// 事件数据
191    pub data: EventData,
192}
193
194/// 事件数据
195#[derive(Debug, Deserialize, Serialize)]
196pub enum EventData {
197    /// 鼠标事件数据
198    Mouse(MouseEvent),
199    /// 键盘事件数据
200    Keyboard(KeyboardEvent),
201    /// 窗口事件数据
202    Window(WindowEvent),
203    /// 自定义事件数据
204    Custom(serde_json::Value),
205}
206
207/// 事件处理器
208pub type EventHandler = Box<dyn Fn(&Event) -> bool + Send + Sync>;
209
210/// 事件管理器
211pub struct EventManager {
212    /// 事件处理器映射
213    handlers: Vec<(EventType, EventHandler)>,
214}
215
216impl EventManager {
217    /// 创建新的事件管理器
218    ///
219    /// # 返回值
220    /// 事件管理器实例
221    pub fn new() -> Self {
222        Self { handlers: Vec::new() }
223    }
224
225    /// 添加事件处理器
226    ///
227    /// # 参数
228    /// - `event_type`: 事件类型
229    /// - `handler`: 事件处理器
230    pub fn add_handler(&mut self, event_type: EventType, handler: EventHandler) {
231        self.handlers.push((event_type, handler));
232    }
233
234    /// 分发事件
235    ///
236    /// # 参数
237    /// - `event`: 事件
238    ///
239    /// # 返回值
240    /// 是否有处理器处理了该事件
241    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}