fdtd-coremem/crates/post/src/bin/viewer.rs

67 lines
2.3 KiB
Rust

//! 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();
}