From 9080a443edcad44fd2429e1fb65fba082989ce5d Mon Sep 17 00:00:00 2001 From: Manuel Monge Date: Thu, 26 Mar 2026 17:19:28 +0000 Subject: [PATCH 1/2] Fix #5774: Unused non-roll shortcuts in lobby Cause: Player menu shortcuts are activated as soon as a local player is added, which happens in the deck selection lobby before the game starts. Resolution: Disable full shortcut activation until the game has started. Allow only the roll-die shortcut (Ctrl+I) while in the lobby. --- .../src/game/player/menu/player_menu.cpp | 38 +++++++++++++++++++ cockatrice/src/game/player/menu/player_menu.h | 5 +++ .../src/game/player/menu/utility_menu.cpp | 12 +++++- .../src/game/player/menu/utility_menu.h | 1 + 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/cockatrice/src/game/player/menu/player_menu.cpp b/cockatrice/src/game/player/menu/player_menu.cpp index 7786ec3fc..dbcb52afd 100644 --- a/cockatrice/src/game/player/menu/player_menu.cpp +++ b/cockatrice/src/game/player/menu/player_menu.cpp @@ -2,6 +2,7 @@ #include "../../../interface/widgets/tabs/tab_game.h" #include "../../board/card_item.h" +#include "../../game_meta_info.h" #include "../../zones/hand_zone.h" #include "../../zones/pile_zone.h" #include "../../zones/table_zone.h" @@ -48,6 +49,13 @@ PlayerMenu::PlayerMenu(Player *_player) : player(_player) connect(&SettingsCache::instance().shortcuts(), &ShortcutsSettings::shortCutChanged, this, &PlayerMenu::refreshShortcuts); + + // Monitor game state to re-evaluate shortcuts when game starts/stops + if (player->getGame() && player->getGame()->getGameMetaInfo()) { + connect(player->getGame()->getGameMetaInfo(), &GameMetaInfo::startedChanged, this, + &PlayerMenu::onGameStartedChanged); + } + refreshShortcuts(); retranslateUi(); @@ -117,10 +125,40 @@ void PlayerMenu::refreshShortcuts() } } +void PlayerMenu::onGameStartedChanged(bool started) +{ + Q_UNUSED(started); + // Re-evaluate shortcuts when game state transitions + if (shortcutsActive) { + setShortcutsActive(); + } +} + void PlayerMenu::setShortcutsActive() { shortcutsActive = true; + // Null-safety checks + if (!player->getGame() || !player->getGame()->getGameMetaInfo()) { + return; + } + + if (!player->getGame()->getGameMetaInfo()->started()) { + for (auto *component : managedComponents) { + component->setShortcutsInactive(); + } + + QMapIterator counterIterator(player->getCounters()); + while (counterIterator.hasNext()) { + counterIterator.next().value()->setShortcutsInactive(); + } + + if (utilityMenu) { + utilityMenu->setLobbyShortcutsActive(); + } + return; + } + for (auto *component : managedComponents) { component->setShortcutsActive(); } diff --git a/cockatrice/src/game/player/menu/player_menu.h b/cockatrice/src/game/player/menu/player_menu.h index 5fce27158..83023dabf 100644 --- a/cockatrice/src/game/player/menu/player_menu.h +++ b/cockatrice/src/game/player/menu/player_menu.h @@ -69,10 +69,15 @@ public: } /// Delegates to all managedComponents, plus counters separately. + ///Stop full activation until game has started; only roll-die shortcut is active in lobby. void setShortcutsActive(); /// Delegates to all managedComponents, plus counters separately. void setShortcutsInactive(); +private slots: + /// Re-evaluate shortcut state when game started/stopped state changes. + void onGameStartedChanged(bool started); + private: Player *player; TearOffMenu *playerMenu; diff --git a/cockatrice/src/game/player/menu/utility_menu.cpp b/cockatrice/src/game/player/menu/utility_menu.cpp index 37bdcbbaf..42c040b94 100644 --- a/cockatrice/src/game/player/menu/utility_menu.cpp +++ b/cockatrice/src/game/player/menu/utility_menu.cpp @@ -117,4 +117,14 @@ void UtilityMenu::setShortcutsInactive() aCreateAnotherToken->setShortcut(QKeySequence()); aIncrementAllCardCounters->setShortcut(QKeySequence()); } -} \ No newline at end of file +} + +void UtilityMenu::setLobbyShortcutsActive() +{ + if (!player->getPlayerInfo()->getLocalOrJudge()) { + return; + } + + ShortcutsSettings &shortcuts = SettingsCache::instance().shortcuts(); + aRollDie->setShortcuts(shortcuts.getShortcut("Player/aRollDie")); +} diff --git a/cockatrice/src/game/player/menu/utility_menu.h b/cockatrice/src/game/player/menu/utility_menu.h index f6577d7d1..715d929c8 100644 --- a/cockatrice/src/game/player/menu/utility_menu.h +++ b/cockatrice/src/game/player/menu/utility_menu.h @@ -23,6 +23,7 @@ public slots: public: explicit UtilityMenu(Player *player, QMenu *playerMenu); + void setLobbyShortcutsActive(); [[nodiscard]] bool createAnotherTokenActionExists() const { From b7b7a385ea0b0ad039dd3b8107a17db6fe2390f9 Mon Sep 17 00:00:00 2001 From: Manuel Monge Date: Tue, 31 Mar 2026 16:47:58 +0100 Subject: [PATCH 2/2] style: change format code --- cockatrice/src/game/player/menu/player_menu.cpp | 4 ++-- cockatrice/src/game/player/menu/player_menu.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cockatrice/src/game/player/menu/player_menu.cpp b/cockatrice/src/game/player/menu/player_menu.cpp index dbcb52afd..c382e595d 100644 --- a/cockatrice/src/game/player/menu/player_menu.cpp +++ b/cockatrice/src/game/player/menu/player_menu.cpp @@ -49,13 +49,13 @@ PlayerMenu::PlayerMenu(Player *_player) : player(_player) connect(&SettingsCache::instance().shortcuts(), &ShortcutsSettings::shortCutChanged, this, &PlayerMenu::refreshShortcuts); - + // Monitor game state to re-evaluate shortcuts when game starts/stops if (player->getGame() && player->getGame()->getGameMetaInfo()) { connect(player->getGame()->getGameMetaInfo(), &GameMetaInfo::startedChanged, this, &PlayerMenu::onGameStartedChanged); } - + refreshShortcuts(); retranslateUi(); diff --git a/cockatrice/src/game/player/menu/player_menu.h b/cockatrice/src/game/player/menu/player_menu.h index 83023dabf..d5fb3b785 100644 --- a/cockatrice/src/game/player/menu/player_menu.h +++ b/cockatrice/src/game/player/menu/player_menu.h @@ -69,7 +69,7 @@ public: } /// Delegates to all managedComponents, plus counters separately. - ///Stop full activation until game has started; only roll-die shortcut is active in lobby. + /// Stop full activation until game has started; only roll-die shortcut is active in lobby. void setShortcutsActive(); /// Delegates to all managedComponents, plus counters separately. void setShortcutsInactive();