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 游戏开发
每月下载量1,063
在 2 crates 中使用
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