generated from GarandPLG/rust-flake-template
1393f282e8
CellWidget::set_selected and set_marked now return &mut Self for method chaining. Added BoardState::undo_marked_cell to remove the last marked cell and restore focus. Backspace triggers undo, Delete clears marking.
58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
pub enum MoveFocusedCell {
|
|
Up,
|
|
Down,
|
|
Left,
|
|
Right,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
|
pub struct FocusedCell {
|
|
row: usize,
|
|
col: usize,
|
|
max_row: usize,
|
|
max_col: usize,
|
|
}
|
|
|
|
impl FocusedCell {
|
|
pub fn new(row: usize, col: usize, max_row: usize, max_col: usize) -> Self {
|
|
Self {
|
|
row,
|
|
col,
|
|
max_row,
|
|
max_col,
|
|
}
|
|
}
|
|
|
|
pub fn get_row(&self) -> usize {
|
|
self.row
|
|
}
|
|
|
|
pub fn get_col(&self) -> usize {
|
|
self.col
|
|
}
|
|
|
|
pub fn move_focused_cell(&mut self, direction: MoveFocusedCell) -> (usize, usize) {
|
|
match direction {
|
|
MoveFocusedCell::Up => {
|
|
self.row = self.row.saturating_sub(1).max(0);
|
|
}
|
|
MoveFocusedCell::Down => {
|
|
self.row = self.row.saturating_add(1).min(self.max_row - 1);
|
|
}
|
|
MoveFocusedCell::Left => {
|
|
self.col = self.col.saturating_sub(1).max(0);
|
|
}
|
|
MoveFocusedCell::Right => {
|
|
self.col = self.col.saturating_add(1).min(self.max_col - 1);
|
|
}
|
|
}
|
|
|
|
(self.row, self.col)
|
|
}
|
|
|
|
pub fn set_focused_cell(&mut self, cell: (usize, usize)) {
|
|
self.row = cell.0.max(0).min(self.max_row - 1);
|
|
self.col = cell.1.max(0).min(self.max_col - 1);
|
|
}
|
|
}
|