#![allow(unused)]
mod line;
use crate::instances::{ D2, Tegrine };
use anyhow::Result;
use crossterm::{
cursor, execute, queue,
style::{self, Color, Print},
terminal::{self, ClearType},
};
use std::io::stdout;
impl Tegrine {
pub fn draw_pixel(&mut self, ins: usize, d: usize, mut pos: D2) {
pos.x += 1 + self.x[ins].pos.x;
pos.y += 1 + self.x[ins].pos.y;
if pos.within_max(&self.ws) {
self.b[pos.y as usize][pos.x as usize] = Some((ins, d));
}
}
fn flush(&mut self, cur: &D2) -> Result<()> {
let mut out = stdout();
queue!(out, cursor::Hide, terminal::Clear(ClearType::All))?;
for (y, d) in self.b.iter().enumerate() {
for (x, d) in d.iter().enumerate() {
if let Some((ins, d)) = d {
let o = &self.x[*ins].dots[*d].color;
if o.a != 0 {
queue!(
out,
cursor::MoveTo(1 + x as u16, 1 + y as u16),
style::SetBackgroundColor(Color::Rgb {
r: o.r,
g: o.g,
b: o.b
}),
Print(' '),
style::ResetColor
)?;
}
}
}
}
execute!(
out,
cursor::MoveTo(1 + cur.x as u16, 1 + cur.y as u16),
cursor::Show
)?;
Ok(())
}
pub fn draw(&mut self, cur: &D2) -> Result<()> {
self.b = vec![vec![None; self.ws.x as usize]; self.ws.y as usize];
for ins in 0..self.x.len() {
for d in 0..self.x[ins].dots.len() {
for x in self.x[ins].dots[d].neighbors.clone() {
self.draw_line(
ins,
d,
self.x[ins].dots[d].pos.clone(),
self.x[ins].dots[x].pos.clone(),
);
}
self.draw_pixel(ins, d, self.x[ins].dots[d].pos.clone());
}
}
self.flush(cur)?;
Ok(())
}
}