Selection and Highlighting appears okay

Still need to appropriately test with piles of visible cards > 1
This commit is contained in:
2025-06-28 00:44:03 +01:00
parent 9f1eac75a0
commit 6b4105ecd9

View File

@@ -39,7 +39,7 @@ impl Default for App {
const CARD_HEIGHT: u16 = 11; const CARD_HEIGHT: u16 = 11;
const CARD_WIDTH: u16 = 15; const CARD_WIDTH: u16 = 15;
fn draw_waste(cards_in_waste: &Vec<card_stuffs::Card>, area: Rect, frame: &mut Frame, highlight: bool) { fn draw_waste(cards_in_waste: &Vec<card_stuffs::Card>, area: Rect, frame: &mut Frame, highlight: bool, selected: bool) {
let horizontal = Layout::horizontal([ let horizontal = Layout::horizontal([
Constraint::Length(3), Constraint::Length(3),
Constraint::Length(3), Constraint::Length(3),
@@ -50,7 +50,7 @@ fn draw_waste(cards_in_waste: &Vec<card_stuffs::Card>, area: Rect, frame: &mut F
// There must be a better way to do all of this // There must be a better way to do all of this
if cards_in_waste.len() == 0 { if cards_in_waste.len() == 0 {
frame.render_widget( frame.render_widget(
empty_pile(highlight), empty_pile(highlight, selected),
top_waste top_waste
); );
} }
@@ -143,11 +143,27 @@ impl App {
deck_area deck_area
); );
draw_waste(&self.cards.waste, waste_area, frame, self.highlighted_card == CardPosition::TopWaste); {
let highlight = self.highlighted_card == CardPosition::TopWaste;
let selected = {
match self.selected_card {
None => false,
Some(pos) => pos == CardPosition::TopWaste
}
};
draw_waste(&self.cards.waste, waste_area, frame, highlight, selected);
}
for (i, fa) in foundation_areas.iter().enumerate() { for (i, fa) in foundation_areas.iter().enumerate() {
let highlight = self.highlighted_card == CardPosition::Foundation(i);
let selected = {
match self.selected_card {
None => false,
Some(pos) => pos == CardPosition::Foundation(i)
}
};
frame.render_widget( frame.render_widget(
empty_pile(self.highlighted_card == CardPosition::Foundation(i)), empty_pile(highlight, selected),
*fa *fa
); );
} }
@@ -190,7 +206,12 @@ impl App {
Some(c) => { Some(c) => {
let is_top_card = i == self.cards.piles[pile].len() - 1; let is_top_card = i == self.cards.piles[pile].len() - 1;
let highlight = self.highlighted_card == CardPosition::Pile(pile, i); let highlight = self.highlighted_card == CardPosition::Pile(pile, i);
let selected = true; // FIXME let selected = {
match self.selected_card {
None => false,
Some(pos) => pos == CardPosition::Pile(pile, i)
}
};
let a_card = match c.visible { let a_card = match c.visible {
true => card_widget(c, is_top_card, highlight, selected), true => card_widget(c, is_top_card, highlight, selected),
false => card_widget(c, is_top_card, highlight, selected), false => card_widget(c, is_top_card, highlight, selected),
@@ -236,6 +257,7 @@ impl App {
KeyCode::Char('1') => self.cards.num_cards_turned = 1, KeyCode::Char('1') => self.cards.num_cards_turned = 1,
KeyCode::Char('3') => self.cards.num_cards_turned = 3, KeyCode::Char('3') => self.cards.num_cards_turned = 3,
KeyCode::Char('h') => self.show_help = !self.show_help, // toggle KeyCode::Char('h') => self.show_help = !self.show_help, // toggle
KeyCode::Char(' ') => self.select_card(),
KeyCode::Left => self.highlighted_card = handle_move_highlighted(&self.highlighted_card, Direction::Left, &self.cards), KeyCode::Left => self.highlighted_card = handle_move_highlighted(&self.highlighted_card, Direction::Left, &self.cards),
KeyCode::Right => self.highlighted_card = handle_move_highlighted(&self.highlighted_card, Direction::Right, &self.cards), KeyCode::Right => self.highlighted_card = handle_move_highlighted(&self.highlighted_card, Direction::Right, &self.cards),
KeyCode::Up => self.highlighted_card = handle_move_highlighted(&self.highlighted_card, Direction::Up, &self.cards), KeyCode::Up => self.highlighted_card = handle_move_highlighted(&self.highlighted_card, Direction::Up, &self.cards),
@@ -247,6 +269,12 @@ impl App {
fn exit(&mut self) { fn exit(&mut self) {
self.exit = true; self.exit = true;
} }
fn select_card(&mut self) {
self.selected_card = Some(self.highlighted_card);
// FIXME - actually moving the selected card to next position
// FIXME - don't allow selection of empty pile/foundation
}
} }
fn main() -> io::Result<()> { fn main() -> io::Result<()> {
@@ -488,7 +516,7 @@ fn facedown_card(top: bool) -> Paragraph<'static> {
.border_type(BorderType::Rounded)) .border_type(BorderType::Rounded))
} }
fn empty_pile(highlight: bool) -> Paragraph<'static> { fn empty_pile(highlight: bool, selected: bool) -> Paragraph<'static> {
// made using https://www.asciiart.eu/ // made using https://www.asciiart.eu/
let hidden_card = format!( let hidden_card = format!(
" "
@@ -504,6 +532,8 @@ fn empty_pile(highlight: bool) -> Paragraph<'static> {
let mut border_style = Style::new(); let mut border_style = Style::new();
if highlight { if highlight {
border_style = border_style.fg(Color::Blue); border_style = border_style.fg(Color::Blue);
} else if selected {
border_style = border_style.fg(Color::Green);
} }
Paragraph::new(hidden_card) Paragraph::new(hidden_card)