diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Games/Solitaire/Game.cpp | 26 | ||||
-rw-r--r-- | Userland/Games/Solitaire/Game.h | 4 | ||||
-rw-r--r-- | Userland/Libraries/LibCards/Card.cpp | 8 | ||||
-rw-r--r-- | Userland/Libraries/LibCards/Card.h | 6 | ||||
-rw-r--r-- | Userland/Libraries/LibCards/CardStack.cpp | 22 | ||||
-rw-r--r-- | Userland/Libraries/LibCards/CardStack.h | 3 |
6 files changed, 41 insertions, 28 deletions
diff --git a/Userland/Games/Solitaire/Game.cpp b/Userland/Games/Solitaire/Game.cpp index cc9cfb5bf6..302d3d86fe 100644 --- a/Userland/Games/Solitaire/Game.cpp +++ b/Userland/Games/Solitaire/Game.cpp @@ -272,7 +272,7 @@ void Game::mousedown_event(GUI::MouseEvent& event) void Game::mouseup_event(GUI::MouseEvent& event) { GUI::Frame::mouseup_event(event); - clear_hovered_card(); + clear_hovered_stack(); if (!is_moving_cards() || m_game_over_animation || m_new_game_animation) return; @@ -313,16 +313,16 @@ void Game::mousemove_event(GUI::MouseEvent& event) int dx = click_location.dx_relative_to(m_mouse_down_location); int dy = click_location.dy_relative_to(m_mouse_down_location); - if (auto target_stack = find_stack_to_drop_on(Cards::CardStack::MovementRule::Alternating); target_stack && !target_stack->is_empty()) { - if (auto& top_card = target_stack->peek(); top_card != m_hovered_card) { - clear_hovered_card(); - m_hovered_card = top_card; + if (auto target_stack = find_stack_to_drop_on(Cards::CardStack::MovementRule::Alternating)) { + if (target_stack != m_hovered_stack) { + clear_hovered_stack(); - m_hovered_card->set_highlighted(true); - update(m_hovered_card->rect()); + m_hovered_stack = move(target_stack); + m_hovered_stack->set_highlighted(true); + update(m_hovered_stack->bounding_box()); } } else { - clear_hovered_card(); + clear_hovered_stack(); } for (auto& to_intersect : moving_cards()) { @@ -632,14 +632,14 @@ void Game::perform_undo() invalidate_layout(); } -void Game::clear_hovered_card() +void Game::clear_hovered_stack() { - if (!m_hovered_card) + if (!m_hovered_stack) return; - m_hovered_card->set_highlighted(false); - update(m_hovered_card->rect()); - m_hovered_card = nullptr; + m_hovered_stack->set_highlighted(false); + update(m_hovered_stack->bounding_box()); + m_hovered_stack = nullptr; } } diff --git a/Userland/Games/Solitaire/Game.h b/Userland/Games/Solitaire/Game.h index 9e2f1e87a0..1b8d2a024b 100644 --- a/Userland/Games/Solitaire/Game.h +++ b/Userland/Games/Solitaire/Game.h @@ -174,7 +174,7 @@ private: void create_new_animation_card(); void set_background_fill_enabled(bool); void check_for_game_over(); - void clear_hovered_card(); + void clear_hovered_stack(); virtual void paint_event(GUI::PaintEvent&) override; virtual void mousedown_event(GUI::MouseEvent&) override; @@ -205,7 +205,7 @@ private: bool m_auto_collect { false }; - RefPtr<Card> m_hovered_card; + RefPtr<CardStack> m_hovered_stack; }; } diff --git a/Userland/Libraries/LibCards/Card.cpp b/Userland/Libraries/LibCards/Card.cpp index 46c16aefee..00f85894d0 100644 --- a/Userland/Libraries/LibCards/Card.cpp +++ b/Userland/Libraries/LibCards/Card.cpp @@ -20,13 +20,13 @@ Card::Card(Suit suit, Rank rank) VERIFY(to_underlying(rank) < card_count); } -void Card::paint(GUI::Painter& painter) const +void Card::paint(GUI::Painter& painter, bool highlighted) const { auto& card_painter = CardPainter::the(); auto bitmap = [&]() { if (m_inverted) return m_upside_down ? card_painter.card_back_inverted() : card_painter.card_front_inverted(m_suit, m_rank); - if (m_highlighted) { + if (highlighted) { VERIFY(!m_upside_down); return card_painter.card_front_highlighted(m_suit, m_rank); } @@ -46,12 +46,12 @@ void Card::save_old_position() m_old_position_valid = true; } -void Card::clear_and_paint(GUI::Painter& painter, Color background_color) +void Card::clear_and_paint(GUI::Painter& painter, Color background_color, bool highlighted) { if (is_old_position_valid()) clear(painter, background_color); - paint(painter); + paint(painter, highlighted); save_old_position(); } diff --git a/Userland/Libraries/LibCards/Card.h b/Userland/Libraries/LibCards/Card.h index 5cfd9d53cc..72101ff0af 100644 --- a/Userland/Libraries/LibCards/Card.h +++ b/Userland/Libraries/LibCards/Card.h @@ -104,13 +104,12 @@ public: void set_moving(bool moving) { m_moving = moving; } void set_upside_down(bool upside_down) { m_upside_down = upside_down; } void set_inverted(bool inverted) { m_inverted = inverted; } - void set_highlighted(bool highlighted) { m_highlighted = highlighted; } void save_old_position(); - void paint(GUI::Painter&) const; + void paint(GUI::Painter&, bool highlighted = false) const; void clear(GUI::Painter&, Color background_color) const; - void clear_and_paint(GUI::Painter& painter, Color background_color); + void clear_and_paint(GUI::Painter& painter, Color background_color, bool highlighted); private: Card(Suit, Rank); @@ -123,7 +122,6 @@ private: bool m_moving { false }; bool m_upside_down { false }; bool m_inverted { false }; - bool m_highlighted { false }; }; enum class Shuffle { diff --git a/Userland/Libraries/LibCards/CardStack.cpp b/Userland/Libraries/LibCards/CardStack.cpp index 1e0e65b4fc..9e7c297225 100644 --- a/Userland/Libraries/LibCards/CardStack.cpp +++ b/Userland/Libraries/LibCards/CardStack.cpp @@ -43,8 +43,18 @@ void CardStack::paint(GUI::Painter& painter, Gfx::Color background_color) return false; if (!is_empty() && (m_stack.size() != number_of_moving_cards)) return false; - painter.fill_rect_with_rounded_corners(m_base, background_color.darkened(0.5), Card::card_radius); - painter.fill_rect_with_rounded_corners(m_base.shrunken(2, 2), background_color, Card::card_radius - 1); + + auto paint_rect = m_base; + painter.fill_rect_with_rounded_corners(paint_rect, background_color.darkened(0.5), Card::card_radius); + paint_rect.shrink(2, 2); + + if (m_highlighted) { + auto background_complement = background_color.xored(Color::White); + painter.fill_rect_with_rounded_corners(paint_rect, background_complement, Card::card_radius - 1); + paint_rect.shrink(4, 4); + } + + painter.fill_rect_with_rounded_corners(paint_rect, background_color, Card::card_radius - 1); return true; }; @@ -83,9 +93,11 @@ void CardStack::paint(GUI::Painter& painter, Gfx::Color background_color) return; } - for (auto& card : m_stack) { - if (!card.is_moving()) - card.clear_and_paint(painter, Gfx::Color::Transparent); + for (size_t i = 0; i < m_stack.size(); ++i) { + if (auto& card = m_stack[i]; !card.is_moving()) { + auto highlighted = m_highlighted && (i == m_stack.size() - 1); + card.clear_and_paint(painter, Gfx::Color::Transparent, highlighted); + } } } diff --git a/Userland/Libraries/LibCards/CardStack.h b/Userland/Libraries/LibCards/CardStack.h index b558c18a19..bebbb10a39 100644 --- a/Userland/Libraries/LibCards/CardStack.h +++ b/Userland/Libraries/LibCards/CardStack.h @@ -53,6 +53,8 @@ public: void paint(GUI::Painter&, Gfx::Color background_color); void clear(); + void set_highlighted(bool highlighted) { m_highlighted = highlighted; } + private: struct StackRules { uint8_t shift_x { 0 }; @@ -92,6 +94,7 @@ private: Type m_type { Type::Invalid }; StackRules m_rules; Gfx::IntRect m_base; + bool m_highlighted { false }; }; } |