aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/debug.txt13
-rw-r--r--src/generation.rs34
-rw-r--r--src/ui.rs69
3 files changed, 65 insertions, 51 deletions
diff --git a/src/debug.txt b/src/debug.txt
deleted file mode 100644
index 1aec867..0000000
--- a/src/debug.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-warning: function `render_gen` is never used
- --> src/generation.rs:38:8
- |
-38 | pub fn render_gen(chunk: &Rect, gen: &Gen) {
- | ^^^^^^^^^^
- |
- = note: `#[warn(dead_code)]` on by default
-
-warning: `gof-rs` (bin "gof-rs") generated 1 warning
- Finished dev [unoptimized + debuginfo] target(s) in 0.02s
- Running `/home/pengu/test/rust-dev/gof-rs/target/debug/gof-rs`
-heigt: 44
-width: 62
diff --git a/src/generation.rs b/src/generation.rs
index f889c72..249754d 100644
--- a/src/generation.rs
+++ b/src/generation.rs
@@ -13,8 +13,11 @@ use crossterm::{
};
use rand::{thread_rng, Rng};
use std::{
+ env,
error::Error,
- io::{self, Write},
+ fs::File,
+ io::{self, BufRead, BufReader, Write},
+ path::Path,
thread::sleep,
time::Duration,
};
@@ -56,7 +59,7 @@ pub fn new_gen(chunk: &Rect, app: &mut App) -> Gen {
let mut grid: Vec<Vec<Cell>> = Vec::new();
for _ in 0..rows {
let mut row: Vec<Cell> = Vec::new();
- for _ in 0..cols{
+ for _ in 0..cols {
let rand = thread_rng().gen_range(0..10);
row.push(cells[rand % 5]);
}
@@ -67,7 +70,7 @@ pub fn new_gen(chunk: &Rect, app: &mut App) -> Gen {
pub fn gen_to_spans(gen: &Gen) -> Vec<Spans> {
let mut spans = vec![];
- let alive_cells = vec!["🟥","🟧","🟨","🟩","🟦", "🟪" ,"🟫"];
+ let alive_cells = vec!["🟥", "🟧", "🟨", "🟩", "🟦", "🟪", "🟫"];
for i in 0..gen.len() {
let mut txt = String::new();
for j in 0..gen[0].len() {
@@ -75,7 +78,8 @@ pub fn gen_to_spans(gen: &Gen) -> Vec<Spans> {
match gen[i][j] {
// Cell::Alive => print!("😎"),
// Cell::Alive => txt.push_str("🦀"),
- Cell::Alive => txt.push_str(alive_cells[rand % alive_cells.len()]),
+ // Cell::Alive => txt.push_str(alive_cells[rand % alive_cells.len()]),
+ Cell::Alive => txt.push_str(alive_cells[0]),
Cell::Dead => txt.push_str("⬛️"),
// Cell::Alive => txt.push('X'),
// Cell::Dead => txt.push('-'),
@@ -86,7 +90,7 @@ pub fn gen_to_spans(gen: &Gen) -> Vec<Spans> {
spans
}
-// pub fn
+// pub fn
pub fn is_valid_idx(i: i32, j: i32, m: i32, n: i32) -> bool {
i >= 0 && i < m && j >= 0 && j < n
@@ -151,6 +155,26 @@ pub fn next_gen(app: &mut App) -> Gen {
nxt_gen
}
+pub fn gen_from_file(path: &Path) -> Gen {
+ let mut gen = Gen::new();
+ let file = File::open(path).expect("File not found");
+ let reader = BufReader::new(file);
+
+ for line in reader.lines() {
+ let line = line.unwrap();
+ let mut row: Vec<Cell> = vec![];
+ for ch in line.chars() {
+ if ch == '.' {
+ row.push(Cell::Dead);
+ } else {
+ row.push(Cell::Alive);
+ }
+ }
+ gen.push(row);
+ }
+ gen
+}
+
pub fn init() -> Result<(), Box<dyn Error>> {
// setup terminal
enable_raw_mode()?;
diff --git a/src/ui.rs b/src/ui.rs
index 16f8640..af2da2e 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -6,6 +6,7 @@ use crossterm::{
use std::{
error::Error,
io,
+ path::Path,
thread::sleep,
time::{Duration, Instant},
};
@@ -73,7 +74,7 @@ impl<T> StatefulList<T> {
/// Check the event handling at the bottom to see how to change the state on incoming events.
/// Check the drawing logic for items on how to specify the highlighting style for selected items.
pub struct App<'a> {
- pub items: StatefulList<(&'a str, usize)>,
+ pub items: StatefulList<(&'a str, &'a Path)>,
pub flag_cur: bool,
pub layout: Layout,
pub cur_gen: Gen,
@@ -85,21 +86,30 @@ impl<'a> App<'a> {
pub fn new() -> App<'a> {
App {
items: StatefulList::with_items(vec![
- ("Glider", 1),
- ("achimsotherp16", 2),
- ("achimsp11", 3),
- ("achimsp144", 4),
- ("achimsp16", 4),
- ("achimsp4", 4),
- ("achimsp5original", 4),
- ("achimsp8", 4),
- ("aforall", 4),
- ("againstthegraingeryshep", 4),
- ("aircraftcarrier", 4),
- ("almostgun1", 4),
- ("almostgun2", 4),
- ("almostknightship", 4),
- ("alternatewickstretcher1", 4),
+ (
+ "glider",
+ Path::new("/home/pengu/test/rust-dev/gof-rs/presets/glider.txt"),
+ ),
+ (
+ "pattern1",
+ Path::new("/home/pengu/test/rust-dev/gof-rs/presets/pattern1.txt"),
+ ),
+ (
+ "pattern2",
+ Path::new("/home/pengu/test/rust-dev/gof-rs/presets/pattern2.txt"),
+ ),
+ (
+ "pattern3",
+ Path::new("/home/pengu/test/rust-dev/gof-rs/presets/pattern3.txt"),
+ ),
+ // (
+ // "pattern4",
+ // Path::new("/home/pengu/test/rust-dev/gof-rs/presets/pattern4.txt"),
+ // ),
+ // (
+ // "pattern5",
+ // Path::new("/home/pengu/test/rust-dev/gof-rs/presets/pattern5.txt"),
+ // ),
]),
flag_cur: false,
layout: Layout::default()
@@ -109,13 +119,6 @@ impl<'a> App<'a> {
nxt_gen: Gen::new(),
}
}
-
- // Rotate through the event list.
- // This only exists to simulate some kind of "progress"
- // fn on_tick(&mut self) {
- // let event = self.events.remove(0);
- // self.events.push(event);
- // }
}
pub fn run_app<B: Backend>(
@@ -124,6 +127,7 @@ pub fn run_app<B: Backend>(
tick_rate: Duration,
) -> io::Result<()> {
let mut last_tick = Instant::now();
+ let mut item_cnt = 0;
loop {
terminal.draw(|f| ui_list(f, &mut app))?;
@@ -133,7 +137,12 @@ pub fn run_app<B: Backend>(
match key.code {
KeyCode::Char('q') => return Ok(()),
KeyCode::Left | KeyCode::Char('h') => app.items.unselect(),
- KeyCode::Down | KeyCode::Char('j') => app.items.next(),
+ KeyCode::Down | KeyCode::Char('j') => {
+ app.items.next();
+ app.cur_gen =
+ gen_from_file(app.items.items[item_cnt % app.items.items.len()].1);
+ item_cnt += 1;
+ }
KeyCode::Up | KeyCode::Char('k') => app.items.previous(),
KeyCode::Char('n') => {
terminal.draw(|f| ui_game(f, &mut app))?;
@@ -148,7 +157,7 @@ pub fn run_app<B: Backend>(
_ => {}
}
}
- }
+ }
},
_ => {}
}
@@ -158,9 +167,8 @@ pub fn run_app<B: Backend>(
}
fn ui_list<B: Backend>(f: &mut Frame<B>, app: &mut App) {
-
let chunks = app.layout.split(f.size());
- // Iterate through all elements in the `items` app and append some debug text to it.
+
let items: Vec<ListItem> = app
.items
.items
@@ -171,7 +179,6 @@ fn ui_list<B: Backend>(f: &mut Frame<B>, app: &mut App) {
})
.collect();
- // Create a List from all list items and highlight the currently selected one
let items = List::new(items)
.block(Block::default().borders(Borders::ALL).title("List"))
.highlight_style(
@@ -181,12 +188,11 @@ fn ui_list<B: Backend>(f: &mut Frame<B>, app: &mut App) {
)
.highlight_symbol("> ");
- // We can now render the item list
f.render_stateful_widget(items, chunks[0], &mut app.items.state);
-
if !app.flag_cur {
app.cur_gen = new_gen(&chunks[1], app);
+ // app.cur_gen = gen_from_file(Path::new("/home/pengu/test/rust-dev/gof-rs/presets/glider.txt"));
}
let spans = gen_to_spans(&app.cur_gen);
@@ -205,10 +211,8 @@ fn ui_list<B: Backend>(f: &mut Frame<B>, app: &mut App) {
.block(create_block(" Game Of Life "))
.alignment(Alignment::Center);
f.render_widget(paragraph, chunks[1]);
-
}
-
fn ui_game<B: Backend>(f: &mut Frame<B>, app: &mut App) {
let chunks = app.layout.split(f.size());
@@ -253,5 +257,4 @@ fn ui_game<B: Backend>(f: &mut Frame<B>, app: &mut App) {
.block(create_block(" Game Of Life "))
.alignment(Alignment::Center);
f.render_widget(paragraph, chunks[1]);
-
}