From 3f646de3bba79f51ddefa0e9862c6e1ebb227832 Mon Sep 17 00:00:00 2001 From: GarandPLG Date: Tue, 7 Apr 2026 17:48:05 +0200 Subject: [PATCH] Encapsulate cell selection and simplify board rendering --- src/app/states/skirmish_states/board.rs | 2 +- src/app/widgets/board.rs | 30 ++++++++++++------------- src/app/widgets/cell.rs | 18 ++++++++++----- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/app/states/skirmish_states/board.rs b/src/app/states/skirmish_states/board.rs index 5d56561..900d19b 100644 --- a/src/app/states/skirmish_states/board.rs +++ b/src/app/states/skirmish_states/board.rs @@ -45,7 +45,7 @@ impl BoardState { for row in 0..map_height { for col in 0..map_width { - cells.push(CellWidget::new(row, col, false)); + cells.push(CellWidget::new(row, col)); } } diff --git a/src/app/widgets/board.rs b/src/app/widgets/board.rs index 687acdf..86a9ff4 100644 --- a/src/app/widgets/board.rs +++ b/src/app/widgets/board.rs @@ -1,4 +1,4 @@ -use crate::app::states::skirmish_states::BoardState; +use crate::app::{states::skirmish_states::BoardState, widgets::CellWidget}; use ratatui::{ buffer::Buffer, layout::{Constraint, Layout, Rect}, @@ -34,21 +34,21 @@ impl Widget for BoardWidget<'_> { .split(*col_area); for (row_idx, cell_area) in vertical.iter().enumerate() { - if let Some(cell) = self.state.cells.get( - (row_idx + self.state.vertical_offset.get_value()) * self.state.map_width - + (col_idx + self.state.horizontal_offset.get_value()), - ) { - // FIXME: Fix showing selected cell + let map_row: usize = row_idx + self.state.vertical_offset.get_value(); + let map_col: usize = col_idx + self.state.horizontal_offset.get_value(); - // if row_idx + self.state.vertical_offset.get_value() - // == self.state.focused_cell.row - // && col_idx + self.state.horizontal_offset.get_value() - // == self.state.focused_cell.col - // { - // cell.selected = true; - // } else { - // cell.selected = false; - // } + if let Some(template) = self + .state + .cells + .get(map_row * self.state.map_width + map_col) + { + let mut cell: CellWidget = *template; + + if map_row == self.state.focused_cell.get_row() + && map_col == self.state.focused_cell.get_col() + { + cell.set_selected(true); + } cell.render(*cell_area, buf); } diff --git a/src/app/widgets/cell.rs b/src/app/widgets/cell.rs index c0de3b4..2dfc31e 100644 --- a/src/app/widgets/cell.rs +++ b/src/app/widgets/cell.rs @@ -17,13 +17,21 @@ use ratatui::{ pub struct CellWidget { pub row: usize, pub col: usize, - pub selected: bool, + selected: bool, // pub tags: Vec, } impl CellWidget { - pub fn new(row: usize, col: usize, selected: bool) -> Self { - Self { row, col, selected } + pub fn new(row: usize, col: usize) -> Self { + Self { + row, + col, + selected: false, + } + } + + pub fn set_selected(&mut self, selected: bool) { + self.selected = selected; } fn col_to_letters(&self) -> String { @@ -42,7 +50,7 @@ impl CellWidget { format!("{}{}", self.col_to_letters(), self.row) } - fn is_selected(&self) -> Color { + fn fg_color(&self) -> Color { if self.selected { Color::Red } else { @@ -58,7 +66,7 @@ impl Widget for CellWidget { .block( Block::default() .borders(Borders::ALL) - .style(Style::default().fg(self.is_selected())) + .style(Style::default().fg(self.fg_color())) .title(self.display_coords().green()) .padding(Padding { left: 0,