Skip to main content

itools_tui/
event.rs

1//! 事件处理模块
2//!
3//! 提供事件处理相关功能,包括键盘事件和鼠标事件。
4
5use crossterm::event as crossterm_event;
6use std::{io::Result as CrosstermResult, time::Duration};
7
8/// 事件类型
9#[derive(Debug, Clone)]
10pub enum Event {
11    /// 键盘事件
12    Key(crossterm_event::KeyEvent),
13    /// 鼠标事件
14    Mouse(crossterm_event::MouseEvent),
15    /// 终端调整大小事件
16    Resize(u16, u16),
17    /// 超时事件
18    Timeout,
19}
20
21/// 事件处理器 trait
22pub trait EventHandler {
23    /// 处理事件
24    ///
25    /// 返回 true 表示事件已处理,返回 false 表示事件未处理
26    fn handle(&mut self, event: &Event) -> bool;
27}
28
29/// 事件源
30pub struct EventSource {
31    tick_rate: Duration,
32}
33
34impl EventSource {
35    /// 创建新的事件源
36    pub fn new(tick_rate: Duration) -> Self {
37        Self { tick_rate }
38    }
39
40    /// 接收事件
41    pub fn next(&self) -> CrosstermResult<Event> {
42        if crossterm_event::poll(self.tick_rate)? {
43            match crossterm_event::read()? {
44                crossterm_event::Event::Key(key) => Ok(Event::Key(key)),
45                crossterm_event::Event::Mouse(mouse) => Ok(Event::Mouse(mouse)),
46                crossterm_event::Event::Resize(width, height) => Ok(Event::Resize(width, height)),
47                _ => Ok(Event::Timeout),
48            }
49        }
50        else {
51            Ok(Event::Timeout)
52        }
53    }
54}