use std::io::{self, Stdout, stdout};
use crossterm::event::{
self, Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers,
};
use crossterm::execute;
use crossterm::terminal::{
EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode,
enable_raw_mode,
};
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend;
pub type Backend = CrosstermBackend<Stdout>;
pub struct Tui {
pub terminal: Terminal<Backend>,
}
impl Tui {
pub fn new() -> io::Result<Self> {
enable_raw_mode()?;
let mut out = stdout();
execute!(out, EnterAlternateScreen)?;
let terminal = Terminal::new(CrosstermBackend::new(out))?;
Ok(Tui { terminal })
}
pub fn read_key(&self) -> io::Result<KeyEvent> {
loop {
if let Event::Key(key) = event::read()?
&& key.kind == KeyEventKind::Press
{
return Ok(key);
}
}
}
}
pub fn is_global_quit(key: KeyEvent) -> bool {
key.modifiers.contains(KeyModifiers::CONTROL)
&& key.code == KeyCode::Char('q')
}
fn restore_terminal() {
let _ = disable_raw_mode();
let _ = execute!(stdout(), LeaveAlternateScreen);
}
impl Drop for Tui {
fn drop(&mut self) {
restore_terminal();
}
}