use super::app::App;
use crate::signaldb::AsyncSignalDB;
use std::error::Error;
use std::io;
use std::path::Path;
use termion::input::MouseTerminal;
use termion::raw::{IntoRawMode, RawTerminal};
use tui::Terminal;
use tui::backend::TermionBackend;
pub struct Tui {
term: Terminal<TermionBackend<MouseTerminal<RawTerminal<io::Stdout>>>>,
app: App,
}
impl Tui {
pub fn new(signaldb: AsyncSignalDB) -> Result<Tui, Box<dyn Error>> {
let stdout = MouseTerminal::from(io::stdout().into_raw_mode()?);
let backend = TermionBackend::new(stdout);
let term = Terminal::new(backend)?;
Ok(Tui {
term,
app: App::new(signaldb),
})
}
fn render(&mut self) -> Result<(), Box<dyn Error>> {
let term = &mut self.term;
let app = &mut self.app;
term.draw(|f| app.render(f))?;
Ok(())
}
pub fn run(&mut self) -> Result<(), Box<dyn Error>> {
self.term.clear()?;
loop {
self.term.hide_cursor()?;
self.render()?;
if self.app.update() {
break;
}
}
self.term.clear()?;
Ok(())
}
pub fn update_layout<P: AsRef<Path>>(&mut self, path: P) -> Result<(), Box<dyn Error>> {
self.app.update_layout(path)
}
}