15 个版本 (5 个重大更改)

0.6.1 2024年6月1日
0.5.2 2024年4月15日
0.5.0 2024年3月14日
0.4.0 2023年10月5日

#1001 in 过程宏

Download history 138/week @ 2024-04-08 420/week @ 2024-04-15 295/week @ 2024-05-27 55/week @ 2024-06-03 7/week @ 2024-06-10

每月 1,141 次下载
用于 2 个 Crates(通过 widgetui

MIT/Apache

3KB

Widgetui

Turn

Ratatui Minimal
fn main() -> Result<(), Box<dyn Error>> {
    let mut terminal = setup_terminal()?;
    run(&mut terminal)?;
    restore_terminal(&mut terminal)?;
    Ok(())
}

fn setup_terminal() -> Result<Terminal<CrosstermBackend<Stdout>>, Box<dyn Error>> {
    let mut stdout = io::stdout();
    enable_raw_mode()?;
    execute!(stdout, EnterAlternateScreen)?;
    Ok(Terminal::new(CrosstermBackend::new(stdout))?)
}

fn restore_terminal(
    terminal: &mut Terminal<CrosstermBackend<Stdout>>,
) -> Result<(), Box<dyn Error>> {
    disable_raw_mode()?;
    execute!(terminal.backend_mut(), LeaveAlternateScreen,)?;
    Ok(terminal.show_cursor()?)
}

fn run(terminal: &mut Terminal<CrosstermBackend<Stdout>>) -> Result<(), Box<dyn Error>> {
    Ok(loop {
        terminal.draw(|frame| {
            let greeting = Paragraph::new("Hello World!");
            frame.render_widget(greeting, frame.size());
        })?;
        if event::poll(Duration::from_millis(250))? {
            if let Event::Key(key) = event::read()? {
                if KeyCode::Char('q') == key.code {
                    break;
                }
            }
        }
    })
}

Into

Much Better
use crossterm::event::KeyCode;
use ratatui::widgets::Paragraph;
use widgetui::*;

use std::error::Error;

fn widget(mut frame: ResMut<WidgetFrame>, mut events: ResMut<Events>) -> WidgetResult {
    let size = frame.size();
    frame.render_widget(Paragraph::new("Hello, world!"), size);

    if events.key(KeyCode::Char('q')) {
        events.register_exit();
    }

    Ok(())
}

fn main() -> Result<(), Box<dyn Error>> {
    Ok(App::new(100)?.widgets(widget).run()?)
}

本项目的目标是简化使用 tui 的项目需求。它通过使用类型映射和依赖注入的强大功能来移除样板代码,并提高开发体验。

安装

在你的项目目录中运行以下命令

cargo add widgetui

简介

Widgetui 是 Ratatui 的 Crossterm 后端的包装器,它允许进行强大的抽象,并简化了在 Ratatui 中创建优质应用程序的过程。

为什么选择这个而不是 Ratatui?

Widgetui 并不是要取代或削弱 Ratatui。它仅仅是一个包装器。没有 Ratatui,这个 crate 就不会存在。同样,你仍然需要 Ratatui 和 Crossterm Crates 才能使用应用程序。

总结;不要,一起使用以改善开发体验,并更快地构建你的应用程序!

快速入门

use crossterm::event::KeyCode;
use ratatui::widgets::Paragraph;
use widgetui::*;

use std::error::Error;

fn widget(mut frame: ResMut<WidgetFrame>, mut events: ResMut<Events>) -> WidgetResult {
    let size = frame.size();
    frame.render_widget(Paragraph::new("Hello, world!"), size);

    if events.key(KeyCode::Char('q')) {
        events.register_exit();
    }

    Ok(())
}

fn main() -> Result<(), impl Error> {
    App::new(100)?.widgets(widget).run()
}

上面的代码将创建一个应用程序,它将显示一个空的终端窗口,然后在按下 q 键后关闭。

这个应用程序,行数更少,将渲染 Ratatui 快速入门渲染相同的内容。

文档

文档可以在 docs.rs 上找到。需要帮助?查看 Wiki

有趣的事实

  • 我选择了 WidgetFrame,因为如果我仅仅使用 Widget,那么你就无法做到这些很酷的事情
use widgetui::*;
use widgetui::ratatui::prelude::*;
  • 这个项目最初设置大约花了10个小时!

    • 在我决定添加类似 bevy 系统的 widget 方法后,花费的时间更长。
  • 过去您需要传入一个States结构体,但为了修复它,幕后有很多事情在进行中!

  • 在同一个小部件中,您只能使用11个状态!

    • 如果您需要更多,请提交一个带有详细原因的问题,我们可能会考虑一次添加更多访问权限!

依赖项

~260–700KB
~17K SLoC