1 个不稳定版本
0.1.0 | 2023年1月11日 |
---|
#569 在 命令行界面
21KB
543 代码行
ashiba
tui 框架,基于 tui-rs(尚未准备好用于生产)
功能
- 易于使用。
- 通过
View
和Controller
特性实现架构结构。 - 高质量组件,可点击的上下文菜单、弹出窗口、表单等。
ashiba 中的组件不应实现 View
和 Controller
特性。它们仅提供覆盖基本功能的一个模型。组件可以通过组合在 widgets 中使用,以实现用例。
快速入门
就像这样简单
fn main() {
ashiba::app::run(AshibaApp::default()).unwrap();
}
其中 AshibaApp
实现 View
和 Controller
。The AshibaApp
结构体充当模型,可能看起来像这样
#[derive(Default)]
pub struct AshibaApp {
button: BasicButton,
counter: u32,
should_quit: bool,
}
Controller
使您可以为您的 App 或 Widget 定义操作
impl Controller for AshibaApp {
fn handle_mouse(&mut self, ev: MouseEvent) {
self.button.on_click(ev, || {
self.counter += 1;
})
}
fn handle_key(&mut self, ev: KeyEvent) {
if let KeyCode::Char('q') = ev.code {
self.should_quit = true;
}
}
fn should_quit(&self) -> bool {
self.should_quit
}
}
View
为您的 App 或 Widget 提供了风格自由度
impl View for AshibaApp {
fn ui(&mut self, f: &mut Frame<CrosstermBackend<Stdout>>, area: Rect) {
let button = BasicPlacement::compute_area_relative(area, (50, 50), (20, 4));
let block = Block::default().borders(Borders::ALL);
let ok_block = Block::default().borders(Borders::ALL);
let ok_button =
Paragraph::new(Span::from(format!("Clicked {} times", self.counter)))
.block(ok_block)
.alignment(Alignment::Center);
self.button.set_area(button);
f.render_widget(block, area);
f.render_widget(ok_button, button);
}
}
在 ashiba 中,您应该利用层次结构模式,创建自己的 widgets 以管理您应用程序不断增长的复杂性。
贡献
请随时提出问题/PR,说明可能的改进或更改。
帮助
此外,当需要时,请随时提出问题。我很乐意帮助!
依赖项
~3–11MB
~107K SLoC