// boilerplate from from tui-rs examples use crossterm::{ event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, execute, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }; use std::{ io, time::{Duration, Instant}, }; use tui::{ backend::{Backend, CrosstermBackend}, Frame, Terminal, widgets::{Paragraph, Block, Borders} }; use tui_treemap::*; struct App {} impl App { fn new() -> Self { Self {} } } fn main() -> Result<(), Box> { // setup terminal enable_raw_mode()?; let mut stdout = io::stdout(); execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; // create app and run it let tick_rate = Duration::from_millis(250); let app = App::new(); let res = run_app(&mut terminal, app, tick_rate); // restore terminal disable_raw_mode()?; execute!( terminal.backend_mut(), LeaveAlternateScreen, DisableMouseCapture )?; terminal.show_cursor()?; if let Err(err) = res { println!("{:?}", err) } Ok(()) } fn run_app( terminal: &mut Terminal, app: App, tick_rate: Duration, ) -> io::Result<()> { let mut last_tick = Instant::now(); loop { terminal.draw(|f| ui(f, &app))?; let timeout = tick_rate .checked_sub(last_tick.elapsed()) .unwrap_or_else(|| Duration::from_secs(0)); if crossterm::event::poll(timeout)? { if let Event::Key(key) = event::read()? { if let KeyCode::Char('q') = key.code { return Ok(()); } } } if last_tick.elapsed() >= tick_rate { last_tick = Instant::now(); } } } fn ui(f: &mut Frame, _app: &App) { let space = f.size(); let zones = TreeMapLayout::new( vec![1.0, 0.9, 0.8, 0.4, 0.3], ).with_height_multiplier(2.0).split(space); for (idx, ea_zone) in zones.into_iter().enumerate() { if idx == 0 { let zones = TreeMapLayout::new( vec![1.0, 0.9, 0.8, 0.4, 0.3], ).with_height_multiplier(2.0).split(ea_zone); for (idx, ea_zone) in zones.into_iter().enumerate() { f.render_widget(Paragraph::new(format!("0 - {idx}")).block(Block::default().borders(Borders::ALL)), ea_zone); } } else { f.render_widget(Paragraph::new(format!("{idx}")).block(Block::default().borders(Borders::ALL)), ea_zone); } } }