#[allow(dead_code)] mod util; use crate::util::event::{Event, Events}; use std::{error::Error, io}; use termion::{event::Key, input::MouseTerminal, raw::IntoRawMode, screen::AlternateScreen}; use tui::{ backend::TermionBackend, buffer::Buffer, layout::Rect, style::Style, widgets::Widget, Terminal, }; struct Label<'a> { text: &'a str, } impl<'a> Default for Label<'a> { fn default() -> Label<'a> { Label { text: "" } } } impl<'a> Widget for Label<'a> { fn render(self, area: Rect, buf: &mut Buffer) { buf.set_string(area.left(), area.top(), self.text, Style::default()); } } impl<'a> Label<'a> { fn text(mut self, text: &'a str) -> Label<'a> { self.text = text; self } } fn main() -> Result<(), Box> { // Terminal initialization let stdout = io::stdout().into_raw_mode()?; let stdout = MouseTerminal::from(stdout); let stdout = AlternateScreen::from(stdout); let backend = TermionBackend::new(stdout); let mut terminal = Terminal::new(backend)?; let events = Events::new(); loop { terminal.draw(|f| { let size = f.size(); let label = Label::default().text("Test"); f.render_widget(label, size); })?; if let Event::Input(key) = events.next()? { if key == Key::Char('q') { break; } } } Ok(()) }