Refactor visualize.
This commit is contained in:
parent
5a6be3194e
commit
0c1345053b
3 changed files with 189 additions and 181 deletions
|
|
@ -1,181 +0,0 @@
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
use std::io::Write;
|
|
||||||
use termcolor::{ColorSpec, StandardStream, WriteColor};
|
|
||||||
|
|
||||||
use crate::prelude::*;
|
|
||||||
|
|
||||||
pub trait Visualize {
|
|
||||||
fn visualize(&self) -> Visualization;
|
|
||||||
|
|
||||||
fn print_visualization(&self) {
|
|
||||||
let v = self.visualize();
|
|
||||||
|
|
||||||
let stdout = &mut StandardStream::stdout(termcolor::ColorChoice::Always);
|
|
||||||
|
|
||||||
let width_digits = (v.size.x - 1).ilog10() + 1;
|
|
||||||
let height_digits = (v.size.y - 1).ilog10() + 1;
|
|
||||||
|
|
||||||
// print header
|
|
||||||
for i in 0..width_digits {
|
|
||||||
let d = width_digits - i - 1;
|
|
||||||
|
|
||||||
//padding
|
|
||||||
for _ in 0..height_digits {
|
|
||||||
write!(stdout, " ").unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
for x in 0..v.size.x {
|
|
||||||
let digits = x / (i32::pow(10, d));
|
|
||||||
if digits == 0 && d > 0 {
|
|
||||||
write!(stdout, " ").unwrap();
|
|
||||||
} else {
|
|
||||||
write!(
|
|
||||||
stdout,
|
|
||||||
"{}",
|
|
||||||
char::from_u32((digits % 10) as u32 + 48).unwrap()
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
writeln!(stdout).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
for y in 0..v.size.y {
|
|
||||||
write!(stdout, "{:1$}", y, height_digits as usize).unwrap();
|
|
||||||
|
|
||||||
for x in 0..v.size.x {
|
|
||||||
if let Some((s, fg, bg)) = v.symbols.get(&Position::new(x, y)) {
|
|
||||||
let mut c = ColorSpec::new();
|
|
||||||
c.set_fg(fg.as_ref().map(|c| termcolor::Color::Rgb(c.r, c.g, c.b)));
|
|
||||||
c.set_bg(bg.as_ref().map(|c| termcolor::Color::Rgb(c.r, c.g, c.b)));
|
|
||||||
stdout.set_color(&c).unwrap();
|
|
||||||
write!(stdout, "{:1}", s.get_str()).unwrap();
|
|
||||||
stdout.reset().unwrap();
|
|
||||||
} else {
|
|
||||||
write!(stdout, " ").unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
writeln!(stdout, "{:1$}", y, height_digits as usize).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in 0..width_digits {
|
|
||||||
let d = width_digits - i - 1;
|
|
||||||
|
|
||||||
//padding
|
|
||||||
for _ in 0..height_digits {
|
|
||||||
write!(stdout, " ").unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
for x in 0..v.size.x {
|
|
||||||
let digits = x / (i32::pow(10, d));
|
|
||||||
if digits == 0 && d > 0 {
|
|
||||||
write!(stdout, " ").unwrap();
|
|
||||||
} else {
|
|
||||||
write!(
|
|
||||||
stdout,
|
|
||||||
"{}",
|
|
||||||
char::from_u32((digits % 10) as u32 + 48).unwrap()
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
writeln!(stdout).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum Symbol {
|
|
||||||
Arrow(Direction),
|
|
||||||
ArrowEnter(Direction),
|
|
||||||
ArrowExit(Direction),
|
|
||||||
Char(&'static str),
|
|
||||||
Block,
|
|
||||||
Space,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Symbol {
|
|
||||||
fn get_str(&self) -> &'static str {
|
|
||||||
match self {
|
|
||||||
Symbol::Arrow(dir) => match dir {
|
|
||||||
Direction::Up => "↑",
|
|
||||||
Direction::Right => "→",
|
|
||||||
Direction::Down => "↓",
|
|
||||||
Direction::Left => "←",
|
|
||||||
},
|
|
||||||
Symbol::ArrowEnter(dir) => match dir {
|
|
||||||
Direction::Up => "↟",
|
|
||||||
Direction::Right => "↠",
|
|
||||||
Direction::Down => "↡",
|
|
||||||
Direction::Left => "↞",
|
|
||||||
},
|
|
||||||
Symbol::ArrowExit(dir) => match dir {
|
|
||||||
Direction::Up => "↥",
|
|
||||||
Direction::Right => "↦",
|
|
||||||
Direction::Down => "↧",
|
|
||||||
Direction::Left => "↤",
|
|
||||||
},
|
|
||||||
Symbol::Char(c) => c.split_at(1).0,
|
|
||||||
Symbol::Block => "#",
|
|
||||||
Symbol::Space => " ",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_char(&self) -> char {
|
|
||||||
self.get_str().chars().next().unwrap()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Visualization {
|
|
||||||
size: Position,
|
|
||||||
symbols: HashMap<Position, (Symbol, Option<Color>, Option<Color>)>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
pub struct Color {
|
|
||||||
r: u8,
|
|
||||||
g: u8,
|
|
||||||
b: u8,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Color {
|
|
||||||
pub fn new(r: u8, g: u8, b: u8) -> Self {
|
|
||||||
Self { r, g, b }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn index(i: usize) -> Self {
|
|
||||||
let c = [
|
|
||||||
Color::new(0xe6, 0x00, 0x49),
|
|
||||||
Color::new(0x0b, 0xb4, 0xff),
|
|
||||||
Color::new(0x50, 0xe9, 0x91),
|
|
||||||
Color::new(0xe6, 0xd8, 0x00),
|
|
||||||
Color::new(0x9b, 0x19, 0xf5),
|
|
||||||
Color::new(0xff, 0xa3, 0x00),
|
|
||||||
Color::new(0xdc, 0x0a, 0xb4),
|
|
||||||
Color::new(0xb3, 0xd4, 0xff),
|
|
||||||
Color::new(0x00, 0xbf, 0xa0),
|
|
||||||
];
|
|
||||||
|
|
||||||
c[i % c.len()]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Visualization {
|
|
||||||
pub fn new(size: Position) -> Self {
|
|
||||||
Self {
|
|
||||||
size,
|
|
||||||
symbols: HashMap::new(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_symbol(
|
|
||||||
&mut self,
|
|
||||||
pos: Position,
|
|
||||||
symbol: Symbol,
|
|
||||||
fg: Option<Color>,
|
|
||||||
bg: Option<Color>,
|
|
||||||
) {
|
|
||||||
self.symbols.insert(pos, (symbol, fg, bg));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
108
src/common/visualize/mod.rs
Normal file
108
src/common/visualize/mod.rs
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
mod print;
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
pub trait Visualize {
|
||||||
|
fn visualize(&self) -> Visualization;
|
||||||
|
|
||||||
|
fn print_visualization(&self) {
|
||||||
|
let v = self.visualize();
|
||||||
|
print::print(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum Symbol {
|
||||||
|
Arrow(Direction),
|
||||||
|
ArrowEnter(Direction),
|
||||||
|
ArrowExit(Direction),
|
||||||
|
Char(&'static str),
|
||||||
|
Block,
|
||||||
|
Space,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Symbol {
|
||||||
|
fn get_str(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
Symbol::Arrow(dir) => match dir {
|
||||||
|
Direction::Up => "↑",
|
||||||
|
Direction::Right => "→",
|
||||||
|
Direction::Down => "↓",
|
||||||
|
Direction::Left => "←",
|
||||||
|
},
|
||||||
|
Symbol::ArrowEnter(dir) => match dir {
|
||||||
|
Direction::Up => "↟",
|
||||||
|
Direction::Right => "↠",
|
||||||
|
Direction::Down => "↡",
|
||||||
|
Direction::Left => "↞",
|
||||||
|
},
|
||||||
|
Symbol::ArrowExit(dir) => match dir {
|
||||||
|
Direction::Up => "↥",
|
||||||
|
Direction::Right => "↦",
|
||||||
|
Direction::Down => "↧",
|
||||||
|
Direction::Left => "↤",
|
||||||
|
},
|
||||||
|
Symbol::Char(c) => c.split_at(1).0,
|
||||||
|
Symbol::Block => "#",
|
||||||
|
Symbol::Space => " ",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fn get_char(&self) -> char {
|
||||||
|
// self.get_str().chars().next().unwrap()
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Visualization {
|
||||||
|
size: Position,
|
||||||
|
symbols: HashMap<Position, (Symbol, Option<Color>, Option<Color>)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct Color {
|
||||||
|
r: u8,
|
||||||
|
g: u8,
|
||||||
|
b: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Color {
|
||||||
|
pub fn new(r: u8, g: u8, b: u8) -> Self {
|
||||||
|
Self { r, g, b }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn index(i: usize) -> Self {
|
||||||
|
let c = [
|
||||||
|
Color::new(0xe6, 0x00, 0x49),
|
||||||
|
Color::new(0x0b, 0xb4, 0xff),
|
||||||
|
Color::new(0x50, 0xe9, 0x91),
|
||||||
|
Color::new(0xe6, 0xd8, 0x00),
|
||||||
|
Color::new(0x9b, 0x19, 0xf5),
|
||||||
|
Color::new(0xff, 0xa3, 0x00),
|
||||||
|
Color::new(0xdc, 0x0a, 0xb4),
|
||||||
|
Color::new(0xb3, 0xd4, 0xff),
|
||||||
|
Color::new(0x00, 0xbf, 0xa0),
|
||||||
|
];
|
||||||
|
|
||||||
|
c[i % c.len()]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Visualization {
|
||||||
|
pub fn new(size: Position) -> Self {
|
||||||
|
Self {
|
||||||
|
size,
|
||||||
|
symbols: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_symbol(
|
||||||
|
&mut self,
|
||||||
|
pos: Position,
|
||||||
|
symbol: Symbol,
|
||||||
|
fg: Option<Color>,
|
||||||
|
bg: Option<Color>,
|
||||||
|
) {
|
||||||
|
self.symbols.insert(pos, (symbol, fg, bg));
|
||||||
|
}
|
||||||
|
}
|
||||||
81
src/common/visualize/print.rs
Normal file
81
src/common/visualize/print.rs
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
use super::Visualization;
|
||||||
|
|
||||||
|
use std::io::Write;
|
||||||
|
use termcolor::{ColorSpec, StandardStream, WriteColor};
|
||||||
|
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
pub(super) fn print(v: Visualization) {
|
||||||
|
let stdout = &mut StandardStream::stdout(termcolor::ColorChoice::Always);
|
||||||
|
|
||||||
|
let width_digits = (v.size.x - 1).ilog10() + 1;
|
||||||
|
let height_digits = (v.size.y - 1).ilog10() + 1;
|
||||||
|
|
||||||
|
// print header
|
||||||
|
for i in 0..width_digits {
|
||||||
|
let d = width_digits - i - 1;
|
||||||
|
|
||||||
|
//padding
|
||||||
|
for _ in 0..height_digits {
|
||||||
|
write!(stdout, " ").unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
for x in 0..v.size.x {
|
||||||
|
let digits = x / (i32::pow(10, d));
|
||||||
|
if digits == 0 && d > 0 {
|
||||||
|
write!(stdout, " ").unwrap();
|
||||||
|
} else {
|
||||||
|
write!(
|
||||||
|
stdout,
|
||||||
|
"{}",
|
||||||
|
char::from_u32((digits % 10) as u32 + 48).unwrap()
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writeln!(stdout).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
for y in 0..v.size.y {
|
||||||
|
write!(stdout, "{:1$}", y, height_digits as usize).unwrap();
|
||||||
|
|
||||||
|
for x in 0..v.size.x {
|
||||||
|
if let Some((s, fg, bg)) = v.symbols.get(&Position::new(x, y)) {
|
||||||
|
let mut c = ColorSpec::new();
|
||||||
|
c.set_fg(fg.as_ref().map(|c| termcolor::Color::Rgb(c.r, c.g, c.b)));
|
||||||
|
c.set_bg(bg.as_ref().map(|c| termcolor::Color::Rgb(c.r, c.g, c.b)));
|
||||||
|
stdout.set_color(&c).unwrap();
|
||||||
|
write!(stdout, "{:1}", s.get_str()).unwrap();
|
||||||
|
stdout.reset().unwrap();
|
||||||
|
} else {
|
||||||
|
write!(stdout, " ").unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writeln!(stdout, "{:1$}", y, height_digits as usize).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in 0..width_digits {
|
||||||
|
let d = width_digits - i - 1;
|
||||||
|
|
||||||
|
//padding
|
||||||
|
for _ in 0..height_digits {
|
||||||
|
write!(stdout, " ").unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
for x in 0..v.size.x {
|
||||||
|
let digits = x / (i32::pow(10, d));
|
||||||
|
if digits == 0 && d > 0 {
|
||||||
|
write!(stdout, " ").unwrap();
|
||||||
|
} else {
|
||||||
|
write!(
|
||||||
|
stdout,
|
||||||
|
"{}",
|
||||||
|
char::from_u32((digits % 10) as u32 + 48).unwrap()
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writeln!(stdout).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue