From c8ed9835bd1480033e292e3fc2ddc4a2fe97cf40 Mon Sep 17 00:00:00 2001 From: DawnFire42 Date: Mon, 10 Aug 2026 15:08:27 -0400 Subject: [PATCH] extract getOverlayColor() to AbstractCounter for shared fill+hover styling and Use server-provided color and radius for tax counters --- .../src/game_graphics/board/abstract_counter.cpp | 13 +++++++++++++ .../src/game_graphics/board/abstract_counter.h | 8 ++++++++ .../game_graphics/board/commander_tax_counter.cpp | 9 ++------- .../src/game_graphics/board/commander_tax_counter.h | 5 +---- cockatrice/src/game_graphics/zones/command_zone.cpp | 10 +++------- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/cockatrice/src/game_graphics/board/abstract_counter.cpp b/cockatrice/src/game_graphics/board/abstract_counter.cpp index 070e0167e..b70185c6b 100644 --- a/cockatrice/src/game_graphics/board/abstract_counter.cpp +++ b/cockatrice/src/game_graphics/board/abstract_counter.cpp @@ -90,6 +90,19 @@ void AbstractCounter::setValue(int _value) update(); } +static constexpr int OVERLAY_ALPHA = 191; +static constexpr int HOVER_LIGHTEN_PERCENT = 130; + +QColor AbstractCounter::getOverlayColor() const +{ + QColor result = color; + result.setAlpha(OVERLAY_ALPHA); + if (hovered) { + result = result.lighter(HOVER_LIGHTEN_PERCENT); + } + return result; +} + void AbstractCounter::setActive(bool _active) { active = _active; diff --git a/cockatrice/src/game_graphics/board/abstract_counter.h b/cockatrice/src/game_graphics/board/abstract_counter.h index f030a27f1..29ea7ab11 100644 --- a/cockatrice/src/game_graphics/board/abstract_counter.h +++ b/cockatrice/src/game_graphics/board/abstract_counter.h @@ -36,6 +36,14 @@ protected: bool hovered = false; bool useNameForShortcut; + /** + * @brief Returns the counter's color adjusted for overlay rendering. + * + * Applies semi-transparency and lightens the color when hovered. + * Use this for fill-based counters; SVG-based counters (GeneralCounter) bypass this. + */ + [[nodiscard]] QColor getOverlayColor() const; + void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; diff --git a/cockatrice/src/game_graphics/board/commander_tax_counter.cpp b/cockatrice/src/game_graphics/board/commander_tax_counter.cpp index d3cd83a6c..9089ee6cb 100644 --- a/cockatrice/src/game_graphics/board/commander_tax_counter.cpp +++ b/cockatrice/src/game_graphics/board/commander_tax_counter.cpp @@ -9,12 +9,9 @@ static constexpr qreal CORNER_RADIUS = 4.0; static constexpr qreal FONT_SIZE_RATIO = 0.6; -static constexpr int OVERLAY_ALPHA = 191; -static const QColor OVERLAY_BG_NORMAL{40, 40, 40, OVERLAY_ALPHA}; -static const QColor OVERLAY_BG_HOVERED{70, 70, 70, OVERLAY_ALPHA}; CommanderTaxCounter::CommanderTaxCounter(CounterState *state, PlayerLogic *player, QGraphicsItem *parent) - : AbstractCounter(state, player, false, false, parent), size(TaxCounterSizes::TAX_COUNTER_SIZE) + : AbstractCounter(state, player, false, false, parent), size(state->getRadius()) { setCacheMode(DeviceCoordinateCache); setAcceptHoverEvents(true); @@ -36,10 +33,8 @@ void CommanderTaxCounter::paint(QPainter *painter, QRectF rect = boundingRect().adjusted(1, 1, -1, -1); - QColor bgColor = hovered ? OVERLAY_BG_HOVERED : OVERLAY_BG_NORMAL; - painter->setPen(Qt::NoPen); - painter->setBrush(bgColor); + painter->setBrush(getOverlayColor()); painter->drawRoundedRect(rect, CORNER_RADIUS, CORNER_RADIUS); QFont f = QFontDatabase::systemFont(QFontDatabase::GeneralFont); diff --git a/cockatrice/src/game_graphics/board/commander_tax_counter.h b/cockatrice/src/game_graphics/board/commander_tax_counter.h index 5ddfb4674..efb070d9a 100644 --- a/cockatrice/src/game_graphics/board/commander_tax_counter.h +++ b/cockatrice/src/game_graphics/board/commander_tax_counter.h @@ -11,14 +11,11 @@ /** * @namespace TaxCounterSizes - * @brief Size constants for commander tax counter layout. + * @brief Layout constants for commander tax counters. */ namespace TaxCounterSizes { -/** @brief Size of commander tax counter icons (width and height) */ -constexpr int TAX_COUNTER_SIZE = 24; - /** @brief Margin around and between tax counter icons */ constexpr int TAX_COUNTER_MARGIN = 2; diff --git a/cockatrice/src/game_graphics/zones/command_zone.cpp b/cockatrice/src/game_graphics/zones/command_zone.cpp index c46005025..423fb8045 100644 --- a/cockatrice/src/game_graphics/zones/command_zone.cpp +++ b/cockatrice/src/game_graphics/zones/command_zone.cpp @@ -165,11 +165,9 @@ void CommandZone::unregisterTaxCounter(AbstractCounter *counter) void CommandZone::rearrangeTaxCounters() { - int activeTaxCounterCount = 0; + qreal y = TaxCounterSizes::TAX_COUNTER_MARGIN; for (AbstractCounter *ctr : taxCounters) { - qreal y = TaxCounterSizes::TAX_COUNTER_MARGIN + - activeTaxCounterCount * (TaxCounterSizes::TAX_COUNTER_SIZE + TaxCounterSizes::TAX_COUNTER_MARGIN); ctr->setPos(TaxCounterSizes::TAX_COUNTER_MARGIN, y); ctr->setZValue(ZValues::TAX_COUNTERS); // Visibility is owned solely by AbstractCounter::setActive() (the counter's own flag), @@ -177,13 +175,11 @@ void CommandZone::rearrangeTaxCounters() // (tax counters are graphics children of the zone). This function only handles layout, // so it stacks and measures by isActive() alone. if (ctr->isActive()) { - ++activeTaxCounterCount; + y += ctr->getRadius() + TaxCounterSizes::TAX_COUNTER_MARGIN; } } - int minHeight = activeTaxCounterCount * (TaxCounterSizes::TAX_COUNTER_SIZE + TaxCounterSizes::TAX_COUNTER_MARGIN) + - TaxCounterSizes::TAX_COUNTER_MARGIN; - setMinimumHeight(minHeight); + setMinimumHeight(static_cast(y)); } void CommandZone::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)