generated from GarandPLG/rust-flake-template
Encapsulate cell selection and simplify board rendering
This commit is contained in:
@@ -45,7 +45,7 @@ impl BoardState {
|
|||||||
|
|
||||||
for row in 0..map_height {
|
for row in 0..map_height {
|
||||||
for col in 0..map_width {
|
for col in 0..map_width {
|
||||||
cells.push(CellWidget::new(row, col, false));
|
cells.push(CellWidget::new(row, col));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-15
@@ -1,4 +1,4 @@
|
|||||||
use crate::app::states::skirmish_states::BoardState;
|
use crate::app::{states::skirmish_states::BoardState, widgets::CellWidget};
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
buffer::Buffer,
|
buffer::Buffer,
|
||||||
layout::{Constraint, Layout, Rect},
|
layout::{Constraint, Layout, Rect},
|
||||||
@@ -34,21 +34,21 @@ impl Widget for BoardWidget<'_> {
|
|||||||
.split(*col_area);
|
.split(*col_area);
|
||||||
|
|
||||||
for (row_idx, cell_area) in vertical.iter().enumerate() {
|
for (row_idx, cell_area) in vertical.iter().enumerate() {
|
||||||
if let Some(cell) = self.state.cells.get(
|
let map_row: usize = row_idx + self.state.vertical_offset.get_value();
|
||||||
(row_idx + self.state.vertical_offset.get_value()) * self.state.map_width
|
let map_col: usize = col_idx + self.state.horizontal_offset.get_value();
|
||||||
+ (col_idx + self.state.horizontal_offset.get_value()),
|
|
||||||
) {
|
|
||||||
// FIXME: Fix showing selected cell
|
|
||||||
|
|
||||||
// if row_idx + self.state.vertical_offset.get_value()
|
if let Some(template) = self
|
||||||
// == self.state.focused_cell.row
|
.state
|
||||||
// && col_idx + self.state.horizontal_offset.get_value()
|
.cells
|
||||||
// == self.state.focused_cell.col
|
.get(map_row * self.state.map_width + map_col)
|
||||||
// {
|
{
|
||||||
// cell.selected = true;
|
let mut cell: CellWidget = *template;
|
||||||
// } else {
|
|
||||||
// cell.selected = false;
|
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);
|
cell.render(*cell_area, buf);
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-5
@@ -17,13 +17,21 @@ use ratatui::{
|
|||||||
pub struct CellWidget {
|
pub struct CellWidget {
|
||||||
pub row: usize,
|
pub row: usize,
|
||||||
pub col: usize,
|
pub col: usize,
|
||||||
pub selected: bool,
|
selected: bool,
|
||||||
// pub tags: Vec<CellTags>,
|
// pub tags: Vec<CellTags>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CellWidget {
|
impl CellWidget {
|
||||||
pub fn new(row: usize, col: usize, selected: bool) -> Self {
|
pub fn new(row: usize, col: usize) -> Self {
|
||||||
Self { row, col, selected }
|
Self {
|
||||||
|
row,
|
||||||
|
col,
|
||||||
|
selected: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_selected(&mut self, selected: bool) {
|
||||||
|
self.selected = selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn col_to_letters(&self) -> String {
|
fn col_to_letters(&self) -> String {
|
||||||
@@ -42,7 +50,7 @@ impl CellWidget {
|
|||||||
format!("{}{}", self.col_to_letters(), self.row)
|
format!("{}{}", self.col_to_letters(), self.row)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_selected(&self) -> Color {
|
fn fg_color(&self) -> Color {
|
||||||
if self.selected {
|
if self.selected {
|
||||||
Color::Red
|
Color::Red
|
||||||
} else {
|
} else {
|
||||||
@@ -58,7 +66,7 @@ impl Widget for CellWidget {
|
|||||||
.block(
|
.block(
|
||||||
Block::default()
|
Block::default()
|
||||||
.borders(Borders::ALL)
|
.borders(Borders::ALL)
|
||||||
.style(Style::default().fg(self.is_selected()))
|
.style(Style::default().fg(self.fg_color()))
|
||||||
.title(self.display_coords().green())
|
.title(self.display_coords().green())
|
||||||
.padding(Padding {
|
.padding(Padding {
|
||||||
left: 0,
|
left: 0,
|
||||||
|
|||||||
Reference in New Issue
Block a user