diff --git a/card_stuffs/src/main.rs b/card_stuffs/src/main.rs index 903a479..b4ce34b 100644 --- a/card_stuffs/src/main.rs +++ b/card_stuffs/src/main.rs @@ -4,8 +4,8 @@ use card_stuffs::{self, NUM_PILES_KLONDIKE}; use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind}; use ratatui::{ buffer::Buffer, - layout::{Constraint, Layout, Rect}, - style::Stylize, + layout::{Constraint, Layout, Rect, Flex}, + style::{Style, Stylize, Color}, symbols::border, text::{Line, Text}, widgets::{block::title, Block, BorderType, Borders, Paragraph, Widget, Padding, ListItem, List}, @@ -18,56 +18,68 @@ pub struct App { exit: bool, } -const CARD_HEIGHT: u16 = 12; -const CARD_WIDTH: u16 = 17; +const CARD_HEIGHT: u16 = 11; +const CARD_WIDTH: u16 = 15; -fn card_widget(card: &card_stuffs::Card) -> List { +fn card_widget(card: &card_stuffs::Card, top: bool) -> List { let five_card = [ format!("{value}{suit} ", value=card.value, suit=card.suit), - format!(" "), - format!(" {suit} {suit} ", suit=card.suit), - format!(" "), - format!(" "), - format!(" {suit} ", suit=card.suit), - format!(" "), - format!(" "), - format!(" {suit} {suit} ", suit=card.suit), - format!(" "), - format!(" {value}{suit}", value=card.value, suit=card.suit), + format!(" "), + format!(" {suit} {suit} ", suit=card.suit), + format!(" "), + format!(" {suit} ", suit=card.suit), + format!(" "), + format!(" {suit} {suit} ", suit=card.suit), + format!(" "), + format!(" {value}{suit}", value=card.value, suit=card.suit), ]; - let card: Vec = five_card.iter().map(|(m)| { + let card_style = match card.suit.colour() { + card_stuffs::Colour::Black => Style::new().black().bg(Color::White), + card_stuffs::Colour::Red => Style::new().red().bg(Color::White), + }; + let card: Vec = five_card.iter().map(|m| { ListItem::new(m.to_string()) + .style(card_style) }) .collect(); + let mut borders = Borders::TOP | Borders::LEFT | Borders::RIGHT; + if top { + borders |= Borders::BOTTOM; + } + List::new(card) .block(Block::new() - .borders(Borders::ALL) + //.style(Style::new().red().bold().italic()) + // Might use something like this for "active"/"selected" + .borders(borders) .border_type(BorderType::Rounded)) } -fn turned_over_card() -> List<'static> { +fn turned_over_card(top: bool) -> List<'static> { let hidden_card = [ - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), - format!("###############"), + format!("#############"), + format!("#############"), + format!("#############"), + format!("#############"), + format!("#############"), + format!("#############"), + format!("#############"), + format!("#############"), ]; - let card: Vec = hidden_card.iter().map(|(m)| { + let card: Vec = hidden_card.iter().map(|m| { ListItem::new(m.to_string()) }) .collect(); + let mut borders = Borders::TOP | Borders::LEFT | Borders::RIGHT; + if top { + borders |= Borders::BOTTOM; + } + List::new(card) .block(Block::new() - .borders(Borders::ALL) + .borders(borders) .border_type(BorderType::Rounded)) } @@ -120,21 +132,38 @@ impl App { Constraint::Length(CARD_WIDTH), Constraint::Length(CARD_WIDTH), Constraint::Length(CARD_WIDTH), - ]); + ]).flex(Flex::SpaceAround); let pileses: [Rect; 7] = horizontal.areas(piles_area); - let a_card = card_widget(&self.cards.piles[0][0]); + for pile in 0..card_stuffs::NUM_PILES_KLONDIKE { let mut constraints = Vec::new(); for card in 0..(card_stuffs::NUM_PILES_KLONDIKE + 13) { - constraints.push(Constraint::Min(2)); + match self.cards.piles[pile].get(card) { + Some(_) => { + if card == self.cards.piles[pile].len() - 1 { + constraints.push(Constraint::Length(CARD_HEIGHT)); + } else { + constraints.push(Constraint::Length(2)); + } + } + None => { + constraints.push(Constraint::Length(0)); + } + } } let vertical = Layout::vertical(constraints); - let card_display: [Rect; 20] = vertical.areas(pileses[pile]); + let card_display: [Rect; card_stuffs::NUM_PILES_KLONDIKE + 13] = vertical.areas(pileses[pile]); for (i, card) in card_display.iter().enumerate() { match self.cards.piles[pile].get(i) { None => break, Some(c) => { + let is_top_card = i == self.cards.piles[pile].len() - 1; + let a_card = match c.visible { + true => card_widget(c, is_top_card), + //false => turned_over_card(is_top_card), + false => card_widget(c, is_top_card), + }; frame.render_widget( &a_card, *card