#ratatui #crossterm #widgets #抽象 #系统 #终端 #bevy

widgetui

类似于bevy的widget系统,适用于ratatui和crossterm

13个版本 (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日

#200 in 游戏开发

Download history 200/week @ 2024-04-25 316/week @ 2024-05-30 28/week @ 2024-06-06 5/week @ 2024-06-13

每月下载量1,063
2 crates 中使用

MIT/Apache

39KB
979 代码行

Widgetui

Ratatui最小化
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;
                }
            }
        }
    })
}

变为

更出色
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>> {
    App::new(100)?.widgets(widget).run()
}

本项目的目标是简化使用tui制作优质项目的需求。它通过使用typemaps和依赖注入的强大功能来去除冗余,并提高开发者的体验。

安装

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

cargo add widgetui

简介

Widgetui是Ratatui的Crossterm后端的包装,它提供了强大的抽象,并简化了在Ratatui中创建优质应用的过程。

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

Widgetui并不打算取代或贬低Ratatui。它只是一个包装器。没有Ratatui,这个crate就不存在了。同样,您仍然需要Ratatui和Crossterm crates才能与这些应用一起工作。

TLDR; 不要同时使用两者以提高开发体验,并更快地构建您的应用!

快速入门

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>> {
    App::new(100)?.widgets(widget).run()
}

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

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

文档

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

有趣的事实

  • 我选择了 WidgetFrame,因为如果只是使用 Widget,那么就不能做那些令人惊叹的事情
use widgetui::*;
use widgetui::ratatui::prelude::*;
  • 最初设置这个项目大约花了10个小时!

    • 之后我决定添加像bevy系统一样的widget方法,所以花费的时间更长。
  • 您过去必须接受一个States结构体,但为了解决这个问题,幕后有很多事情在进行中!

  • 您在同一widget中只能使用11个状态!

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

依赖项

~6–12MB
~120K SLoC