Skip to main content

lv_tui/
event.rs

1use crate::geom::Size;
2
3/// 按键
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub enum Key {
6    Char(char),
7    Enter,
8    Esc,
9    Backspace,
10    Tab,
11    Up,
12    Down,
13    Left,
14    Right,
15    Delete,
16    Home,
17    End,
18    PageUp,
19    PageDown,
20}
21
22/// 修饰键
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
24pub struct Modifiers {
25    pub ctrl: bool,
26    pub alt: bool,
27    pub shift: bool,
28}
29
30/// 按键事件
31#[derive(Debug, Clone, PartialEq, Eq)]
32pub struct KeyEvent {
33    pub key: Key,
34    pub modifiers: Modifiers,
35}
36
37/// 鼠标事件类型
38#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub enum MouseKind {
40    Down,
41    Up,
42    ScrollUp,
43    ScrollDown,
44}
45
46/// 鼠标事件
47#[derive(Debug, Clone, Copy, PartialEq, Eq)]
48pub struct MouseEvent {
49    pub x: u16,
50    pub y: u16,
51    pub kind: MouseKind,
52}
53
54/// 事件传播阶段
55#[derive(Debug, Clone, Copy, PartialEq, Eq)]
56pub enum EventPhase {
57    /// 从根向目标传播
58    Capture,
59    /// 到达目标
60    Target,
61    /// 从目标向根冒泡
62    Bubble,
63}
64
65/// Worker identifier.
66#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
67pub struct WorkerId(pub u64);
68
69/// 框架事件
70#[derive(Debug, Clone, PartialEq, Eq)]
71pub enum Event {
72    Key(KeyEvent),
73    Mouse(MouseEvent),
74    Resize(Size),
75    /// 获得焦点
76    Focus,
77    /// 失去焦点
78    Blur,
79    Tick,
80    /// 后台任务完成,携带结果数据
81    TaskComplete(String),
82    /// Worker finished (success or cancelled). String is result or empty if cancelled.
83    WorkerDone(WorkerId, String),
84    /// 定时器触发,携带 timer id
85    Timer(u64),
86}
87
88/// 组件可发送的预定义命令
89#[derive(Debug, Clone, PartialEq, Eq)]
90pub enum Command {
91    Quit,
92    FocusNext,
93    FocusPrev,
94    Custom(String),
95}
96
97impl Event {
98    /// 判断是否为指定按键事件(忽略修饰键)
99    pub fn is_key(&self, key: Key) -> bool {
100        matches!(self, Event::Key(KeyEvent { key: k, .. }) if *k == key)
101    }
102}