diff --git a/cockatrice/src/game/player/menu/player_menu.cpp b/cockatrice/src/game/player/menu/player_menu.cpp index 0dc381e28..8214cad2d 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) : QObject(_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 104c5a930..1ea86a580 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 {