From c344b40a71c187eaf3207c6e1e95c636dbc9d7a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Tue, 9 Sep 2025 12:28:09 +0200 Subject: [PATCH] Player holds the deck, emits deckChanged(), other elements player->getDeck() to respond to changes. Took 37 minutes --- cockatrice/src/client/tabs/tab_game.cpp | 2 +- cockatrice/src/game/player/player.cpp | 12 +++++++- cockatrice/src/game/player/player.h | 10 +++++++ cockatrice/src/game/player/player_actions.cpp | 2 +- cockatrice/src/game/player/player_info.cpp | 29 +------------------ cockatrice/src/game/player/player_info.h | 10 ------- cockatrice/src/game/player/player_menu.cpp | 29 +++++++++++++++++++ cockatrice/src/game/player/player_menu.h | 8 +++++ 8 files changed, 61 insertions(+), 41 deletions(-) diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index 2bb89d60a..9197d5841 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -743,7 +743,7 @@ void TabGame::loadDeckForLocalPlayer(Player *localPlayer, int playerId, ServerIn DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(newDeck.getCardRefList())); deckViewContainer->playerDeckView->setDeck(newDeck); - localPlayer->getPlayerInfo()->setDeck(newDeck); + localPlayer->setDeck(newDeck); } } diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index 6bf2ed3a6..223b2df8c 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -32,7 +32,7 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, TabGame *_parent) : QObject(_parent), game(_parent), playerInfo(new PlayerInfo(info, _id, _local, _judge)), playerEventHandler(new PlayerEventHandler(this)), playerActions(new PlayerActions(this)), active(false), - dialogSemaphore(false) + deck(nullptr), dialogSemaphore(false) { initializeZones(); @@ -40,6 +40,9 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T playerMenu = new PlayerMenu(this); connect(this, &Player::activeChanged, graphicsItem, &PlayerGraphicsItem::onPlayerActiveChanged); + + connect(this, &Player::deckChanged, playerMenu, &PlayerMenu::enableOpenInDeckEditorAction); + connect(this, &Player::deckChanged, playerMenu, &PlayerMenu::populatePredefinedTokensMenu); } void Player::initializeZones() @@ -240,6 +243,13 @@ void Player::deleteCard(CardItem *card) } } +void Player::setDeck(const DeckLoader &_deck) +{ + deck = new DeckLoader(_deck); + + emit deckChanged(); +} + AbstractCounter *Player::addCounter(const ServerInfo_Counter &counter) { return addCounter(counter.id(), QString::fromStdString(counter.name()), diff --git a/cockatrice/src/game/player/player.h b/cockatrice/src/game/player/player.h index d4742d5e6..77e6ea6ee 100644 --- a/cockatrice/src/game/player/player.h +++ b/cockatrice/src/game/player/player.h @@ -60,6 +60,7 @@ class Player : public QObject signals: void openDeckEditor(const DeckLoader *deck); + void deckChanged(); void newCardAdded(AbstractCardItem *card); void rearrangeCounters(); void activeChanged(bool _active); @@ -121,6 +122,13 @@ public: return playerMenu; } + void setDeck(const DeckLoader &_deck); + + [[nodiscard]] DeckLoader *getDeck() const + { + return deck; + } + template T *addZone(T *zone) { zones.insert(zone->getName(), zone); @@ -211,6 +219,8 @@ private: bool active; + DeckLoader *deck; + QMap zones; QMap counters; QMap arrows; diff --git a/cockatrice/src/game/player/player_actions.cpp b/cockatrice/src/game/player/player_actions.cpp index de1c6f38c..2e2c1d535 100644 --- a/cockatrice/src/game/player/player_actions.cpp +++ b/cockatrice/src/game/player/player_actions.cpp @@ -834,7 +834,7 @@ void PlayerActions::actRollDie() void PlayerActions::actCreateToken() { - DlgCreateToken dlg(player->getPlayerInfo()->getPredefinedTokens(), player->getGame()); + DlgCreateToken dlg(player->getPlayerMenu()->getPredefinedTokens(), player->getGame()); if (!dlg.exec()) { return; } diff --git a/cockatrice/src/game/player/player_info.cpp b/cockatrice/src/game/player/player_info.cpp index 2238f9bab..e2cf67757 100644 --- a/cockatrice/src/game/player/player_info.cpp +++ b/cockatrice/src/game/player/player_info.cpp @@ -1,39 +1,12 @@ #include "player_info.h" PlayerInfo::PlayerInfo(const ServerInfo_User &info, int _id, bool _local, bool _judge) - : id(_id), local(_local), judge(_judge), handVisible(false), conceded(false), zoneId(0), deck(nullptr) + : id(_id), local(_local), judge(_judge), handVisible(false), conceded(false), zoneId(0) { userInfo = new ServerInfo_User; userInfo->CopyFrom(info); } -void PlayerInfo::setDeck(const DeckLoader &_deck) -{ - deck = new DeckLoader(_deck); - // TODO: deal with this - /*aOpenDeckInDeckEditor->setEnabled(deck); - - createPredefinedTokenMenu->clear(); - createPredefinedTokenMenu->setEnabled(false); - predefinedTokens.clear(); - InnerDecklistNode *tokenZone = dynamic_cast(deck->getRoot()->findChild(DECK_ZONE_TOKENS)); - - if (tokenZone) { - if (tokenZone->size() > 0) - createPredefinedTokenMenu->setEnabled(true); - - for (int i = 0; i < tokenZone->size(); ++i) { - const QString tokenName = tokenZone->at(i)->getName(); - predefinedTokens.append(tokenName); - QAction *a = createPredefinedTokenMenu->addAction(tokenName); - if (i < 10) { - a->setShortcut(QKeySequence("Alt+" + QString::number((i + 1) % 10))); - } - connect(a, &QAction::triggered, this, &Player::actCreatePredefinedToken); - } - }*/ -} - void PlayerInfo::setConceded(bool _conceded) { conceded = _conceded; diff --git a/cockatrice/src/game/player/player_info.h b/cockatrice/src/game/player/player_info.h index 01a6fc690..09a6ca481 100644 --- a/cockatrice/src/game/player/player_info.h +++ b/cockatrice/src/game/player/player_info.h @@ -25,9 +25,6 @@ public: bool conceded; int zoneId; - DeckLoader *deck; - QStringList predefinedTokens; - int getZoneId() const { return zoneId; @@ -35,8 +32,6 @@ public: void setZoneId(int _zoneId); - void setDeck(const DeckLoader &_deck); - void setConceded(bool _conceded); bool getConceded() const { @@ -79,11 +74,6 @@ public: { return QString::fromStdString(userInfo->name()); } - - QStringList getPredefinedTokens() const - { - return predefinedTokens; - } }; #endif // COCKATRICE_PLAYER_INFO_H diff --git a/cockatrice/src/game/player/player_menu.cpp b/cockatrice/src/game/player/player_menu.cpp index 96edeb384..b01bc5e81 100644 --- a/cockatrice/src/game/player/player_menu.cpp +++ b/cockatrice/src/game/player/player_menu.cpp @@ -919,6 +919,35 @@ void PlayerMenu::addViewCustomZoneActionToCustomZoneMenu(QString zoneName) } } +void PlayerMenu::populatePredefinedTokensMenu() +{ + DeckLoader *_deck = player->getDeck(); + createPredefinedTokenMenu->clear(); + createPredefinedTokenMenu->setEnabled(false); + predefinedTokens.clear(); + InnerDecklistNode *tokenZone = dynamic_cast(_deck->getRoot()->findChild(DECK_ZONE_TOKENS)); + + if (tokenZone) { + if (!tokenZone->empty()) + createPredefinedTokenMenu->setEnabled(true); + + for (int i = 0; i < tokenZone->size(); ++i) { + const QString tokenName = tokenZone->at(i)->getName(); + predefinedTokens.append(tokenName); + QAction *a = createPredefinedTokenMenu->addAction(tokenName); + if (i < 10) { + a->setShortcut(QKeySequence("Alt+" + QString::number((i + 1) % 10))); + } + connect(a, &QAction::triggered, player->getPlayerActions(), &PlayerActions::actCreatePredefinedToken); + } + } +} + +void PlayerMenu::enableOpenInDeckEditorAction() const +{ + aOpenDeckInDeckEditor->setEnabled(true); +} + void PlayerMenu::resetTopCardMenuActions() { aAlwaysRevealTopCard->setChecked(false); diff --git a/cockatrice/src/game/player/player_menu.h b/cockatrice/src/game/player/player_menu.h index b864870a0..c05b921ca 100644 --- a/cockatrice/src/game/player/player_menu.h +++ b/cockatrice/src/game/player/player_menu.h @@ -17,6 +17,8 @@ signals: public slots: QMenu *createPtMenu() const; QMenu *createMoveMenu() const; + void enableOpenInDeckEditorAction() const; + void populatePredefinedTokensMenu(); private slots: void addPlayer(Player *playerToAdd); @@ -47,6 +49,11 @@ public: aCreateAnotherToken->setEnabled(true); } + QStringList getPredefinedTokens() const + { + return predefinedTokens; + } + [[nodiscard]] bool isAlwaysRevealTopCardChecked() { return aAlwaysRevealTopCard->isChecked(); @@ -103,6 +110,7 @@ private: *aMoveToXfromTopOfLibrary, *aSelectAll, *aSelectRow, *aSelectColumn, *aSortHand, *aIncrementAllCardCounters; bool shortcutsActive; + QStringList predefinedTokens; QMenu *createCardMenu(const CardItem *card);