From 273955008716956d9b201d9cb120843952338df9 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 17 Mar 2025 00:01:25 +0100 Subject: [PATCH] Use enum for ThemeManager brushes (#5730) * Use enum for ThemeManager brushes This patch introduces an enum to distinguish the different brushes that can be set by the theme (hand, stack, etc.) and generic functions taking the enum rather than having one copy of each function for each brush. This is preliminary work before merging StackZone and HandZone to simplify #4974. * Include header * Header spacing --- cockatrice/src/client/ui/theme_manager.cpp | 89 +++++++++------------- cockatrice/src/client/ui/theme_manager.h | 38 ++++----- cockatrice/src/game/deckview/deck_view.cpp | 2 +- cockatrice/src/game/player/player.cpp | 7 +- cockatrice/src/game/zones/hand_zone.cpp | 7 +- cockatrice/src/game/zones/stack_zone.cpp | 7 +- cockatrice/src/game/zones/table_zone.cpp | 7 +- 7 files changed, 58 insertions(+), 99 deletions(-) diff --git a/cockatrice/src/client/ui/theme_manager.cpp b/cockatrice/src/client/ui/theme_manager.cpp index 4decf3f40..3dff1b7ac 100644 --- a/cockatrice/src/client/ui/theme_manager.cpp +++ b/cockatrice/src/client/ui/theme_manager.cpp @@ -120,10 +120,10 @@ void ThemeManager::themeChangedSlot() if (dirPath.isEmpty()) { // set default values QDir::setSearchPaths("theme", DEFAULT_RESOURCE_PATHS); - handBgBrush = HANDZONE_BG_DEFAULT; - tableBgBrush = TABLEZONE_BG_DEFAULT; - playerBgBrush = PLAYERZONE_BG_DEFAULT; - stackBgBrush = STACKZONE_BG_DEFAULT; + brushes[Role::Hand] = HANDZONE_BG_DEFAULT; + brushes[Role::Table] = TABLEZONE_BG_DEFAULT; + brushes[Role::Player] = PLAYERZONE_BG_DEFAULT; + brushes[Role::Stack] = STACKZONE_BG_DEFAULT; } else { // resources QStringList resources; @@ -132,73 +132,58 @@ void ThemeManager::themeChangedSlot() // zones bg dir.cd("zones"); - handBgBrush = loadBrush(HANDZONE_BG_NAME, HANDZONE_BG_DEFAULT); - tableBgBrush = loadBrush(TABLEZONE_BG_NAME, TABLEZONE_BG_DEFAULT); - playerBgBrush = loadBrush(PLAYERZONE_BG_NAME, PLAYERZONE_BG_DEFAULT); - stackBgBrush = loadBrush(STACKZONE_BG_NAME, STACKZONE_BG_DEFAULT); + brushes[Role::Hand] = loadBrush(HANDZONE_BG_NAME, HANDZONE_BG_DEFAULT); + brushes[Role::Table] = loadBrush(TABLEZONE_BG_NAME, TABLEZONE_BG_DEFAULT); + brushes[Role::Player] = loadBrush(PLAYERZONE_BG_NAME, PLAYERZONE_BG_DEFAULT); + brushes[Role::Stack] = loadBrush(STACKZONE_BG_NAME, STACKZONE_BG_DEFAULT); + } + for (auto &brushCache : brushesCache) { + brushCache.clear(); } - tableBgBrushesCache.clear(); - stackBgBrushesCache.clear(); - playerBgBrushesCache.clear(); - handBgBrushesCache.clear(); QPixmapCache::clear(); emit themeChanged(); } -QBrush ThemeManager::getExtraTableBgBrush(QString extraNumber, QBrush &fallbackBrush) +static QString roleBgName(ThemeManager::Role role) { - QBrush returnBrush; + switch (role) { + case ThemeManager::Hand: + return HANDZONE_BG_NAME; - if (!tableBgBrushesCache.contains(extraNumber.toInt())) { - returnBrush = loadExtraBrush(TABLEZONE_BG_NAME + extraNumber, fallbackBrush); - tableBgBrushesCache.insert(extraNumber.toInt(), returnBrush); - } else { - returnBrush = tableBgBrushesCache.value(extraNumber.toInt()); + case ThemeManager::Player: + return PLAYERZONE_BG_NAME; + + case ThemeManager::Stack: + return STACKZONE_BG_NAME; + + case ThemeManager::Table: + return TABLEZONE_BG_NAME; + + default: + Q_ASSERT(false); } - - return returnBrush; } -QBrush ThemeManager::getExtraStackBgBrush(QString extraNumber, QBrush &fallbackBrush) +QBrush &ThemeManager::getBgBrush(Role role) { - QBrush returnBrush; - - if (!stackBgBrushesCache.contains(extraNumber.toInt())) { - returnBrush = loadExtraBrush(STACKZONE_BG_NAME + extraNumber, fallbackBrush); - stackBgBrushesCache.insert(extraNumber.toInt(), returnBrush); - } else { - returnBrush = stackBgBrushesCache.value(extraNumber.toInt()); - } - - return returnBrush; + return brushes[role]; } -QBrush ThemeManager::getExtraPlayerBgBrush(QString extraNumber, QBrush &fallbackBrush) +QBrush ThemeManager::getExtraBgBrush(Role role, int zoneId) { - QBrush returnBrush; - - if (!playerBgBrushesCache.contains(extraNumber.toInt())) { - returnBrush = loadExtraBrush(PLAYERZONE_BG_NAME + extraNumber, fallbackBrush); - playerBgBrushesCache.insert(extraNumber.toInt(), returnBrush); - } else { - returnBrush = playerBgBrushesCache.value(extraNumber.toInt()); + if (zoneId <= 0) { + return getBgBrush(role); } - return returnBrush; -} + QBrushMap &brushCache = brushesCache[role]; -QBrush ThemeManager::getExtraHandBgBrush(QString extraNumber, QBrush &fallbackBrush) -{ - QBrush returnBrush; - - if (!handBgBrushesCache.contains(extraNumber.toInt())) { - returnBrush = loadExtraBrush(HANDZONE_BG_NAME + extraNumber, fallbackBrush); - handBgBrushesCache.insert(extraNumber.toInt(), returnBrush); - } else { - returnBrush = handBgBrushesCache.value(extraNumber.toInt()); + if (!brushCache.contains(zoneId)) { + QBrush brush = loadExtraBrush(roleBgName(role) + QString::number(zoneId), getBgBrush(role)); + brushCache.insert(zoneId, brush); + return brush; } - return returnBrush; + return brushCache.value(zoneId); } diff --git a/cockatrice/src/client/ui/theme_manager.h b/cockatrice/src/client/ui/theme_manager.h index 2385f5c23..20854b961 100644 --- a/cockatrice/src/client/ui/theme_manager.h +++ b/cockatrice/src/client/ui/theme_manager.h @@ -8,6 +8,7 @@ #include #include #include +#include inline Q_LOGGING_CATEGORY(ThemeManagerLog, "theme_manager"); @@ -22,13 +23,23 @@ class ThemeManager : public QObject public: ThemeManager(QObject *parent = nullptr); + enum Role + { + MinRole = 0, + Hand = MinRole, + Stack, + Table, + Player, + MaxRole = Player, + }; + private: - QBrush handBgBrush, stackBgBrush, tableBgBrush, playerBgBrush; + std::array brushes; QStringMap availableThemes; /* Internal cache for multiple backgrounds */ - QBrushMap tableBgBrushesCache, stackBgBrushesCache, playerBgBrushesCache, handBgBrushesCache; + std::array brushesCache; protected: void ensureThemeDirectoryExists(); @@ -36,27 +47,10 @@ protected: QBrush loadExtraBrush(QString fileName, QBrush &fallbackBrush); public: - QBrush &getHandBgBrush() - { - return handBgBrush; - } - QBrush &getStackBgBrush() - { - return stackBgBrush; - } - QBrush &getTableBgBrush() - { - return tableBgBrush; - } - QBrush &getPlayerBgBrush() - { - return playerBgBrush; - } QStringMap &getAvailableThemes(); - QBrush getExtraTableBgBrush(QString extraNumber, QBrush &fallbackBrush); - QBrush getExtraStackBgBrush(QString extraNumber, QBrush &fallbackBrush); - QBrush getExtraPlayerBgBrush(QString extraNumber, QBrush &fallbackBrush); - QBrush getExtraHandBgBrush(QString extraNumber, QBrush &fallbackBrush); + + QBrush &getBgBrush(Role zone); + QBrush getExtraBgBrush(Role zone, int zoneId = 0); protected slots: void themeChangedSlot(); signals: diff --git a/cockatrice/src/game/deckview/deck_view.cpp b/cockatrice/src/game/deckview/deck_view.cpp index 2f01361db..bbc25ef6a 100644 --- a/cockatrice/src/game/deckview/deck_view.cpp +++ b/cockatrice/src/game/deckview/deck_view.cpp @@ -172,7 +172,7 @@ void DeckViewCardContainer::paint(QPainter *painter, const QStyleOptionGraphicsI { qreal totalTextWidth = getCardTypeTextWidth(); - painter->fillRect(boundingRect(), themeManager->getTableBgBrush()); + painter->fillRect(boundingRect(), themeManager->getBgBrush(ThemeManager::Table)); painter->setPen(QColor(255, 255, 255, 100)); painter->drawLine(QPointF(0, separatorY), QPointF(width, separatorY)); diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index e94342bd2..2e63bba4a 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -93,12 +93,7 @@ void PlayerArea::updateBg() void PlayerArea::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) { - QBrush brush = themeManager->getPlayerBgBrush(); - - if (playerZoneId > 0) { - // If the extra image is not found, load the default one - brush = themeManager->getExtraPlayerBgBrush(QString::number(playerZoneId), brush); - } + QBrush brush = themeManager->getExtraBgBrush(ThemeManager::Player, playerZoneId); painter->fillRect(boundingRect(), brush); } diff --git a/cockatrice/src/game/zones/hand_zone.cpp b/cockatrice/src/game/zones/hand_zone.cpp index 896e9b60f..31f0515d4 100644 --- a/cockatrice/src/game/zones/hand_zone.cpp +++ b/cockatrice/src/game/zones/hand_zone.cpp @@ -78,12 +78,7 @@ QRectF HandZone::boundingRect() const void HandZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) { - QBrush brush = themeManager->getHandBgBrush(); - - if (player->getZoneId() > 0) { - // If the extra image is not found, load the default one - brush = themeManager->getExtraHandBgBrush(QString::number(player->getZoneId()), brush); - } + QBrush brush = themeManager->getExtraBgBrush(ThemeManager::Hand, player->getZoneId()); painter->fillRect(boundingRect(), brush); } diff --git a/cockatrice/src/game/zones/stack_zone.cpp b/cockatrice/src/game/zones/stack_zone.cpp index 010f85b96..2f307085c 100644 --- a/cockatrice/src/game/zones/stack_zone.cpp +++ b/cockatrice/src/game/zones/stack_zone.cpp @@ -49,12 +49,7 @@ QRectF StackZone::boundingRect() const void StackZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) { - QBrush brush = themeManager->getStackBgBrush(); - - if (player->getZoneId() > 0) { - // If the extra image is not found, load the default one - brush = themeManager->getExtraStackBgBrush(QString::number(player->getZoneId()), brush); - } + QBrush brush = themeManager->getExtraBgBrush(ThemeManager::Stack, player->getZoneId()); painter->fillRect(boundingRect(), brush); } diff --git a/cockatrice/src/game/zones/table_zone.cpp b/cockatrice/src/game/zones/table_zone.cpp index d64acdcd7..71327b9ec 100644 --- a/cockatrice/src/game/zones/table_zone.cpp +++ b/cockatrice/src/game/zones/table_zone.cpp @@ -54,12 +54,7 @@ bool TableZone::isInverted() const void TableZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) { - QBrush brush = themeManager->getTableBgBrush(); - - if (player->getZoneId() > 0) { - // If the extra image is not found, load the default one - brush = themeManager->getExtraTableBgBrush(QString::number(player->getZoneId()), brush); - } + QBrush brush = themeManager->getExtraBgBrush(ThemeManager::Table, player->getZoneId()); painter->fillRect(boundingRect(), brush); if (active) {