diff --git a/cockatrice/src/client/menus/deck_editor/deck_editor_menu.cpp b/cockatrice/src/client/menus/deck_editor/deck_editor_menu.cpp index be4d50d58..73c76c807 100644 --- a/cockatrice/src/client/menus/deck_editor/deck_editor_menu.cpp +++ b/cockatrice/src/client/menus/deck_editor/deck_editor_menu.cpp @@ -39,16 +39,15 @@ DeckEditorMenu::DeckEditorMenu(QWidget *parent, AbstractTabDeckEditor *_deckEdit aSaveDeckToClipboard = new QAction(QString(), this); connect(aSaveDeckToClipboard, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboard())); - aSaveDeckToClipboardNoSetNameAndNumber = new QAction(QString(), this); - connect(aSaveDeckToClipboardNoSetNameAndNumber, SIGNAL(triggered()), deckEditor, - SLOT(actSaveDeckToClipboardNoSetNameAndNumber())); + aSaveDeckToClipboardNoSetInfo = new QAction(QString(), this); + connect(aSaveDeckToClipboardNoSetInfo, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboardNoSetInfo())); aSaveDeckToClipboardRaw = new QAction(QString(), this); connect(aSaveDeckToClipboardRaw, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboardRaw())); - aSaveDeckToClipboardRawNoSetNameAndNumber = new QAction(QString(), this); - connect(aSaveDeckToClipboardRawNoSetNameAndNumber, SIGNAL(triggered()), deckEditor, - SLOT(actSaveDeckToClipboardRawNoSetNameAndNumber())); + aSaveDeckToClipboardRawNoSetInfo = new QAction(QString(), this); + connect(aSaveDeckToClipboardRawNoSetInfo, SIGNAL(triggered()), deckEditor, + SLOT(actSaveDeckToClipboardRawNoSetInfo())); aPrintDeck = new QAction(QString(), this); connect(aPrintDeck, SIGNAL(triggered()), deckEditor, SLOT(actPrintDeck())); @@ -76,9 +75,9 @@ DeckEditorMenu::DeckEditorMenu(QWidget *parent, AbstractTabDeckEditor *_deckEdit saveDeckToClipboardMenu = new QMenu(this); saveDeckToClipboardMenu->addAction(aSaveDeckToClipboard); - saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardNoSetNameAndNumber); + saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardNoSetInfo); saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardRaw); - saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardRawNoSetNameAndNumber); + saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardRawNoSetInfo); addAction(aNewDeck); addAction(aLoadDeck); @@ -108,9 +107,9 @@ void DeckEditorMenu::setSaveStatus(bool newStatus) aSaveDeck->setEnabled(newStatus); aSaveDeckAs->setEnabled(newStatus); aSaveDeckToClipboard->setEnabled(newStatus); - aSaveDeckToClipboardNoSetNameAndNumber->setEnabled(newStatus); + aSaveDeckToClipboardNoSetInfo->setEnabled(newStatus); aSaveDeckToClipboardRaw->setEnabled(newStatus); - aSaveDeckToClipboardRawNoSetNameAndNumber->setEnabled(newStatus); + aSaveDeckToClipboardRawNoSetInfo->setEnabled(newStatus); saveDeckToClipboardMenu->setEnabled(newStatus); aPrintDeck->setEnabled(newStatus); analyzeDeckMenu->setEnabled(newStatus); @@ -153,9 +152,9 @@ void DeckEditorMenu::retranslateUi() saveDeckToClipboardMenu->setTitle(tr("Save deck to clipboard")); aSaveDeckToClipboard->setText(tr("Annotated")); - aSaveDeckToClipboardNoSetNameAndNumber->setText(tr("Annotated (No set name or number)")); + aSaveDeckToClipboardNoSetInfo->setText(tr("Annotated (No set info)")); aSaveDeckToClipboardRaw->setText(tr("Not Annotated")); - aSaveDeckToClipboardRawNoSetNameAndNumber->setText(tr("Not Annotated (No set name or number)")); + aSaveDeckToClipboardRawNoSetInfo->setText(tr("Not Annotated (No set info)")); aPrintDeck->setText(tr("&Print deck...")); @@ -183,7 +182,10 @@ void DeckEditorMenu::refreshShortcuts() aClose->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aClose")); aSaveDeckToClipboard->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboard")); + aSaveDeckToClipboardNoSetInfo->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboardNoSetInfo")); aSaveDeckToClipboardRaw->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboardRaw")); + aSaveDeckToClipboardRawNoSetInfo->setShortcuts( + shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboardRawNoSetInfo")); aClose->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aClose")); } diff --git a/cockatrice/src/client/menus/deck_editor/deck_editor_menu.h b/cockatrice/src/client/menus/deck_editor/deck_editor_menu.h index 5d0a3f9e6..50ddc795a 100644 --- a/cockatrice/src/client/menus/deck_editor/deck_editor_menu.h +++ b/cockatrice/src/client/menus/deck_editor/deck_editor_menu.h @@ -15,8 +15,8 @@ public: AbstractTabDeckEditor *deckEditor; QAction *aNewDeck, *aLoadDeck, *aClearRecents, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, - *aEditDeckInClipboard, *aEditDeckInClipboardRaw, *aSaveDeckToClipboard, *aSaveDeckToClipboardNoSetNameAndNumber, - *aSaveDeckToClipboardRaw, *aSaveDeckToClipboardRawNoSetNameAndNumber, *aPrintDeck, *aExportDeckDecklist, + *aEditDeckInClipboard, *aEditDeckInClipboardRaw, *aSaveDeckToClipboard, *aSaveDeckToClipboardNoSetInfo, + *aSaveDeckToClipboardRaw, *aSaveDeckToClipboardRawNoSetInfo, *aPrintDeck, *aExportDeckDecklist, *aAnalyzeDeckDeckstats, *aAnalyzeDeckTappedout, *aClose; QMenu *loadRecentDeckMenu, *analyzeDeckMenu, *editDeckInClipboardMenu, *saveDeckToClipboardMenu; diff --git a/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp b/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp index 4dcc57ea6..326e722c9 100644 --- a/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp +++ b/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp @@ -76,7 +76,7 @@ void AbstractTabDeckEditor::updateCard(CardInfoPtr _card) void AbstractTabDeckEditor::onDeckChanged() { - setModified(isBlankNewDeck()); + setModified(!isBlankNewDeck()); deckMenu->setSaveStatus(!isBlankNewDeck()); } @@ -128,6 +128,19 @@ void AbstractTabDeckEditor::actSwapCard(CardInfoPtr info, QString zoneName) deckDockWidget->deckModel->findCard(info->getName(), zoneName, providerId, collectorNumber)); } +/** + * Opens the deck in this tab. + * @param deck The deck. Takes ownership of the object + */ +void AbstractTabDeckEditor::openDeck(DeckLoader *deck) +{ + setDeck(deck); + + if (!deck->getLastFileName().isEmpty()) { + SettingsCache::instance().recents().updateRecentlyOpenedDeckPaths(deck->getLastFileName()); + } +} + /** * Sets the currently active deck for this tab * @param _deck The deck. Takes ownership of the object @@ -290,13 +303,12 @@ void AbstractTabDeckEditor::openDeckFromFile(const QString &fileName, DeckOpenLo auto *l = new DeckLoader; if (l->loadFromFile(fileName, fmt, true)) { - SettingsCache::instance().recents().updateRecentlyOpenedDeckPaths(fileName); if (deckOpenLocation == NEW_TAB) { emit openDeckEditor(l); l->deleteLater(); } else { deckMenu->setSaveStatus(false); - setDeck(l); + openDeck(l); } } else { l->deleteLater(); @@ -421,7 +433,7 @@ void AbstractTabDeckEditor::actSaveDeckToClipboard() getDeckList()->saveToClipboard(true, true); } -void AbstractTabDeckEditor::actSaveDeckToClipboardNoSetNameAndNumber() +void AbstractTabDeckEditor::actSaveDeckToClipboardNoSetInfo() { getDeckList()->saveToClipboard(true, false); } @@ -431,7 +443,7 @@ void AbstractTabDeckEditor::actSaveDeckToClipboardRaw() getDeckList()->saveToClipboard(false, true); } -void AbstractTabDeckEditor::actSaveDeckToClipboardRawNoSetNameAndNumber() +void AbstractTabDeckEditor::actSaveDeckToClipboardRawNoSetInfo() { getDeckList()->saveToClipboard(false, false); } diff --git a/cockatrice/src/client/tabs/abstract_tab_deck_editor.h b/cockatrice/src/client/tabs/abstract_tab_deck_editor.h index 94fbe9bde..47e6fc78c 100644 --- a/cockatrice/src/client/tabs/abstract_tab_deck_editor.h +++ b/cockatrice/src/client/tabs/abstract_tab_deck_editor.h @@ -54,7 +54,7 @@ public: virtual void retranslateUi() override = 0; // Deck Management - virtual void setDeck(DeckLoader *_deckLoader); + void openDeck(DeckLoader *deck); DeckLoader *getDeckList() const; void setModified(bool _windowModified); @@ -95,9 +95,9 @@ protected slots: void actEditDeckInClipboard(); void actEditDeckInClipboardRaw(); void actSaveDeckToClipboard(); - void actSaveDeckToClipboardNoSetNameAndNumber(); + void actSaveDeckToClipboardNoSetInfo(); void actSaveDeckToClipboardRaw(); - void actSaveDeckToClipboardRawNoSetNameAndNumber(); + void actSaveDeckToClipboardRawNoSetInfo(); void actPrintDeck(); void actExportDeckDecklist(); void actAnalyzeDeckDeckstats(); @@ -117,6 +117,7 @@ protected slots: virtual void dockFloatingTriggered() = 0; private: + virtual void setDeck(DeckLoader *_deck); void editDeckInClipboard(bool annotated); protected: diff --git a/cockatrice/src/client/tabs/tab_deck_storage.cpp b/cockatrice/src/client/tabs/tab_deck_storage.cpp index 5fa25be4f..f696f607c 100644 --- a/cockatrice/src/client/tabs/tab_deck_storage.cpp +++ b/cockatrice/src/client/tabs/tab_deck_storage.cpp @@ -246,8 +246,6 @@ void TabDeckStorage::actOpenLocalDeck() if (!deckLoader.loadFromFile(filePath, DeckLoader::CockatriceFormat, true)) continue; - SettingsCache::instance().recents().updateRecentlyOpenedDeckPaths(filePath); - emit openDeckEditor(&deckLoader); } } diff --git a/cockatrice/src/client/tabs/tab_supervisor.cpp b/cockatrice/src/client/tabs/tab_supervisor.cpp index 5b89ab257..e2fb234d7 100644 --- a/cockatrice/src/client/tabs/tab_supervisor.cpp +++ b/cockatrice/src/client/tabs/tab_supervisor.cpp @@ -772,7 +772,7 @@ TabDeckEditor *TabSupervisor::addDeckEditorTab(const DeckLoader *deckToOpen) { auto *tab = new TabDeckEditor(this); if (deckToOpen) - tab->setDeck(new DeckLoader(*deckToOpen)); + tab->openDeck(new DeckLoader(*deckToOpen)); connect(tab, &AbstractTabDeckEditor::deckEditorClosing, this, &TabSupervisor::deckEditorClosed); connect(tab, &AbstractTabDeckEditor::openDeckEditor, this, &TabSupervisor::addDeckEditorTab); myAddTab(tab); diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp index a10a2442f..3564a05a9 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp @@ -288,6 +288,8 @@ QMenu *DeckPreviewWidget::createRightClickMenu() connect(menu->addAction(tr("Edit Tags")), &QAction::triggered, deckTagsDisplayWidget, &DeckPreviewDeckTagsDisplayWidget::openTagEditDlg); + addSetBannerCardMenu(menu); + menu->addSeparator(); connect(menu->addAction(tr("Rename Deck")), &QAction::triggered, this, &DeckPreviewWidget::actRenameDeck); @@ -312,6 +314,28 @@ QMenu *DeckPreviewWidget::createRightClickMenu() return menu; } +/** + * Adds the "Set Banner Card" submenu to the given menu. Does nothing if bannerCardComboBox is null. + * @param menu The menu to add the submenu to + */ +void DeckPreviewWidget::addSetBannerCardMenu(QMenu *menu) +{ + if (!bannerCardComboBox) { + return; + } + + auto bannerCardMenu = menu->addMenu(tr("Set Banner Card")); + + for (int i = 0; i < bannerCardComboBox->count(); ++i) { + auto action = bannerCardMenu->addAction(bannerCardComboBox->itemText(i)); + connect(action, &QAction::triggered, this, [this, i] { bannerCardComboBox->setCurrentIndex(i); }); + + // the checkability is purely for visuals + action->setCheckable(true); + action->setChecked(bannerCardComboBox->currentIndex() == i); + } +} + void DeckPreviewWidget::actRenameDeck() { // read input diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h index 4dc5c5aa6..a9df635e5 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h @@ -59,6 +59,7 @@ public slots: private: QMenu *createRightClickMenu(); + void addSetBannerCardMenu(QMenu *menu); private slots: void actRenameDeck(); diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index 230f12ad7..bcd18d23a 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -246,8 +246,10 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T connect(aDrawCards, &QAction::triggered, this, &Player::actDrawCards); aUndoDraw = new QAction(this); connect(aUndoDraw, &QAction::triggered, this, &Player::actUndoDraw); + aShuffle = new QAction(this); connect(aShuffle, &QAction::triggered, this, &Player::actShuffle); + aMulligan = new QAction(this); connect(aMulligan, &QAction::triggered, this, &Player::actMulligan); @@ -268,6 +270,9 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T aMoveTopCardToBottom = new QAction(this); connect(aMoveTopCardToBottom, &QAction::triggered, this, &Player::actMoveTopCardToBottom); + aShuffleTopCards = new QAction(this); + connect(aShuffleTopCards, &QAction::triggered, this, &Player::actShuffleTop); + aDrawBottomCard = new QAction(this); connect(aDrawBottomCard, &QAction::triggered, this, &Player::actDrawBottomCard); aDrawBottomCards = new QAction(this); @@ -286,6 +291,9 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T connect(aMoveBottomCardsToExile, &QAction::triggered, this, &Player::actMoveBottomCardsToExile); aMoveBottomCardToTop = new QAction(this); connect(aMoveBottomCardToTop, &QAction::triggered, this, &Player::actMoveBottomCardToTop); + + aShuffleBottomCards = new QAction(this); + connect(aShuffleBottomCards, &QAction::triggered, this, &Player::actShuffleBottom); } playerMenu = new TearOffMenu(); @@ -330,7 +338,6 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T libraryMenu->addSeparator(); libraryMenu->addAction(aOpenDeckInDeckEditor); _deck->setMenu(libraryMenu, aDrawCard); - topLibraryMenu->addAction(aMoveTopToPlay); topLibraryMenu->addAction(aMoveTopToPlayFaceDown); topLibraryMenu->addAction(aMoveTopCardToBottom); @@ -340,6 +347,8 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T topLibraryMenu->addAction(aMoveTopCardToExile); topLibraryMenu->addAction(aMoveTopCardsToExile); topLibraryMenu->addAction(aMoveTopCardsUntil); + topLibraryMenu->addSeparator(); + topLibraryMenu->addAction(aShuffleTopCards); bottomLibraryMenu->addAction(aDrawBottomCard); bottomLibraryMenu->addAction(aDrawBottomCards); @@ -352,6 +361,8 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T bottomLibraryMenu->addAction(aMoveBottomCardsToGraveyard); bottomLibraryMenu->addAction(aMoveBottomCardToExile); bottomLibraryMenu->addAction(aMoveBottomCardsToExile); + bottomLibraryMenu->addSeparator(); + bottomLibraryMenu->addAction(aShuffleBottomCards); } graveMenu = playerMenu->addTearOffMenu(QString()); @@ -792,7 +803,8 @@ void Player::retranslateUi() aDrawCards->setText(tr("D&raw cards...")); aUndoDraw->setText(tr("&Undo last draw")); aMulligan->setText(tr("Take &mulligan")); - aShuffle->setText(tr("&Shuffle")); + + aShuffle->setText(tr("Shuffle")); aMoveTopToPlay->setText(tr("&Play top card")); aMoveTopToPlayFaceDown->setText(tr("Play top card &face down")); @@ -802,6 +814,7 @@ void Player::retranslateUi() aMoveTopCardsToGraveyard->setText(tr("Move top cards to &graveyard...")); aMoveTopCardsToExile->setText(tr("Move top cards to &exile...")); aMoveTopCardsUntil->setText(tr("Put top cards on stack &until...")); + aShuffleTopCards->setText(tr("Shuffle top cards...")); aDrawBottomCard->setText(tr("&Draw bottom card")); aDrawBottomCards->setText(tr("D&raw bottom cards...")); @@ -812,6 +825,7 @@ void Player::retranslateUi() aMoveBottomCardsToGraveyard->setText(tr("Move bottom cards to &graveyard...")); aMoveBottomCardsToExile->setText(tr("Move bottom cards to &exile...")); aMoveBottomCardToTop->setText(tr("Put bottom card on &top")); + aShuffleBottomCards->setText(tr("Shuffle bottom cards...")); handMenu->setTitle(tr("&Hand")); mRevealHand->setTitle(tr("&Reveal hand to...")); @@ -979,6 +993,8 @@ void Player::setShortcutsActive() aUndoDraw->setShortcut(shortcuts.getSingleShortcut("Player/aUndoDraw")); aMulligan->setShortcut(shortcuts.getSingleShortcut("Player/aMulligan")); aShuffle->setShortcut(shortcuts.getSingleShortcut("Player/aShuffle")); + aShuffleTopCards->setShortcut(shortcuts.getSingleShortcut("Player/aShuffleTopCards")); + aShuffleBottomCards->setShortcut(shortcuts.getSingleShortcut("Player/aShuffleBottomCards")); aUntapAll->setShortcut(shortcuts.getSingleShortcut("Player/aUntapAll")); aRollDie->setShortcut(shortcuts.getSingleShortcut("Player/aRollDie")); aCreateToken->setShortcut(shortcuts.getSingleShortcut("Player/aCreateToken")); @@ -1029,6 +1045,8 @@ void Player::setShortcutsInactive() aUndoDraw->setShortcut(QKeySequence()); aMulligan->setShortcut(QKeySequence()); aShuffle->setShortcut(QKeySequence()); + aShuffleTopCards->setShortcut(QKeySequence()); + aShuffleBottomCards->setShortcut(QKeySequence()); aUntapAll->setShortcut(QKeySequence()); aRollDie->setShortcut(QKeySequence()); aCreateToken->setShortcut(QKeySequence()); @@ -1139,9 +1157,9 @@ void Player::actViewBottomCards() bool ok; int number = QInputDialog::getInt(game, tr("View bottom cards of library"), tr("Number of cards: (max. %1)").arg(deckSize), - defaultNumberTopCards, 1, deckSize, 1, &ok); + defaultNumberBottomCards, 1, deckSize, 1, &ok); if (ok) { - defaultNumberTopCards = number; + defaultNumberBottomCards = number; static_cast(scene())->toggleZoneView(this, "deck", number, true); } } @@ -1202,6 +1220,64 @@ void Player::actShuffle() sendGameCommand(Command_Shuffle()); } +void Player::actShuffleTop() +{ + const int maxCards = zones.value("deck")->getCards().size(); + if (maxCards == 0) { + return; + } + + bool ok; + int number = + QInputDialog::getInt(game, tr("Shuffle top cards of library"), tr("Number of cards: (max. %1)").arg(maxCards), + defaultNumberTopCards, 1, maxCards, 1, &ok); + if (!ok) { + return; + } + + if (number > maxCards) { + number = maxCards; + } + + defaultNumberTopCards = number; + + Command_Shuffle cmd; + cmd.set_zone_name("deck"); + cmd.set_start(0); + cmd.set_end(number - 1); // inclusive, the indexed card at end will be shuffled + + sendGameCommand(cmd); +} + +void Player::actShuffleBottom() +{ + const int maxCards = zones.value("deck")->getCards().size(); + if (maxCards == 0) { + return; + } + + bool ok; + int number = QInputDialog::getInt(game, tr("Shuffle bottom cards of library"), + tr("Number of cards: (max. %1)").arg(maxCards), defaultNumberBottomCards, 1, + maxCards, 1, &ok); + if (!ok) { + return; + } + + if (number > maxCards) { + number = maxCards; + } + + defaultNumberBottomCards = number; + + Command_Shuffle cmd; + cmd.set_zone_name("deck"); + cmd.set_start(-number); + cmd.set_end(-1); + + sendGameCommand(cmd); +} + void Player::actDrawCard() { Command_DrawCards cmd; @@ -2518,8 +2594,12 @@ void Player::eventRevealCards(const Event_RevealCards &event, EventProcessingOpt auto cardId = event.card_id_size() == 0 ? -1 : event.card_id(0); if (cardList.size() == 1) { cardName = QString::fromStdString(cardList.first()->name()); - if ((cardId == 0) && dynamic_cast(zone)) { - zone->getCards().first()->setName(cardName); + + // Handle case of revealing top card of library in-place + if (cardId == 0 && dynamic_cast(zone)) { + auto card = zone->getCards().first(); + card->setName(cardName); + card->setProviderId(QString::fromStdString(cardList.first()->provider_id())); zone->update(); showZoneView = false; } diff --git a/cockatrice/src/game/player/player.h b/cockatrice/src/game/player/player.h index b4b4a35b9..66f3089ed 100644 --- a/cockatrice/src/game/player/player.h +++ b/cockatrice/src/game/player/player.h @@ -161,6 +161,8 @@ public slots: void actCreateToken(); void actCreateAnotherToken(); void actShuffle(); + void actShuffleTop(); + void actShuffleBottom(); void actDrawCard(); void actDrawCards(); void actUndoDraw(); @@ -263,10 +265,10 @@ private: *aViewBottomCards, *aAlwaysRevealTopCard, *aAlwaysLookAtTopCard, *aOpenDeckInDeckEditor, *aMoveTopCardToGraveyard, *aMoveTopCardToExile, *aMoveTopCardsToGraveyard, *aMoveTopCardsToExile, *aMoveTopCardsUntil, *aMoveTopCardToBottom, *aViewGraveyard, *aViewRfg, *aViewSideboard, *aDrawCard, - *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle, *aMoveTopToPlay, *aMoveTopToPlayFaceDown, *aUntapAll, *aRollDie, - *aCreateToken, *aCreateAnotherToken, *aMoveBottomToPlay, *aMoveBottomToPlayFaceDown, *aMoveBottomCardToTop, - *aMoveBottomCardToGraveyard, *aMoveBottomCardToExile, *aMoveBottomCardsToGraveyard, *aMoveBottomCardsToExile, - *aDrawBottomCard, *aDrawBottomCards; + *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle, *aShuffleTopCards, *aShuffleBottomCards, *aMoveTopToPlay, + *aMoveTopToPlayFaceDown, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken, *aMoveBottomToPlay, + *aMoveBottomToPlayFaceDown, *aMoveBottomCardToTop, *aMoveBottomCardToGraveyard, *aMoveBottomCardToExile, + *aMoveBottomCardsToGraveyard, *aMoveBottomCardsToExile, *aDrawBottomCard, *aDrawBottomCards; QAction *aCardMenu; QList aAddCounter, aSetCounter, aRemoveCounter; diff --git a/cockatrice/src/settings/shortcuts_settings.h b/cockatrice/src/settings/shortcuts_settings.h index ce0127d57..0dcbcbad0 100644 --- a/cockatrice/src/settings/shortcuts_settings.h +++ b/cockatrice/src/settings/shortcuts_settings.h @@ -240,10 +240,18 @@ private: ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard, Annotated"), parseSequenceString("Ctrl+Shift+C"), ShortcutGroup::Deck_Editor)}, + {"TabDeckEditor/aSaveDeckToClipboardNoSetInfo", + ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard, Annotated (No Set Info)"), + parseSequenceString(""), + ShortcutGroup::Deck_Editor)}, {"TabDeckEditor/aSaveDeckToClipboardRaw", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard"), parseSequenceString("Ctrl+Shift+R"), ShortcutGroup::Deck_Editor)}, + {"TabDeckEditor/aSaveDeckToClipboardRawNoSetInfo", + ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard (No Set Info)"), + parseSequenceString(""), + ShortcutGroup::Deck_Editor)}, {"DeckViewContainer/loadLocalButton", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Load Local Deck..."), parseSequenceString("Ctrl+O"), ShortcutGroup::Game_Lobby)}, @@ -578,6 +586,12 @@ private: {"Player/aShuffle", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Shuffle Library"), parseSequenceString("Ctrl+S"), ShortcutGroup::Gameplay)}, + {"Player/aShuffleTopCards", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Shuffle Top Cards of Library"), + parseSequenceString(""), + ShortcutGroup::Gameplay)}, + {"Player/aShuffleBottomCards", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Shuffle Bottom Cards of Library"), + parseSequenceString(""), + ShortcutGroup::Gameplay)}, {"Player/aMulligan", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Mulligan"), parseSequenceString("Ctrl+M"), ShortcutGroup::Drawing)},