Skip to main content

itools_tui/
terminal.rs

1//! 终端操作模块
2//!
3//! 提供终端相关的操作,包括终端大小获取、终端状态管理等。
4
5use crossterm::{cursor, terminal as crossterm_terminal};
6use std::io::{self, Result as CrosstermResult, Write};
7
8/// 终端大小
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub struct Size {
11    /// 宽度
12    pub width: u16,
13    /// 高度
14    pub height: u16,
15}
16
17/// 终端操作
18pub struct Terminal {
19    stdout: io::Stdout,
20}
21
22impl Terminal {
23    /// 创建新的终端实例
24    pub fn new() -> Self {
25        Self { stdout: io::stdout() }
26    }
27
28    /// 获取终端大小
29    pub fn size(&self) -> CrosstermResult<Size> {
30        let (width, height) = crossterm_terminal::size()?;
31        Ok(Size { width, height })
32    }
33
34    /// 进入原始模式
35    pub fn enter_raw_mode(&self) -> CrosstermResult<()> {
36        crossterm_terminal::enable_raw_mode()
37    }
38
39    /// 退出原始模式
40    pub fn exit_raw_mode(&self) -> CrosstermResult<()> {
41        crossterm_terminal::disable_raw_mode()
42    }
43
44    /// 清除屏幕
45    pub fn clear(&mut self) -> CrosstermResult<()> {
46        write!(self.stdout, "{}", crossterm_terminal::Clear(crossterm_terminal::ClearType::All))?;
47        self.stdout.flush()?;
48        Ok(())
49    }
50
51    /// 移动光标
52    pub fn move_cursor(&mut self, x: u16, y: u16) -> CrosstermResult<()> {
53        write!(self.stdout, "{}", cursor::MoveTo(x, y))?;
54        self.stdout.flush()?;
55        Ok(())
56    }
57
58    /// 隐藏光标
59    pub fn hide_cursor(&mut self) -> CrosstermResult<()> {
60        write!(self.stdout, "{}", cursor::Hide)?;
61        self.stdout.flush()?;
62        Ok(())
63    }
64
65    /// 显示光标
66    pub fn show_cursor(&mut self) -> CrosstermResult<()> {
67        write!(self.stdout, "{}", cursor::Show)?;
68        self.stdout.flush()?;
69        Ok(())
70    }
71}