//! interactive CLI viewer for .bc files. //! navigate through the simulation over time and space, //! and toggle views to see more detail over material, electric, or magnetic changes. use coremem_post::{Loader, Viewer}; use std::path::PathBuf; use std::io::Write as _; use std::time::Duration; use structopt::StructOpt; use crossterm::{cursor, QueueableCommand as _}; use crossterm::event::{Event, KeyCode}; use crossterm::style::{style, PrintStyledContent}; #[derive(Debug, StructOpt)] struct Opt { directory: PathBuf, } fn event_loop(mut viewer: Viewer) { loop { let mut time_steps = 0; let mut z_steps = 0; while crossterm::event::poll(Duration::from_millis(0)).unwrap() { match crossterm::event::read().unwrap() { Event::Key(e) => match e.code { KeyCode::Left => time_steps -= 1, KeyCode::PageUp => time_steps -= 10, KeyCode::Right => time_steps += 1, KeyCode::PageDown => time_steps += 10, KeyCode::Up => z_steps += 1, KeyCode::Down => z_steps -= 1, KeyCode::Char('q') => return, KeyCode::Char('w') => viewer.render_config().decrease_range(), KeyCode::Char('s') => viewer.render_config().increase_range(), KeyCode::Char('d') => viewer.render_config().next_mode(), KeyCode::Char('a') => viewer.render_config().prev_mode(), _ => {}, }, _ => {}, } } viewer.navigate(time_steps, z_steps); let mut stdout = std::io::stdout(); stdout.queue(cursor::MoveToColumn(30)).unwrap(); stdout.queue(PrintStyledContent(style("wasd=appearance; arrows,PgUp/PgDown=navigate; q=quit"))).unwrap(); stdout.flush().unwrap(); let _ = crossterm::event::poll(Duration::from_millis(33)).unwrap(); } } fn main() { let opt = Opt::from_args(); let loader = Loader::new(opt.directory); let viewer = Viewer::new(loader); // disable line buffering crossterm::terminal::enable_raw_mode().unwrap(); viewer.render(); event_loop(viewer); // return the terminal to its original state crossterm::terminal::disable_raw_mode().unwrap(); }