0070-Tui-综合示例(二)

环境

  • Time 2022-08-23
  • Rust 1.63.0
  • Tui 0.19.0

前言

说明

参考:https://github.com/fdehau/tui-rs/tree/master/examples/demo

目标

实现 tui-rs 的综合示例程序,终端的开启和还原。

main.rs

mod crossterm;

use std::time::Duration;

use crate::crossterm::run;
use argh::FromArgs;

/// Tui 的示例程序
#[derive(Debug, FromArgs)]
struct Cli {
    /// 刷新的间隔时间
    #[argh(option, default = "250")]
    tick_rate: u64,
    /// 是否使用Unicode增强
    #[argh(option, default = "true")]
    enhanced_graphics: bool,
}

fn main() -> anyhow::Result<()> {
    let cli: Cli = argh::from_env();
    let tick_rate = Duration::from_millis(cli.tick_rate);
    run(tick_rate, cli.enhanced_graphics)
}

run

pub fn run(tick_rate: Duration, enhanced_graphics: bool) -> Result<()> {
    terminal::enable_raw_mode()?;

    let mut backend = CrosstermBackend::new(std::io::stdout());
    backend
        .execute(terminal::EnterAlternateScreen)?
        .execute(EnableMouseCapture)?
        .execute(terminal::Clear(terminal::ClearType::All))?
        .hide_cursor()?;
    let mut terminal = tui::Terminal::new(backend)?;

    let app = App::new("Tui 综合示例", enhanced_graphics);
    let res = run_app(&mut terminal, app, tick_rate);

    terminal::disable_raw_mode()?;

    terminal
        .backend_mut()
        .execute(terminal::Clear(terminal::ClearType::All))?
        .execute(terminal::LeaveAlternateScreen)?
        .execute(DisableMouseCapture)?
        .show_cursor()
        .context("重置控制台失败")
}

run_app

fn run_app<B: Backend>(
    terminal: &mut Terminal<B>,
    mut app: App,
    tick_rate: Duration,
) -> Result<()> {
    let mut last_tick = std::time::Instant::now();
    loop {
        terminal.draw(|frame| ui::draw(frame, &mut app))?;

        let timeout = tick_rate
            .checked_sub(last_tick.elapsed())
            .unwrap_or_default();

        if event::poll(timeout)? {
            if let event::Event::Key(key) = event::read()? {
                match key.code {
                    KeyCode::Char(c) => app.on_key(c),
                    KeyCode::Left => app.on_left(),
                    KeyCode::Up => app.on_up(),
                    KeyCode::Right => app.on_right(),
                    KeyCode::Down => app.on_down(),
                    _ => {}
                }
            }
        }

        if last_tick.elapsed() >= tick_rate {
            app.on_tick();
            last_tick = std::time::Instant::now();
        }
        if app.should_quit {
            return Ok(());
        }
    }
}

总结

实现 tui-rs 的综合示例程序,终端的开启和还原。暂时不能运行,存在编译错误。

附录

posted @   jiangbo4444  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-09-30 【JavaScript】展开语法
2020-09-30 【JavaScript】剩余参数
2020-09-30 【JavaScript】默认参数
2020-09-30 【JavaScript】import
2020-09-30 【JavaScript】debugger
2020-09-30 【JavaScript】for await...of
点击右上角即可分享
微信分享提示