]> git.huck.website - cellseq.git/commitdiff
added: mask struct
authorHuck Boles <huck@huck.website>
Sat, 27 May 2023 22:19:16 +0000 (17:19 -0500)
committerHuck Boles <huck@huck.website>
Sat, 27 May 2023 22:19:16 +0000 (17:19 -0500)
src/cells.rs
src/cli.rs
src/main.rs

index e5d9b1b68ac2b6ff80cab9acf2a7cca06f88d8d0..ca92d4871b690dbc91f455f5e7fd0cdc4698a400 100644 (file)
@@ -16,9 +16,13 @@ pub struct Map {
 }
 
 impl Map {
-    pub fn new(rows: usize, cols: usize) -> Self {
-        let map = Array2::from_elem((rows, cols), Cell::new(State::Dead));
-        Self { map, rows, cols }
+    pub fn new(x: usize, y: usize) -> Self {
+        let map = Array2::from_elem((y, x), Cell::new(State::Dead));
+        Self {
+            map,
+            cols: x,
+            rows: y,
+        }
     }
 
     pub fn update(&mut self) {
index 96bda3fc67afd298b91ff24e48e9e6219bd5bd89..0ef0a8fb673cd62db0f942e6bfa5149bc320c9b4 100644 (file)
@@ -1,17 +1,82 @@
 use crate::{Map, State};
 use crossterm::{
-    cursor, execute, queue,
+    cursor,
+    event::{self, read, Event},
+    execute, queue,
     style::{self, Stylize},
     terminal, Result,
 };
-use std::io::{stdout, Write};
+use ndarray::Array2;
+use std::{
+    io::{stdout, Write},
+    ops::Deref,
+    thread,
+    time::Duration,
+};
+
+pub type Origin = (usize, usize);
+
+#[derive(Clone, Debug)]
+pub struct Mask<T: Clone> {
+    pub cols: usize,
+    pub rows: usize,
+    pub mask: Array2<Option<T>>,
+}
+
+impl<T: Clone> Mask<T> {
+    pub fn new(x: usize, y: usize) -> Self {
+        let mask = Array2::from_elem((y, x), None);
+        Self {
+            cols: x,
+            rows: y,
+            mask,
+        }
+    }
+}
 
-pub fn draw_frame(map: &Map, origin: (usize, usize)) -> Result<()> {
-    for y in 1..(map.cols - 1) {
-        for x in 1..(map.rows - 1) {
+impl<T: Clone> Deref for Mask<T> {
+    type Target = Array2<Option<T>>;
+    fn deref(&self) -> &Self::Target {
+        &self.mask
+    }
+}
+
+pub fn edit_mask<T: Clone>(mask: &Mask<T>, origin: Origin) -> Result<()> {
+    todo!()
+}
+
+pub fn draw_mask<T: Clone>(mask: &Mask<T>, origin: Origin) -> Result<()> {
+    execute!(stdout(), terminal::Clear(terminal::ClearType::All))?;
+    for x in 1..(mask.cols - 1) {
+        for y in 1..(mask.rows - 1) {
             let x_off: u16 = (x + origin.0).try_into().unwrap();
             let y_off: u16 = (y + origin.1).try_into().unwrap();
-            if map.get((x, y)).unwrap().get() == State::Alive {
+            if mask.get((y, x)).unwrap().is_some() {
+                queue!(
+                    stdout(),
+                    cursor::Hide,
+                    cursor::MoveTo(x_off, y_off),
+                    style::PrintStyledContent("■".green())
+                )?;
+            } else {
+                queue!(
+                    stdout(),
+                    cursor::Hide,
+                    cursor::MoveTo(x_off, y_off),
+                    style::PrintStyledContent("□".grey())
+                )?;
+            }
+        }
+    }
+    stdout().flush()
+}
+
+pub fn draw_frame(map: &Map, origin: Origin) -> Result<()> {
+    for x in 1..(map.cols - 1) {
+        for y in 1..(map.rows - 1) {
+            let x_off: u16 = (x + origin.0).try_into().unwrap();
+            let y_off: u16 = (y + origin.1).try_into().unwrap();
+            if map.get((y, x)).unwrap().get() == State::Alive {
                 queue!(
                     stdout(),
                     cursor::Hide,
@@ -31,15 +96,26 @@ pub fn draw_frame(map: &Map, origin: (usize, usize)) -> Result<()> {
     stdout().flush()
 }
 
-pub fn run_map(map: &mut Map, origin: (usize, usize), time: usize) -> Result<()> {
-    let mut stdout = stdout();
+pub fn run_map(map: &mut Map, origin: Origin, time: Duration) -> Result<()> {
     loop {
         map.update();
 
-        execute!(stdout, terminal::Clear(terminal::ClearType::All))?;
+        execute!(stdout(), terminal::Clear(terminal::ClearType::All))?;
 
         draw_frame(&map, origin)?;
 
-        std::thread::sleep(std::time::Duration::from_millis(time.try_into().unwrap()));
+        thread::sleep(time);
+    }
+}
+
+pub fn loop_map(map: &mut Map, origin: (usize, usize), time: Duration, steps: usize) -> Result<()> {
+    loop {
+        let mut tmp = map.clone();
+        for _ in 0..steps {
+            execute!(stdout(), terminal::Clear(terminal::ClearType::All))?;
+            draw_frame(&tmp, origin)?;
+            tmp.update();
+            thread::sleep(time);
+        }
     }
 }
index 7014fcedbc97f99aa2c8f62bf442eee41e54f25a..c5a7442b49020633663ab488b1cd42b38487267f 100644 (file)
@@ -2,9 +2,12 @@ use cellseq::*;
 use eyre::Result;
 
 fn main() -> Result<()> {
+    let mut mask: Mask<bool> = Mask::new(48, 24);
     let mut map = Map::new(48, 24);
     map.randomize(0.75);
 
-    run_map(&mut map, (10, 5), 300)?;
+    // loop_map(&mut map, (10, 5), std::time::Duration::from_millis(250), 32)?;
+    // draw_mask::<bool>(&mask, (10, 5))?;
+    edit_mask(&mask, (10, 5))?;
     Ok(())
 }