1 个不稳定版本

0.1.0 2023年1月11日

#569命令行界面

MIT 许可证

21KB
543 代码行

ashiba

Latest Release Documentation Dependencies

tui 框架,基于 tui-rs(尚未准备好用于生产)

功能

  • 易于使用。
  • 通过 ViewController 特性实现架构结构。
  • 高质量组件,可点击的上下文菜单、弹出窗口、表单等。

ashiba 中的组件不应实现 ViewController 特性。它们仅提供覆盖基本功能的一个模型。组件可以通过组合在 widgets 中使用,以实现用例。

快速入门

就像这样简单

fn main() {
    ashiba::app::run(AshibaApp::default()).unwrap();
}

其中 AshibaApp 实现 ViewController。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