Player holds the deck, emits deckChanged(), other elements player->getDeck() to respond to changes.

Took 37 minutes
This commit is contained in:
Lukas Brübach 2025-09-09 12:28:09 +02:00
parent 57aa1abc69
commit c344b40a71
8 changed files with 61 additions and 41 deletions

View file

@ -743,7 +743,7 @@ void TabGame::loadDeckForLocalPlayer(Player *localPlayer, int playerId, ServerIn
DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list()));
PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(newDeck.getCardRefList())); PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(newDeck.getCardRefList()));
deckViewContainer->playerDeckView->setDeck(newDeck); deckViewContainer->playerDeckView->setDeck(newDeck);
localPlayer->getPlayerInfo()->setDeck(newDeck); localPlayer->setDeck(newDeck);
} }
} }

View file

@ -32,7 +32,7 @@
Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, TabGame *_parent) 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)), : QObject(_parent), game(_parent), playerInfo(new PlayerInfo(info, _id, _local, _judge)),
playerEventHandler(new PlayerEventHandler(this)), playerActions(new PlayerActions(this)), active(false), playerEventHandler(new PlayerEventHandler(this)), playerActions(new PlayerActions(this)), active(false),
dialogSemaphore(false) deck(nullptr), dialogSemaphore(false)
{ {
initializeZones(); initializeZones();
@ -40,6 +40,9 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T
playerMenu = new PlayerMenu(this); playerMenu = new PlayerMenu(this);
connect(this, &Player::activeChanged, graphicsItem, &PlayerGraphicsItem::onPlayerActiveChanged); connect(this, &Player::activeChanged, graphicsItem, &PlayerGraphicsItem::onPlayerActiveChanged);
connect(this, &Player::deckChanged, playerMenu, &PlayerMenu::enableOpenInDeckEditorAction);
connect(this, &Player::deckChanged, playerMenu, &PlayerMenu::populatePredefinedTokensMenu);
} }
void Player::initializeZones() 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) AbstractCounter *Player::addCounter(const ServerInfo_Counter &counter)
{ {
return addCounter(counter.id(), QString::fromStdString(counter.name()), return addCounter(counter.id(), QString::fromStdString(counter.name()),

View file

@ -60,6 +60,7 @@ class Player : public QObject
signals: signals:
void openDeckEditor(const DeckLoader *deck); void openDeckEditor(const DeckLoader *deck);
void deckChanged();
void newCardAdded(AbstractCardItem *card); void newCardAdded(AbstractCardItem *card);
void rearrangeCounters(); void rearrangeCounters();
void activeChanged(bool _active); void activeChanged(bool _active);
@ -121,6 +122,13 @@ public:
return playerMenu; return playerMenu;
} }
void setDeck(const DeckLoader &_deck);
[[nodiscard]] DeckLoader *getDeck() const
{
return deck;
}
template <typename T> T *addZone(T *zone) template <typename T> T *addZone(T *zone)
{ {
zones.insert(zone->getName(), zone); zones.insert(zone->getName(), zone);
@ -211,6 +219,8 @@ private:
bool active; bool active;
DeckLoader *deck;
QMap<QString, CardZoneLogic *> zones; QMap<QString, CardZoneLogic *> zones;
QMap<int, AbstractCounter *> counters; QMap<int, AbstractCounter *> counters;
QMap<int, ArrowItem *> arrows; QMap<int, ArrowItem *> arrows;

View file

@ -834,7 +834,7 @@ void PlayerActions::actRollDie()
void PlayerActions::actCreateToken() void PlayerActions::actCreateToken()
{ {
DlgCreateToken dlg(player->getPlayerInfo()->getPredefinedTokens(), player->getGame()); DlgCreateToken dlg(player->getPlayerMenu()->getPredefinedTokens(), player->getGame());
if (!dlg.exec()) { if (!dlg.exec()) {
return; return;
} }

View file

@ -1,39 +1,12 @@
#include "player_info.h" #include "player_info.h"
PlayerInfo::PlayerInfo(const ServerInfo_User &info, int _id, bool _local, bool _judge) 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 = new ServerInfo_User;
userInfo->CopyFrom(info); 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<InnerDecklistNode *>(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) void PlayerInfo::setConceded(bool _conceded)
{ {
conceded = _conceded; conceded = _conceded;

View file

@ -25,9 +25,6 @@ public:
bool conceded; bool conceded;
int zoneId; int zoneId;
DeckLoader *deck;
QStringList predefinedTokens;
int getZoneId() const int getZoneId() const
{ {
return zoneId; return zoneId;
@ -35,8 +32,6 @@ public:
void setZoneId(int _zoneId); void setZoneId(int _zoneId);
void setDeck(const DeckLoader &_deck);
void setConceded(bool _conceded); void setConceded(bool _conceded);
bool getConceded() const bool getConceded() const
{ {
@ -79,11 +74,6 @@ public:
{ {
return QString::fromStdString(userInfo->name()); return QString::fromStdString(userInfo->name());
} }
QStringList getPredefinedTokens() const
{
return predefinedTokens;
}
}; };
#endif // COCKATRICE_PLAYER_INFO_H #endif // COCKATRICE_PLAYER_INFO_H

View file

@ -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<InnerDecklistNode *>(_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() void PlayerMenu::resetTopCardMenuActions()
{ {
aAlwaysRevealTopCard->setChecked(false); aAlwaysRevealTopCard->setChecked(false);

View file

@ -17,6 +17,8 @@ signals:
public slots: public slots:
QMenu *createPtMenu() const; QMenu *createPtMenu() const;
QMenu *createMoveMenu() const; QMenu *createMoveMenu() const;
void enableOpenInDeckEditorAction() const;
void populatePredefinedTokensMenu();
private slots: private slots:
void addPlayer(Player *playerToAdd); void addPlayer(Player *playerToAdd);
@ -47,6 +49,11 @@ public:
aCreateAnotherToken->setEnabled(true); aCreateAnotherToken->setEnabled(true);
} }
QStringList getPredefinedTokens() const
{
return predefinedTokens;
}
[[nodiscard]] bool isAlwaysRevealTopCardChecked() [[nodiscard]] bool isAlwaysRevealTopCardChecked()
{ {
return aAlwaysRevealTopCard->isChecked(); return aAlwaysRevealTopCard->isChecked();
@ -103,6 +110,7 @@ private:
*aMoveToXfromTopOfLibrary, *aSelectAll, *aSelectRow, *aSelectColumn, *aSortHand, *aIncrementAllCardCounters; *aMoveToXfromTopOfLibrary, *aSelectAll, *aSelectRow, *aSelectColumn, *aSortHand, *aIncrementAllCardCounters;
bool shortcutsActive; bool shortcutsActive;
QStringList predefinedTokens;
QMenu *createCardMenu(const CardItem *card); QMenu *createCardMenu(const CardItem *card);