Skip to main content

itools_gui/
event.rs

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