diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 903073a16..19d46118e 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -241,6 +241,8 @@ set(cockatrice_SOURCES src/game/player/player_menu/player_menu.cpp src/game/player/player_menu/pt_menu.cpp src/game/player/player_menu/rfg_menu.cpp + src/game/player/player_menu/say_menu.cpp + src/game/player/player_menu/utility_menu.cpp src/game/replay.cpp src/game/zones/card_zone.cpp src/game/zones/hand_zone.cpp diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index d176e9371..2e5c247df 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -42,8 +42,6 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, A connect(this, &Player::activeChanged, graphicsItem, &PlayerGraphicsItem::onPlayerActiveChanged); - connect(this, &Player::deckChanged, playerMenu, &PlayerMenu::populatePredefinedTokensMenu); - connect(this, &Player::openDeckEditor, game->getTab(), &TabGame::openDeckEditor); } diff --git a/cockatrice/src/game/player/player_actions.cpp b/cockatrice/src/game/player/player_actions.cpp index 6c63e2ef3..2f1badfea 100644 --- a/cockatrice/src/game/player/player_actions.cpp +++ b/cockatrice/src/game/player/player_actions.cpp @@ -833,7 +833,7 @@ void PlayerActions::actRollDie() void PlayerActions::actCreateToken() { - DlgCreateToken dlg(player->getPlayerMenu()->getPredefinedTokens(), player->getGame()->getTab()); + DlgCreateToken dlg(player->getPlayerMenu()->getUtilityMenu()->getPredefinedTokens(), player->getGame()->getTab()); if (!dlg.exec()) { return; } @@ -850,7 +850,7 @@ void PlayerActions::actCreateToken() } } - player->getPlayerMenu()->setAndEnableCreateAnotherTokenAction( + player->getPlayerMenu()->getUtilityMenu()->setAndEnableCreateAnotherTokenAction( tr("C&reate another %1 token").arg(lastTokenInfo.name)); actCreateAnotherToken(); } @@ -878,7 +878,7 @@ void PlayerActions::actCreateAnotherToken() void PlayerActions::setLastToken(CardInfoPtr cardInfo) { - if (cardInfo == nullptr || !player->getPlayerMenu()->createAnotherTokenActionExists()) { + if (cardInfo == nullptr || !player->getPlayerMenu()->getUtilityMenu()->createAnotherTokenActionExists()) { return; } @@ -892,7 +892,7 @@ void PlayerActions::setLastToken(CardInfoPtr cardInfo) lastTokenTableRow = TableZone::clampValidTableRow(2 - cardInfo->getTableRow()); - player->getPlayerMenu()->setAndEnableCreateAnotherTokenAction( + player->getPlayerMenu()->getUtilityMenu()->setAndEnableCreateAnotherTokenAction( tr("C&reate another %1 token").arg(lastTokenInfo.name)); } diff --git a/cockatrice/src/game/player/player_menu/player_menu.cpp b/cockatrice/src/game/player/player_menu/player_menu.cpp index aa2951992..1cd53194b 100644 --- a/cockatrice/src/game/player/player_menu/player_menu.cpp +++ b/cockatrice/src/game/player/player_menu/player_menu.cpp @@ -57,58 +57,21 @@ PlayerMenu::PlayerMenu(Player *_player) : player(_player) mCustomZones = playerMenu->addMenu(QString()); mCustomZones->menuAction()->setVisible(false); - aUntapAll = new QAction(this); - connect(aUntapAll, &QAction::triggered, playerActions, &PlayerActions::actUntapAll); - - aRollDie = new QAction(this); - connect(aRollDie, &QAction::triggered, playerActions, &PlayerActions::actRollDie); - - aCreateToken = new QAction(this); - connect(aCreateToken, &QAction::triggered, playerActions, &PlayerActions::actCreateToken); - - aCreateAnotherToken = new QAction(this); - connect(aCreateAnotherToken, &QAction::triggered, playerActions, &PlayerActions::actCreateAnotherToken); - aCreateAnotherToken->setEnabled(false); - - aIncrementAllCardCounters = new QAction(this); - connect(aIncrementAllCardCounters, &QAction::triggered, player, &Player::incrementAllCardCounters); - - createPredefinedTokenMenu = new QMenu(QString()); - createPredefinedTokenMenu->setEnabled(false); - playerMenu->addSeparator(); countersMenu = playerMenu->addMenu(QString()); - playerMenu->addAction(aIncrementAllCardCounters); - playerMenu->addSeparator(); - playerMenu->addAction(aUntapAll); - playerMenu->addSeparator(); - playerMenu->addAction(aRollDie); - playerMenu->addSeparator(); - playerMenu->addAction(aCreateToken); - playerMenu->addAction(aCreateAnotherToken); - playerMenu->addMenu(createPredefinedTokenMenu); - playerMenu->addSeparator(); + + utilityMenu = new UtilityMenu(player, playerMenu); } else { countersMenu = nullptr; sbMenu = nullptr; mCustomZones = nullptr; - aCreateToken = nullptr; - aCreateAnotherToken = nullptr; - createPredefinedTokenMenu = nullptr; - aIncrementAllCardCounters = nullptr; - aViewSideboard = nullptr; - sbMenu = nullptr; - - aUntapAll = nullptr; - aRollDie = nullptr; + utilityMenu = nullptr; } if (player->getPlayerInfo()->getLocal()) { - sayMenu = playerMenu->addMenu(QString()); - connect(&SettingsCache::instance().messages(), &MessageSettings::messageMacrosChanged, this, - &PlayerMenu::initSayMenu); - initSayMenu(); + sayMenu = new SayMenu(player); + playerMenu->addMenu(sayMenu); } if (player->getPlayerInfo()->getLocalOrJudge()) { @@ -270,30 +233,6 @@ void PlayerMenu::addViewCustomZoneActionToCustomZoneMenu(QString zoneName) } } -void PlayerMenu::populatePredefinedTokensMenu() -{ - DeckLoader *_deck = player->getDeck(); - createPredefinedTokenMenu->clear(); - createPredefinedTokenMenu->setEnabled(false); - predefinedTokens.clear(); - InnerDecklistNode *tokenZone = dynamic_cast(_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::retranslateUi() { playerMenu->setTitle(tr("Player \"%1\"").arg(player->getPlayerInfo()->getName())); @@ -306,6 +245,7 @@ void PlayerMenu::retranslateUi() handMenu->retranslateUi(); sbMenu->setTitle(tr("&Sideboard")); libraryMenu->retranslateUi(); + utilityMenu->retranslateUi(); countersMenu->setTitle(tr("&Counters")); mCustomZones->setTitle(tr("C&ustom Zones")); @@ -313,13 +253,6 @@ void PlayerMenu::retranslateUi() aViewZone->setText(tr("View custom zone '%1'").arg(aViewZone->data().toString())); } - aIncrementAllCardCounters->setText(tr("Increment all card counters")); - aUntapAll->setText(tr("&Untap all permanents")); - aRollDie->setText(tr("R&oll die...")); - aCreateToken->setText(tr("&Create token...")); - aCreateAnotherToken->setText(tr("C&reate another token")); - createPredefinedTokenMenu->setTitle(tr("Cr&eate predefined token")); - for (auto &allPlayersAction : allPlayersActions) { allPlayersAction->setText(tr("&All players")); } @@ -356,18 +289,16 @@ void PlayerMenu::setShortcutsActive() libraryMenu->setShortcutsActive(); } graveMenu->setShortcutsActive(); + if (utilityMenu) { + utilityMenu->setShortcutsActive(); + } QMapIterator counterIterator(player->getCounters()); while (counterIterator.hasNext()) { counterIterator.next().value()->setShortcutsActive(); } - setShortcutIfItExists(aIncrementAllCardCounters, shortcuts.getShortcut("Player/aIncrementAllCardCounters")); setShortcutIfItExists(aViewSideboard, shortcuts.getShortcut("Player/aViewSideboard")); - setShortcutIfItExists(aUntapAll, shortcuts.getShortcut("Player/aUntapAll")); - setShortcutIfItExists(aRollDie, shortcuts.getShortcut("Player/aRollDie")); - setShortcutIfItExists(aCreateToken, shortcuts.getShortcut("Player/aCreateToken")); - setShortcutIfItExists(aCreateAnotherToken, shortcuts.getShortcut("Player/aCreateAnotherToken")); } void PlayerMenu::setShortcutsInactive() @@ -375,31 +306,9 @@ void PlayerMenu::setShortcutsInactive() shortcutsActive = false; clearShortcutIfItExists(aViewSideboard); - clearShortcutIfItExists(aUntapAll); - clearShortcutIfItExists(aRollDie); - clearShortcutIfItExists(aCreateToken); - clearShortcutIfItExists(aCreateAnotherToken); - clearShortcutIfItExists(aIncrementAllCardCounters); QMapIterator counterIterator(player->getCounters()); while (counterIterator.hasNext()) { counterIterator.next().value()->setShortcutsInactive(); } -} - -void PlayerMenu::initSayMenu() -{ - sayMenu->clear(); - - int count = SettingsCache::instance().messages().getCount(); - sayMenu->setEnabled(count > 0); - - for (int i = 0; i < count; ++i) { - auto *newAction = new QAction(SettingsCache::instance().messages().getMessageAt(i), sayMenu); - if (i < 10) { - newAction->setShortcut(QKeySequence("Ctrl+" + QString::number((i + 1) % 10))); - } - connect(newAction, &QAction::triggered, player->getPlayerActions(), &PlayerActions::actSayMessage); - sayMenu->addAction(newAction); - } -} +} \ No newline at end of file diff --git a/cockatrice/src/game/player/player_menu/player_menu.h b/cockatrice/src/game/player/player_menu/player_menu.h index fcd3e6cf8..398c13191 100644 --- a/cockatrice/src/game/player/player_menu/player_menu.h +++ b/cockatrice/src/game/player/player_menu/player_menu.h @@ -7,6 +7,8 @@ #include "hand_menu.h" #include "library_menu.h" #include "rfg_menu.h" +#include "say_menu.h" +#include "utility_menu.h" #include #include @@ -19,7 +21,6 @@ signals: void cardMenuUpdated(QMenu *cardMenu); public slots: - void populatePredefinedTokensMenu(); void setMenusForGraphicItems(); private slots: @@ -39,22 +40,6 @@ public: QMenu *updateCardMenu(const CardItem *card); - [[nodiscard]] bool createAnotherTokenActionExists() const - { - return aCreateAnotherToken != nullptr; - } - - void setAndEnableCreateAnotherTokenAction(QString text) - { - aCreateAnotherToken->setText(text); - aCreateAnotherToken->setEnabled(true); - } - - QStringList getPredefinedTokens() const - { - return predefinedTokens; - } - [[nodiscard]] QMenu *getPlayerMenu() const { return playerMenu; @@ -70,6 +55,11 @@ public: return libraryMenu; } + [[nodiscard]] UtilityMenu *getUtilityMenu() const + { + return utilityMenu; + } + bool getShortcutsActive() const { return shortcutsActive; @@ -82,20 +72,19 @@ public: private: Player *player; - QMenu *sbMenu, *countersMenu, *sayMenu, *createPredefinedTokenMenu, *mCustomZones; + TearOffMenu *playerMenu; + QMenu *sbMenu, *countersMenu, *mCustomZones; HandMenu *handMenu; LibraryMenu *libraryMenu; GraveyardMenu *graveMenu; RfgMenu *rfgMenu; - TearOffMenu *playerMenu; + UtilityMenu *utilityMenu; + SayMenu *sayMenu; QList playerLists; QList allPlayersActions; - QAction *aViewSideboard, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken; - - QAction *aIncrementAllCardCounters; + QAction *aViewSideboard; bool shortcutsActive; - QStringList predefinedTokens; void initSayMenu(); }; diff --git a/cockatrice/src/game/player/player_menu/say_menu.cpp b/cockatrice/src/game/player/player_menu/say_menu.cpp new file mode 100644 index 000000000..3598a1c66 --- /dev/null +++ b/cockatrice/src/game/player/player_menu/say_menu.cpp @@ -0,0 +1,28 @@ +#include "say_menu.h" + +#include "../../../settings/cache_settings.h" +#include "../player.h" +#include "../player_actions.h" + +SayMenu::SayMenu(Player *_player) : player(_player) +{ + connect(&SettingsCache::instance().messages(), &MessageSettings::messageMacrosChanged, this, &SayMenu::initSayMenu); + initSayMenu(); +} + +void SayMenu::initSayMenu() +{ + clear(); + + int count = SettingsCache::instance().messages().getCount(); + setEnabled(count > 0); + + for (int i = 0; i < count; ++i) { + auto *newAction = new QAction(SettingsCache::instance().messages().getMessageAt(i), this); + if (i < 10) { + newAction->setShortcut(QKeySequence("Ctrl+" + QString::number((i + 1) % 10))); + } + connect(newAction, &QAction::triggered, player->getPlayerActions(), &PlayerActions::actSayMessage); + addAction(newAction); + } +} \ No newline at end of file diff --git a/cockatrice/src/game/player/player_menu/say_menu.h b/cockatrice/src/game/player/player_menu/say_menu.h new file mode 100644 index 000000000..2df84e78a --- /dev/null +++ b/cockatrice/src/game/player/player_menu/say_menu.h @@ -0,0 +1,18 @@ +#ifndef COCKATRICE_SAY_MENU_H +#define COCKATRICE_SAY_MENU_H + +#include + +class Player; +class SayMenu : public QMenu +{ + Q_OBJECT +public: + explicit SayMenu(Player *player); + void initSayMenu(); + +private: + Player *player; +}; + +#endif // COCKATRICE_SAY_MENU_H diff --git a/cockatrice/src/game/player/player_menu/utility_menu.cpp b/cockatrice/src/game/player/player_menu/utility_menu.cpp new file mode 100644 index 000000000..6f7bfeb63 --- /dev/null +++ b/cockatrice/src/game/player/player_menu/utility_menu.cpp @@ -0,0 +1,112 @@ +#include "utility_menu.h" + +#include "../player.h" +#include "../player_actions.h" +#include "player_menu.h" + +UtilityMenu::UtilityMenu(Player *_player, QMenu *playerMenu) : QMenu(playerMenu), player(_player) +{ + PlayerActions *playerActions = player->getPlayerActions(); + + if (player->getPlayerInfo()->getLocalOrJudge()) { + aUntapAll = new QAction(this); + connect(aUntapAll, &QAction::triggered, playerActions, &PlayerActions::actUntapAll); + + aRollDie = new QAction(this); + connect(aRollDie, &QAction::triggered, playerActions, &PlayerActions::actRollDie); + + aCreateToken = new QAction(this); + connect(aCreateToken, &QAction::triggered, playerActions, &PlayerActions::actCreateToken); + + aCreateAnotherToken = new QAction(this); + connect(aCreateAnotherToken, &QAction::triggered, playerActions, &PlayerActions::actCreateAnotherToken); + aCreateAnotherToken->setEnabled(false); + + aIncrementAllCardCounters = new QAction(this); + connect(aIncrementAllCardCounters, &QAction::triggered, player, &Player::incrementAllCardCounters); + + createPredefinedTokenMenu = new QMenu(QString()); + createPredefinedTokenMenu->setEnabled(false); + connect(player, &Player::deckChanged, this, &UtilityMenu::populatePredefinedTokensMenu); + + playerMenu->addAction(aIncrementAllCardCounters); + playerMenu->addSeparator(); + playerMenu->addAction(aUntapAll); + playerMenu->addSeparator(); + playerMenu->addAction(aRollDie); + playerMenu->addSeparator(); + playerMenu->addAction(aCreateToken); + playerMenu->addAction(aCreateAnotherToken); + playerMenu->addMenu(createPredefinedTokenMenu); + playerMenu->addSeparator(); + } else { + aCreateToken = nullptr; + aCreateAnotherToken = nullptr; + createPredefinedTokenMenu = nullptr; + aIncrementAllCardCounters = nullptr; + aUntapAll = nullptr; + aRollDie = nullptr; + } + + retranslateUi(); +} + +void UtilityMenu::populatePredefinedTokensMenu() +{ + DeckLoader *_deck = player->getDeck(); + clear(); + setEnabled(false); + predefinedTokens.clear(); + InnerDecklistNode *tokenZone = dynamic_cast(_deck->getRoot()->findChild(DECK_ZONE_TOKENS)); + + if (tokenZone) { + if (!tokenZone->empty()) + setEnabled(true); + + for (int i = 0; i < tokenZone->size(); ++i) { + const QString tokenName = tokenZone->at(i)->getName(); + predefinedTokens.append(tokenName); + QAction *a = addAction(tokenName); + if (i < 10) { + a->setShortcut(QKeySequence("Alt+" + QString::number((i + 1) % 10))); + } + connect(a, &QAction::triggered, player->getPlayerActions(), &PlayerActions::actCreatePredefinedToken); + } + } +} + +void UtilityMenu::retranslateUi() +{ + if (player->getPlayerInfo()->getLocalOrJudge()) { + aIncrementAllCardCounters->setText(tr("Increment all card counters")); + aUntapAll->setText(tr("&Untap all permanents")); + aRollDie->setText(tr("R&oll die...")); + aCreateToken->setText(tr("&Create token...")); + aCreateAnotherToken->setText(tr("C&reate another token")); + createPredefinedTokenMenu->setTitle(tr("Cr&eate predefined token")); + } +} + +void UtilityMenu::setShortcutsActive() +{ + ShortcutsSettings &shortcuts = SettingsCache::instance().shortcuts(); + + if (player->getPlayerInfo()->getLocalOrJudge()) { + aIncrementAllCardCounters->setShortcuts(shortcuts.getShortcut("Player/aIncrementAllCardCounters")); + aUntapAll->setShortcuts(shortcuts.getShortcut("Player/aUntapAll")); + aRollDie->setShortcuts(shortcuts.getShortcut("Player/aRollDie")); + aCreateToken->setShortcuts(shortcuts.getShortcut("Player/aCreateToken")); + aCreateAnotherToken->setShortcuts(shortcuts.getShortcut("Player/aCreateAnotherToken")); + } +} + +void UtilityMenu::setShortcutsInactive() +{ + if (player->getPlayerInfo()->getLocalOrJudge()) { + aUntapAll->setShortcut(QKeySequence()); + aRollDie->setShortcut(QKeySequence()); + aCreateToken->setShortcut(QKeySequence()); + aCreateAnotherToken->setShortcut(QKeySequence()); + aIncrementAllCardCounters->setShortcut(QKeySequence()); + } +} \ No newline at end of file diff --git a/cockatrice/src/game/player/player_menu/utility_menu.h b/cockatrice/src/game/player/player_menu/utility_menu.h new file mode 100644 index 000000000..ce5005180 --- /dev/null +++ b/cockatrice/src/game/player/player_menu/utility_menu.h @@ -0,0 +1,46 @@ +#ifndef COCKATRICE_UTILITY_MENU_H +#define COCKATRICE_UTILITY_MENU_H + +#include + +class Player; +class UtilityMenu : public QMenu +{ + Q_OBJECT +public slots: + void populatePredefinedTokensMenu(); + void retranslateUi(); + void setShortcutsActive(); + void setShortcutsInactive(); + +public: + explicit UtilityMenu(Player *player, QMenu *playerMenu); + + [[nodiscard]] bool createAnotherTokenActionExists() const + { + return aCreateAnotherToken != nullptr; + } + + void setAndEnableCreateAnotherTokenAction(QString text) + { + aCreateAnotherToken->setText(text); + aCreateAnotherToken->setEnabled(true); + } + + QStringList getPredefinedTokens() const + { + return predefinedTokens; + } + +private: + Player *player; + QStringList predefinedTokens; + + QMenu *createPredefinedTokenMenu; + + QAction *aIncrementAllCardCounters; + QAction *aUntapAll, *aRollDie; + QAction *aCreateToken, *aCreateAnotherToken; +}; + +#endif // COCKATRICE_UTILITY_MENU_H