From 529a1be7df0acfba14d64de922a410e36d1193cd Mon Sep 17 00:00:00 2001 From: Greg Hellings Date: Wed, 16 Oct 2024 14:33:21 -0500 Subject: [PATCH] Now with GUI display --- src/board.rs | 18 +++++++++++++++++- src/lib.rs | 1 + src/main.rs | 31 +++++++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/board.rs b/src/board.rs index 1465e32..3355efe 100644 --- a/src/board.rs +++ b/src/board.rs @@ -1,7 +1,7 @@ use crate::cell::{Cell, CellValue}; use std::collections::HashSet; use std::fmt; -use ndarray::prelude::*; +use ndarray::{prelude::*, ViewRepr}; const REGION_SIZE: usize = 9; const SUB_REGION_SIZE: usize = 3; @@ -74,6 +74,22 @@ impl Board { pub fn candidates(&self, point: &Point) -> HashSet { self.cells[point.coordinates()].candidates() } + + pub fn row_range(&self) -> std::ops::Range { + 0..REGION_SIZE + } + + pub fn col_range(&self) -> std::ops::Range { + 0..REGION_SIZE + } + + pub fn row_iter(&self, row: usize) -> ndarray::ArrayBase, Dim<[usize; 1]>> { + self.cells.slice(s![row, ..]) + } + + pub fn col_iter(&self, col: usize) -> ndarray::ArrayBase, Dim<[usize; 1]>> { + self.cells.slice(s![.., col]) + } } #[derive(PartialEq, Debug)] diff --git a/src/lib.rs b/src/lib.rs index 299024b..08f30de 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,4 +3,5 @@ mod board; pub use board::Board; pub use board::Point; +pub use cell::Cell; pub use cell::CellValue; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 15964c4..390d267 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,6 @@ use iced::widget::button; use iced::widget::text; use rustdoku::Board; -use rustdoku::CellValue; -use rustdoku::Point; use iced; @@ -25,12 +23,37 @@ impl Default for State { } } -fn update(state: &mut State, message: Message) { +fn display_cell(cell: &rustdoku::Cell) -> iced::Element { + let display = match cell.value() { + Some(v) => v.to_string(), + None => "?".to_string(), + }; + button(text(display)).on_press(Message::Pressed).into() +} + +fn update(state: &mut State, _message: Message) { state.message = "Hello, world".to_string(); } fn display(state: &State) -> iced::Element { - button(text(&state.message)).on_press(Message::Pressed).into() + let mut column: Vec> = Vec::with_capacity(9); + for row_idx in state.board.row_range() { + let row: Vec> = state.board + .row_iter(row_idx) + .into_iter() + .map(|c| display_cell(c)) + .into_iter() + .collect(); + column.push( + iced::widget::Row::with_children(row) + .spacing(3) + .into() + ); + } + + iced::widget::Column::with_children(column) + .spacing(3) + .into() } fn main() -> iced::Result {