mirror of
https://github.com/ratatui-org/ratatui
synced 2024-11-26 14:40:30 +00:00
847bacf32e
Simplified a bunch of the logic in the demo2 example - Moved destroy mode to its own file. - Moved error handling to its own file. - Removed AppContext - Implemented Widget for &App. The app state is small enough that it doesn't matter here and we could just copy or clone the app state on every frame, but for larger apps this can be a significant performance improvement. - Made the tabs stateful - Made the term module just a collection of functions rather than a struct. - Changed to use color_eyre for error handling. - Changed keyboard shortcuts and rearranged the bottom bar. - Use strum for the tabs enum.
42 lines
1.2 KiB
Rust
42 lines
1.2 KiB
Rust
use std::{
|
|
io::{self, stdout},
|
|
time::Duration,
|
|
};
|
|
|
|
use color_eyre::{eyre::WrapErr, Result};
|
|
use crossterm::{
|
|
event::{self, Event},
|
|
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
|
ExecutableCommand,
|
|
};
|
|
use ratatui::prelude::*;
|
|
|
|
pub fn init() -> Result<Terminal<impl Backend>> {
|
|
// this size is to match the size of the terminal when running the demo
|
|
// using vhs in a 1280x640 sized window (github social preview size)
|
|
let options = TerminalOptions {
|
|
viewport: Viewport::Fixed(Rect::new(0, 0, 81, 18)),
|
|
};
|
|
let terminal = Terminal::with_options(CrosstermBackend::new(io::stdout()), options)?;
|
|
enable_raw_mode().context("enable raw mode")?;
|
|
stdout()
|
|
.execute(EnterAlternateScreen)
|
|
.wrap_err("enter alternate screen")?;
|
|
Ok(terminal)
|
|
}
|
|
|
|
pub fn restore() -> Result<()> {
|
|
disable_raw_mode().context("disable raw mode")?;
|
|
stdout()
|
|
.execute(LeaveAlternateScreen)
|
|
.wrap_err("leave alternate screen")?;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn next_event(timeout: Duration) -> Result<Option<Event>> {
|
|
if !event::poll(timeout)? {
|
|
return Ok(None);
|
|
}
|
|
let event = event::read()?;
|
|
Ok(Some(event))
|
|
}
|