67 lines
2.3 KiB
Rust
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();
|
|
}
|