[Refactor] Move the active card from AbstractGame into GameScene

This commit is contained in:
Lukas Brübach 2026-10-06 12:58:52 +02:00 • committed by GitHub
parent 2c80763d99
commit bb9f38a375
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 26 additions and 20 deletions

View file

@ -18,8 +18,6 @@ AbstractGame::AbstractGame(QObject *_parent) : QObject(_parent)
{ {
gameMetaInfo = new GameMetaInfo(this); gameMetaInfo = new GameMetaInfo(this);
gameEventHandler = new GameEventHandler(this); gameEventHandler = new GameEventHandler(this);
activeCard = nullptr;
} }
bool AbstractGame::isHost() const bool AbstractGame::isHost() const
@ -48,11 +46,6 @@ void AbstractGame::loadReplay(const GameReplay *replay)
gameMetaInfo->setSpectatorsOmniscient(true); gameMetaInfo->setSpectatorsOmniscient(true);
} }
void AbstractGame::setActiveCard(CardItem *card)
{
activeCard = card;
}
CardItem *AbstractGame::getCard(int playerId, const QString &zoneName, int cardId) const CardItem *AbstractGame::getCard(int playerId, const QString &zoneName, int cardId) const
{ {
PlayerLogic *player = playerManager->getPlayer(playerId); PlayerLogic *player = playerManager->getPlayer(playerId);

View file

@ -30,7 +30,6 @@ public:
GameState *gameState; GameState *gameState;
GameEventHandler *gameEventHandler; GameEventHandler *gameEventHandler;
PlayerManager *playerManager; PlayerManager *playerManager;
CardItem *activeCard;
GameMetaInfo *getGameMetaInfo() GameMetaInfo *getGameMetaInfo()
{ {
@ -59,12 +58,6 @@ public:
void loadReplay(const GameReplay *replay); void loadReplay(const GameReplay *replay);
CardItem *getCard(int playerId, const QString &zoneName, int cardId) const; CardItem *getCard(int playerId, const QString &zoneName, int cardId) const;
void setActiveCard(CardItem *card);
CardItem *getActiveCard() const
{
return activeCard;
}
}; };
#endif // COCKATRICE_ABSTRACT_GAME_H #endif // COCKATRICE_ABSTRACT_GAME_H

View file

@ -67,9 +67,10 @@ CardItem::CardItem(PlayerLogic *_owner,
void CardItem::prepareDelete() void CardItem::prepareDelete()
{ {
if (owner != nullptr) { if (owner != nullptr) {
if (owner->getGame()->getActiveCard() == this) { auto *gameScene = qobject_cast<GameScene *>(scene());
if (gameScene && gameScene->getActiveCard() == this) {
emit owner->requestCardMenuUpdate(nullptr); emit owner->requestCardMenuUpdate(nullptr);
owner->getGame()->setActiveCard(nullptr); gameScene->setActiveCard(nullptr);
} }
owner = nullptr; owner = nullptr;
} }
@ -567,7 +568,9 @@ QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value)
bool selected = value.toBool(); bool selected = value.toBool();
if (selected) { if (selected) {
owner->getGame()->setActiveCard(this); if (auto *gameScene = qobject_cast<GameScene *>(scene())) {
gameScene->setActiveCard(this);
}
} }
emit selectionChanged(this, selected); emit selectionChanged(this, selected);

View file

@ -124,6 +124,16 @@ QList<CardItem *> GameScene::selectedCards() const
return selectedCards; return selectedCards;
} }
CardItem *GameScene::getActiveCard() const
{
return activeCard;
}
void GameScene::setActiveCard(CardItem *card)
{
activeCard = card;
}
void GameScene::onCardSelectionChanged(AbstractCardItem *abstractCard, bool selected) void GameScene::onCardSelectionChanged(AbstractCardItem *abstractCard, bool selected)
{ {
CardItem *card = qobject_cast<CardItem *>(abstractCard); CardItem *card = qobject_cast<CardItem *>(abstractCard);
@ -139,7 +149,7 @@ void GameScene::onCardSelectionChanged(AbstractCardItem *abstractCard, bool sele
} }
if (selectedItems().isEmpty()) { if (selectedItems().isEmpty()) {
owner->getGame()->setActiveCard(nullptr); setActiveCard(nullptr);
owner->requestCardMenuUpdate(nullptr); owner->requestCardMenuUpdate(nullptr);
} }
} }
@ -158,7 +168,7 @@ void GameScene::onCardRightClicked(AbstractCardItem *abstractCard, QPoint screen
return; return;
} }
card->getOwner()->getGame()->setActiveCard(card); setActiveCard(card);
if (auto *menu = view->getPlayerMenu()->updateCardMenu(card)) { if (auto *menu = view->getPlayerMenu()->updateCardMenu(card)) {
menu->popup(screenPos); menu->popup(screenPos);

View file

@ -69,6 +69,7 @@ private:
QList<ZoneViewWidget *> zoneViews; ///< Active zone view widgets QList<ZoneViewWidget *> zoneViews; ///< Active zone view widgets
QSize viewSize; ///< Current view size QSize viewSize; ///< Current view size
QPointer<CardItem> hoveredCard; ///< Currently hovered card QPointer<CardItem> hoveredCard; ///< Currently hovered card
QPointer<CardItem> activeCard; ///< Card the currently open context menu targets
QBasicTimer *animationTimer; ///< Timer for scene animations QBasicTimer *animationTimer; ///< Timer for scene animations
QHash<QObject *, IAnimatedItem *> animatedItems; ///< Items currently animating QHash<QObject *, IAnimatedItem *> animatedItems; ///< Items currently animating
QHash<QObject *, QMetaObject::Connection> QHash<QObject *, QMetaObject::Connection>
@ -108,6 +109,12 @@ public:
/** @brief Gets all selected CardItems. */ /** @brief Gets all selected CardItems. */
QList<CardItem *> selectedCards() const; QList<CardItem *> selectedCards() const;
/** @brief Card the currently open context menu targets, or null. */
CardItem *getActiveCard() const;
/** @brief Sets the card the currently open context menu targets. */
void setActiveCard(CardItem *card);
/** /**
* @brief Adds a player to the scene and stores their graphics item. * @brief Adds a player to the scene and stores their graphics item.
* @param player Player to add. * @param player Player to add.

View file

@ -98,7 +98,7 @@ QMenu *PlayerMenu::updateCardMenu(CardItem *card)
// only update the menu if the card is actually selected // only update the menu if the card is actually selected
if ((player->getLogic()->getGame()->getPlayerManager()->isSpectator() && if ((player->getLogic()->getGame()->getPlayerManager()->isSpectator() &&
!player->getLogic()->getGame()->getPlayerManager()->isJudge()) || !player->getLogic()->getGame()->getPlayerManager()->isJudge()) ||
player->getLogic()->getGame()->getActiveCard() != card) { player->getGameScene()->getActiveCard() != card) {
return nullptr; return nullptr;
} }