use crossterm::execute;
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::Terminal;
use std::io::{self, stdout, Stdout};
pub struct Tui {
pub terminal: Terminal<CrosstermBackend<Stdout>>,
}
impl Tui {
pub fn new() -> io::Result<Self> {
Ok(Self { terminal: Terminal::new(CrosstermBackend::new(stdout()))? })
}
pub fn enter(&mut self) -> io::Result<()> {
enable_raw_mode()?;
execute!(stdout(), EnterAlternateScreen)?;
install_panic_hook();
self.terminal.clear()?;
Ok(())
}
pub fn exit(&mut self) -> io::Result<()> {
restore()
}
}
fn restore() -> io::Result<()> {
execute!(stdout(), LeaveAlternateScreen)?;
disable_raw_mode()
}
fn install_panic_hook() {
let previous = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
let _ = restore();
previous(info);
}));
}