# Widgetui
Turn
Ratatui Minimal
```rust
fn main() -> Result<(), Box> {
let mut terminal = setup_terminal()?;
run(&mut terminal)?;
restore_terminal(&mut terminal)?;
Ok(())
}
fn setup_terminal() -> Result>, Box> {
let mut stdout = io::stdout();
enable_raw_mode()?;
execute!(stdout, EnterAlternateScreen)?;
Ok(Terminal::new(CrosstermBackend::new(stdout))?)
}
fn restore_terminal(
terminal: &mut Terminal>,
) -> Result<(), Box> {
disable_raw_mode()?;
execute!(terminal.backend_mut(), LeaveAlternateScreen,)?;
Ok(terminal.show_cursor()?)
}
fn run(terminal: &mut Terminal>) -> Result<(), Box> {
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
```rust
use crossterm::event::KeyCode;
use ratatui::widgets::Paragraph;
use widgetui::*;
use std::error::Error;
fn widget(mut frame: ResMut, mut events: ResMut) -> 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> {
Ok(App::new(100)?.widgets(widget).run()?)
}
```
The goal of this project is to simplify the requirements to make a good project using tui.
It removes boilerplate, and improves the developer experience by using the power of typemaps, and dependency injection
# Installation
Run the following within your project directory
```bash
cargo add widgetui
```
# Introduction
Widgetui is a wrapper over Ratatui's Crossterm backend which allows for powerful abstraction, and simplifies creating a good app within Ratatui.
## Why pick this over Ratatui?
Widgetui isn't meant to replace or undermine Ratatui. It is simply a wrapper. Without Ratatui, this crate would not exist, as well, you will still require Ratatui and Crossterm crates just to work with the apps.
**TLDR; Don't, use both together to improve developer experience, and build your apps faster!**
# Quickstart
```rust
use crossterm::event::KeyCode;
use ratatui::widgets::Paragraph;
use widgetui::*;
use std::error::Error;
fn widget(mut frame: ResMut, mut events: ResMut) -> 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()
}
```
The above will create an application that will display an empty terminal window, then close once you press `q`.
This application, with many less lines, will render the same thing that Ratatui's Quickstart renders.
# Documentation
Documentation can be found on [docs.rs](https://docs.rs/widgetui).
Need help? Check the [wiki](https://github.com/TheEmeraldBee/widgetui/wiki)!
# Fun Facts
- I chose `WidgetFrame` because if I just used `Widget`, then you couldn't do the awesome
```rust
use widgetui::*;
use widgetui::ratatui::prelude::*;
```
- It took about 10 hours to get this project initially set up!
- Much longer after I decided to add bevy system like widget methods.
- You used to have to take in a States struct, but in order to fix it, there is a lot of behind the scenes things going on!
- You can only use 11 states in the same widget!
- If you need more, please add an issue with details on why, and we may consider adding access to more at once!