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 过程宏
每月 1,141 次下载
用于 2 个 Crates(通过 widgetui)
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