Crates.io | ashiba |
lib.rs | ashiba |
version | 0.1.0 |
source | src |
created_at | 2023-01-11 20:22:41.13196 |
updated_at | 2023-01-11 20:22:41.13196 |
description | tui framework, based on tui-rs |
homepage | https://github.com/nyvs/ashiba |
repository | https://github.com/nyvs/ashiba |
max_upload_size | |
id | 756694 |
size | 20,096 |
tui framework, based on tui-rs (not ready for production)
View
and Controller
traits.Components in ashiba shall not implement View
and Controller
traits.
They merely provide a model to cover basic functionality.
Components can then be used in widgets through composition to fulfil the usecase.
It's as easy as this:
fn main() {
ashiba::app::run(AshibaApp::default()).unwrap();
}
where AshibaApp
implements View
and Controller
.
The AshibaApp
struct acts as a model and could look something like this:
#[derive(Default)]
pub struct AshibaApp {
button: BasicButton,
counter: u32,
should_quit: bool,
}
A Controller
makes it possible to define actions for your App or 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
}
}
A View
gives freedom to style your App or 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);
}
}
In ashiba, you should make use of a hierachical pattern, creating widgets of your own to manage the growing complexity of your app.
Feel free to open an issue/PR explaining possible improvements or changes.
Also, please do not hesitate and open an issue when needed. I am happy to help!