From 97b2b5ecf46415f3df6e68f5405b1ccb66b7593a Mon Sep 17 00:00:00 2001 From: RickyRister Date: Sat, 22 Mar 2025 05:24:46 -0700 Subject: [PATCH] Fix card menu shortcuts sometimes not working in local multiplayer --- cockatrice/src/game/cards/card_item.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/cockatrice/src/game/cards/card_item.cpp b/cockatrice/src/game/cards/card_item.cpp index f5426a60f..ee77a48ac 100644 --- a/cockatrice/src/game/cards/card_item.cpp +++ b/cockatrice/src/game/cards/card_item.cpp @@ -475,6 +475,17 @@ bool CardItem::animationEvent() return animationIncomplete; } +/** + * Checks if any of the items is a CardItem that is owned by the given player. + */ +static bool hasCardsOwnedBy(const QList &items, const Player *owner) +{ + return std::any_of(items.cbegin(), items.cend(), [owner](QGraphicsItem *item) { + auto *card = qgraphicsitem_cast(item); + return card && card->getOwner() == owner; + }); +} + QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value) { if ((change == ItemSelectedHasChanged) && owner != nullptr) { @@ -482,9 +493,14 @@ QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value) owner->setCardMenu(cardMenu); owner->getGame()->setActiveCard(this); } else if (owner->getCardMenu() == cardMenu) { - if (scene() && scene()->selectedItems().isEmpty()) { - owner->setCardMenu(nullptr); - } + // If selection is cleared while multiple cards are selected, there might still be items in the selection + // when this itemChange triggers. + // Delay empty check by 1 frame to ensure the entire selection is cleared first. + QTimer::singleShot(1, this, [this] { + if (scene() && !hasCardsOwnedBy(scene()->selectedItems(), owner)) { + owner->setCardMenu(nullptr); + } + }); owner->getGame()->setActiveCard(nullptr); } }