Merge branch 'master' into game-time-part2-checkbox

This commit is contained in:
Lily 2025-03-11 22:39:46 -04:00
commit b1465c3701
No known key found for this signature in database
GPG key ID: D916CEDDF4F93CE7
11 changed files with 169 additions and 35 deletions

View file

@ -39,16 +39,15 @@ DeckEditorMenu::DeckEditorMenu(QWidget *parent, AbstractTabDeckEditor *_deckEdit
aSaveDeckToClipboard = new QAction(QString(), this); aSaveDeckToClipboard = new QAction(QString(), this);
connect(aSaveDeckToClipboard, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboard())); connect(aSaveDeckToClipboard, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboard()));
aSaveDeckToClipboardNoSetNameAndNumber = new QAction(QString(), this); aSaveDeckToClipboardNoSetInfo = new QAction(QString(), this);
connect(aSaveDeckToClipboardNoSetNameAndNumber, SIGNAL(triggered()), deckEditor, connect(aSaveDeckToClipboardNoSetInfo, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboardNoSetInfo()));
SLOT(actSaveDeckToClipboardNoSetNameAndNumber()));
aSaveDeckToClipboardRaw = new QAction(QString(), this); aSaveDeckToClipboardRaw = new QAction(QString(), this);
connect(aSaveDeckToClipboardRaw, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboardRaw())); connect(aSaveDeckToClipboardRaw, SIGNAL(triggered()), deckEditor, SLOT(actSaveDeckToClipboardRaw()));
aSaveDeckToClipboardRawNoSetNameAndNumber = new QAction(QString(), this); aSaveDeckToClipboardRawNoSetInfo = new QAction(QString(), this);
connect(aSaveDeckToClipboardRawNoSetNameAndNumber, SIGNAL(triggered()), deckEditor, connect(aSaveDeckToClipboardRawNoSetInfo, SIGNAL(triggered()), deckEditor,
SLOT(actSaveDeckToClipboardRawNoSetNameAndNumber())); SLOT(actSaveDeckToClipboardRawNoSetInfo()));
aPrintDeck = new QAction(QString(), this); aPrintDeck = new QAction(QString(), this);
connect(aPrintDeck, SIGNAL(triggered()), deckEditor, SLOT(actPrintDeck())); connect(aPrintDeck, SIGNAL(triggered()), deckEditor, SLOT(actPrintDeck()));
@ -76,9 +75,9 @@ DeckEditorMenu::DeckEditorMenu(QWidget *parent, AbstractTabDeckEditor *_deckEdit
saveDeckToClipboardMenu = new QMenu(this); saveDeckToClipboardMenu = new QMenu(this);
saveDeckToClipboardMenu->addAction(aSaveDeckToClipboard); saveDeckToClipboardMenu->addAction(aSaveDeckToClipboard);
saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardNoSetNameAndNumber); saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardNoSetInfo);
saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardRaw); saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardRaw);
saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardRawNoSetNameAndNumber); saveDeckToClipboardMenu->addAction(aSaveDeckToClipboardRawNoSetInfo);
addAction(aNewDeck); addAction(aNewDeck);
addAction(aLoadDeck); addAction(aLoadDeck);
@ -108,9 +107,9 @@ void DeckEditorMenu::setSaveStatus(bool newStatus)
aSaveDeck->setEnabled(newStatus); aSaveDeck->setEnabled(newStatus);
aSaveDeckAs->setEnabled(newStatus); aSaveDeckAs->setEnabled(newStatus);
aSaveDeckToClipboard->setEnabled(newStatus); aSaveDeckToClipboard->setEnabled(newStatus);
aSaveDeckToClipboardNoSetNameAndNumber->setEnabled(newStatus); aSaveDeckToClipboardNoSetInfo->setEnabled(newStatus);
aSaveDeckToClipboardRaw->setEnabled(newStatus); aSaveDeckToClipboardRaw->setEnabled(newStatus);
aSaveDeckToClipboardRawNoSetNameAndNumber->setEnabled(newStatus); aSaveDeckToClipboardRawNoSetInfo->setEnabled(newStatus);
saveDeckToClipboardMenu->setEnabled(newStatus); saveDeckToClipboardMenu->setEnabled(newStatus);
aPrintDeck->setEnabled(newStatus); aPrintDeck->setEnabled(newStatus);
analyzeDeckMenu->setEnabled(newStatus); analyzeDeckMenu->setEnabled(newStatus);
@ -153,9 +152,9 @@ void DeckEditorMenu::retranslateUi()
saveDeckToClipboardMenu->setTitle(tr("Save deck to clipboard")); saveDeckToClipboardMenu->setTitle(tr("Save deck to clipboard"));
aSaveDeckToClipboard->setText(tr("Annotated")); 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")); 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...")); aPrintDeck->setText(tr("&Print deck..."));
@ -183,7 +182,10 @@ void DeckEditorMenu::refreshShortcuts()
aClose->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aClose")); aClose->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aClose"));
aSaveDeckToClipboard->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboard")); aSaveDeckToClipboard->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboard"));
aSaveDeckToClipboardNoSetInfo->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboardNoSetInfo"));
aSaveDeckToClipboardRaw->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboardRaw")); aSaveDeckToClipboardRaw->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboardRaw"));
aSaveDeckToClipboardRawNoSetInfo->setShortcuts(
shortcuts.getShortcut("TabDeckEditor/aSaveDeckToClipboardRawNoSetInfo"));
aClose->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aClose")); aClose->setShortcuts(shortcuts.getShortcut("TabDeckEditor/aClose"));
} }

View file

@ -15,8 +15,8 @@ public:
AbstractTabDeckEditor *deckEditor; AbstractTabDeckEditor *deckEditor;
QAction *aNewDeck, *aLoadDeck, *aClearRecents, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, QAction *aNewDeck, *aLoadDeck, *aClearRecents, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard,
*aEditDeckInClipboard, *aEditDeckInClipboardRaw, *aSaveDeckToClipboard, *aSaveDeckToClipboardNoSetNameAndNumber, *aEditDeckInClipboard, *aEditDeckInClipboardRaw, *aSaveDeckToClipboard, *aSaveDeckToClipboardNoSetInfo,
*aSaveDeckToClipboardRaw, *aSaveDeckToClipboardRawNoSetNameAndNumber, *aPrintDeck, *aExportDeckDecklist, *aSaveDeckToClipboardRaw, *aSaveDeckToClipboardRawNoSetInfo, *aPrintDeck, *aExportDeckDecklist,
*aAnalyzeDeckDeckstats, *aAnalyzeDeckTappedout, *aClose; *aAnalyzeDeckDeckstats, *aAnalyzeDeckTappedout, *aClose;
QMenu *loadRecentDeckMenu, *analyzeDeckMenu, *editDeckInClipboardMenu, *saveDeckToClipboardMenu; QMenu *loadRecentDeckMenu, *analyzeDeckMenu, *editDeckInClipboardMenu, *saveDeckToClipboardMenu;

View file

@ -76,7 +76,7 @@ void AbstractTabDeckEditor::updateCard(CardInfoPtr _card)
void AbstractTabDeckEditor::onDeckChanged() void AbstractTabDeckEditor::onDeckChanged()
{ {
setModified(isBlankNewDeck()); setModified(!isBlankNewDeck());
deckMenu->setSaveStatus(!isBlankNewDeck()); deckMenu->setSaveStatus(!isBlankNewDeck());
} }
@ -128,6 +128,19 @@ void AbstractTabDeckEditor::actSwapCard(CardInfoPtr info, QString zoneName)
deckDockWidget->deckModel->findCard(info->getName(), zoneName, providerId, collectorNumber)); 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 * Sets the currently active deck for this tab
* @param _deck The deck. Takes ownership of the object * @param _deck The deck. Takes ownership of the object
@ -290,13 +303,12 @@ void AbstractTabDeckEditor::openDeckFromFile(const QString &fileName, DeckOpenLo
auto *l = new DeckLoader; auto *l = new DeckLoader;
if (l->loadFromFile(fileName, fmt, true)) { if (l->loadFromFile(fileName, fmt, true)) {
SettingsCache::instance().recents().updateRecentlyOpenedDeckPaths(fileName);
if (deckOpenLocation == NEW_TAB) { if (deckOpenLocation == NEW_TAB) {
emit openDeckEditor(l); emit openDeckEditor(l);
l->deleteLater(); l->deleteLater();
} else { } else {
deckMenu->setSaveStatus(false); deckMenu->setSaveStatus(false);
setDeck(l); openDeck(l);
} }
} else { } else {
l->deleteLater(); l->deleteLater();
@ -421,7 +433,7 @@ void AbstractTabDeckEditor::actSaveDeckToClipboard()
getDeckList()->saveToClipboard(true, true); getDeckList()->saveToClipboard(true, true);
} }
void AbstractTabDeckEditor::actSaveDeckToClipboardNoSetNameAndNumber() void AbstractTabDeckEditor::actSaveDeckToClipboardNoSetInfo()
{ {
getDeckList()->saveToClipboard(true, false); getDeckList()->saveToClipboard(true, false);
} }
@ -431,7 +443,7 @@ void AbstractTabDeckEditor::actSaveDeckToClipboardRaw()
getDeckList()->saveToClipboard(false, true); getDeckList()->saveToClipboard(false, true);
} }
void AbstractTabDeckEditor::actSaveDeckToClipboardRawNoSetNameAndNumber() void AbstractTabDeckEditor::actSaveDeckToClipboardRawNoSetInfo()
{ {
getDeckList()->saveToClipboard(false, false); getDeckList()->saveToClipboard(false, false);
} }

View file

@ -54,7 +54,7 @@ public:
virtual void retranslateUi() override = 0; virtual void retranslateUi() override = 0;
// Deck Management // Deck Management
virtual void setDeck(DeckLoader *_deckLoader); void openDeck(DeckLoader *deck);
DeckLoader *getDeckList() const; DeckLoader *getDeckList() const;
void setModified(bool _windowModified); void setModified(bool _windowModified);
@ -95,9 +95,9 @@ protected slots:
void actEditDeckInClipboard(); void actEditDeckInClipboard();
void actEditDeckInClipboardRaw(); void actEditDeckInClipboardRaw();
void actSaveDeckToClipboard(); void actSaveDeckToClipboard();
void actSaveDeckToClipboardNoSetNameAndNumber(); void actSaveDeckToClipboardNoSetInfo();
void actSaveDeckToClipboardRaw(); void actSaveDeckToClipboardRaw();
void actSaveDeckToClipboardRawNoSetNameAndNumber(); void actSaveDeckToClipboardRawNoSetInfo();
void actPrintDeck(); void actPrintDeck();
void actExportDeckDecklist(); void actExportDeckDecklist();
void actAnalyzeDeckDeckstats(); void actAnalyzeDeckDeckstats();
@ -117,6 +117,7 @@ protected slots:
virtual void dockFloatingTriggered() = 0; virtual void dockFloatingTriggered() = 0;
private: private:
virtual void setDeck(DeckLoader *_deck);
void editDeckInClipboard(bool annotated); void editDeckInClipboard(bool annotated);
protected: protected:

View file

@ -246,8 +246,6 @@ void TabDeckStorage::actOpenLocalDeck()
if (!deckLoader.loadFromFile(filePath, DeckLoader::CockatriceFormat, true)) if (!deckLoader.loadFromFile(filePath, DeckLoader::CockatriceFormat, true))
continue; continue;
SettingsCache::instance().recents().updateRecentlyOpenedDeckPaths(filePath);
emit openDeckEditor(&deckLoader); emit openDeckEditor(&deckLoader);
} }
} }

View file

@ -772,7 +772,7 @@ TabDeckEditor *TabSupervisor::addDeckEditorTab(const DeckLoader *deckToOpen)
{ {
auto *tab = new TabDeckEditor(this); auto *tab = new TabDeckEditor(this);
if (deckToOpen) if (deckToOpen)
tab->setDeck(new DeckLoader(*deckToOpen)); tab->openDeck(new DeckLoader(*deckToOpen));
connect(tab, &AbstractTabDeckEditor::deckEditorClosing, this, &TabSupervisor::deckEditorClosed); connect(tab, &AbstractTabDeckEditor::deckEditorClosing, this, &TabSupervisor::deckEditorClosed);
connect(tab, &AbstractTabDeckEditor::openDeckEditor, this, &TabSupervisor::addDeckEditorTab); connect(tab, &AbstractTabDeckEditor::openDeckEditor, this, &TabSupervisor::addDeckEditorTab);
myAddTab(tab); myAddTab(tab);

View file

@ -288,6 +288,8 @@ QMenu *DeckPreviewWidget::createRightClickMenu()
connect(menu->addAction(tr("Edit Tags")), &QAction::triggered, deckTagsDisplayWidget, connect(menu->addAction(tr("Edit Tags")), &QAction::triggered, deckTagsDisplayWidget,
&DeckPreviewDeckTagsDisplayWidget::openTagEditDlg); &DeckPreviewDeckTagsDisplayWidget::openTagEditDlg);
addSetBannerCardMenu(menu);
menu->addSeparator(); menu->addSeparator();
connect(menu->addAction(tr("Rename Deck")), &QAction::triggered, this, &DeckPreviewWidget::actRenameDeck); connect(menu->addAction(tr("Rename Deck")), &QAction::triggered, this, &DeckPreviewWidget::actRenameDeck);
@ -312,6 +314,28 @@ QMenu *DeckPreviewWidget::createRightClickMenu()
return menu; 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() void DeckPreviewWidget::actRenameDeck()
{ {
// read input // read input

View file

@ -59,6 +59,7 @@ public slots:
private: private:
QMenu *createRightClickMenu(); QMenu *createRightClickMenu();
void addSetBannerCardMenu(QMenu *menu);
private slots: private slots:
void actRenameDeck(); void actRenameDeck();

View file

@ -246,8 +246,10 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T
connect(aDrawCards, &QAction::triggered, this, &Player::actDrawCards); connect(aDrawCards, &QAction::triggered, this, &Player::actDrawCards);
aUndoDraw = new QAction(this); aUndoDraw = new QAction(this);
connect(aUndoDraw, &QAction::triggered, this, &Player::actUndoDraw); connect(aUndoDraw, &QAction::triggered, this, &Player::actUndoDraw);
aShuffle = new QAction(this); aShuffle = new QAction(this);
connect(aShuffle, &QAction::triggered, this, &Player::actShuffle); connect(aShuffle, &QAction::triggered, this, &Player::actShuffle);
aMulligan = new QAction(this); aMulligan = new QAction(this);
connect(aMulligan, &QAction::triggered, this, &Player::actMulligan); 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); aMoveTopCardToBottom = new QAction(this);
connect(aMoveTopCardToBottom, &QAction::triggered, this, &Player::actMoveTopCardToBottom); connect(aMoveTopCardToBottom, &QAction::triggered, this, &Player::actMoveTopCardToBottom);
aShuffleTopCards = new QAction(this);
connect(aShuffleTopCards, &QAction::triggered, this, &Player::actShuffleTop);
aDrawBottomCard = new QAction(this); aDrawBottomCard = new QAction(this);
connect(aDrawBottomCard, &QAction::triggered, this, &Player::actDrawBottomCard); connect(aDrawBottomCard, &QAction::triggered, this, &Player::actDrawBottomCard);
aDrawBottomCards = new QAction(this); 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); connect(aMoveBottomCardsToExile, &QAction::triggered, this, &Player::actMoveBottomCardsToExile);
aMoveBottomCardToTop = new QAction(this); aMoveBottomCardToTop = new QAction(this);
connect(aMoveBottomCardToTop, &QAction::triggered, this, &Player::actMoveBottomCardToTop); connect(aMoveBottomCardToTop, &QAction::triggered, this, &Player::actMoveBottomCardToTop);
aShuffleBottomCards = new QAction(this);
connect(aShuffleBottomCards, &QAction::triggered, this, &Player::actShuffleBottom);
} }
playerMenu = new TearOffMenu(); playerMenu = new TearOffMenu();
@ -330,7 +338,6 @@ Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, T
libraryMenu->addSeparator(); libraryMenu->addSeparator();
libraryMenu->addAction(aOpenDeckInDeckEditor); libraryMenu->addAction(aOpenDeckInDeckEditor);
_deck->setMenu(libraryMenu, aDrawCard); _deck->setMenu(libraryMenu, aDrawCard);
topLibraryMenu->addAction(aMoveTopToPlay); topLibraryMenu->addAction(aMoveTopToPlay);
topLibraryMenu->addAction(aMoveTopToPlayFaceDown); topLibraryMenu->addAction(aMoveTopToPlayFaceDown);
topLibraryMenu->addAction(aMoveTopCardToBottom); 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(aMoveTopCardToExile);
topLibraryMenu->addAction(aMoveTopCardsToExile); topLibraryMenu->addAction(aMoveTopCardsToExile);
topLibraryMenu->addAction(aMoveTopCardsUntil); topLibraryMenu->addAction(aMoveTopCardsUntil);
topLibraryMenu->addSeparator();
topLibraryMenu->addAction(aShuffleTopCards);
bottomLibraryMenu->addAction(aDrawBottomCard); bottomLibraryMenu->addAction(aDrawBottomCard);
bottomLibraryMenu->addAction(aDrawBottomCards); 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(aMoveBottomCardsToGraveyard);
bottomLibraryMenu->addAction(aMoveBottomCardToExile); bottomLibraryMenu->addAction(aMoveBottomCardToExile);
bottomLibraryMenu->addAction(aMoveBottomCardsToExile); bottomLibraryMenu->addAction(aMoveBottomCardsToExile);
bottomLibraryMenu->addSeparator();
bottomLibraryMenu->addAction(aShuffleBottomCards);
} }
graveMenu = playerMenu->addTearOffMenu(QString()); graveMenu = playerMenu->addTearOffMenu(QString());
@ -792,7 +803,8 @@ void Player::retranslateUi()
aDrawCards->setText(tr("D&raw cards...")); aDrawCards->setText(tr("D&raw cards..."));
aUndoDraw->setText(tr("&Undo last draw")); aUndoDraw->setText(tr("&Undo last draw"));
aMulligan->setText(tr("Take &mulligan")); aMulligan->setText(tr("Take &mulligan"));
aShuffle->setText(tr("&Shuffle"));
aShuffle->setText(tr("Shuffle"));
aMoveTopToPlay->setText(tr("&Play top card")); aMoveTopToPlay->setText(tr("&Play top card"));
aMoveTopToPlayFaceDown->setText(tr("Play top card &face down")); aMoveTopToPlayFaceDown->setText(tr("Play top card &face down"));
@ -802,6 +814,7 @@ void Player::retranslateUi()
aMoveTopCardsToGraveyard->setText(tr("Move top cards to &graveyard...")); aMoveTopCardsToGraveyard->setText(tr("Move top cards to &graveyard..."));
aMoveTopCardsToExile->setText(tr("Move top cards to &exile...")); aMoveTopCardsToExile->setText(tr("Move top cards to &exile..."));
aMoveTopCardsUntil->setText(tr("Put top cards on stack &until...")); aMoveTopCardsUntil->setText(tr("Put top cards on stack &until..."));
aShuffleTopCards->setText(tr("Shuffle top cards..."));
aDrawBottomCard->setText(tr("&Draw bottom card")); aDrawBottomCard->setText(tr("&Draw bottom card"));
aDrawBottomCards->setText(tr("D&raw bottom cards...")); aDrawBottomCards->setText(tr("D&raw bottom cards..."));
@ -812,6 +825,7 @@ void Player::retranslateUi()
aMoveBottomCardsToGraveyard->setText(tr("Move bottom cards to &graveyard...")); aMoveBottomCardsToGraveyard->setText(tr("Move bottom cards to &graveyard..."));
aMoveBottomCardsToExile->setText(tr("Move bottom cards to &exile...")); aMoveBottomCardsToExile->setText(tr("Move bottom cards to &exile..."));
aMoveBottomCardToTop->setText(tr("Put bottom card on &top")); aMoveBottomCardToTop->setText(tr("Put bottom card on &top"));
aShuffleBottomCards->setText(tr("Shuffle bottom cards..."));
handMenu->setTitle(tr("&Hand")); handMenu->setTitle(tr("&Hand"));
mRevealHand->setTitle(tr("&Reveal hand to...")); mRevealHand->setTitle(tr("&Reveal hand to..."));
@ -979,6 +993,8 @@ void Player::setShortcutsActive()
aUndoDraw->setShortcut(shortcuts.getSingleShortcut("Player/aUndoDraw")); aUndoDraw->setShortcut(shortcuts.getSingleShortcut("Player/aUndoDraw"));
aMulligan->setShortcut(shortcuts.getSingleShortcut("Player/aMulligan")); aMulligan->setShortcut(shortcuts.getSingleShortcut("Player/aMulligan"));
aShuffle->setShortcut(shortcuts.getSingleShortcut("Player/aShuffle")); aShuffle->setShortcut(shortcuts.getSingleShortcut("Player/aShuffle"));
aShuffleTopCards->setShortcut(shortcuts.getSingleShortcut("Player/aShuffleTopCards"));
aShuffleBottomCards->setShortcut(shortcuts.getSingleShortcut("Player/aShuffleBottomCards"));
aUntapAll->setShortcut(shortcuts.getSingleShortcut("Player/aUntapAll")); aUntapAll->setShortcut(shortcuts.getSingleShortcut("Player/aUntapAll"));
aRollDie->setShortcut(shortcuts.getSingleShortcut("Player/aRollDie")); aRollDie->setShortcut(shortcuts.getSingleShortcut("Player/aRollDie"));
aCreateToken->setShortcut(shortcuts.getSingleShortcut("Player/aCreateToken")); aCreateToken->setShortcut(shortcuts.getSingleShortcut("Player/aCreateToken"));
@ -1029,6 +1045,8 @@ void Player::setShortcutsInactive()
aUndoDraw->setShortcut(QKeySequence()); aUndoDraw->setShortcut(QKeySequence());
aMulligan->setShortcut(QKeySequence()); aMulligan->setShortcut(QKeySequence());
aShuffle->setShortcut(QKeySequence()); aShuffle->setShortcut(QKeySequence());
aShuffleTopCards->setShortcut(QKeySequence());
aShuffleBottomCards->setShortcut(QKeySequence());
aUntapAll->setShortcut(QKeySequence()); aUntapAll->setShortcut(QKeySequence());
aRollDie->setShortcut(QKeySequence()); aRollDie->setShortcut(QKeySequence());
aCreateToken->setShortcut(QKeySequence()); aCreateToken->setShortcut(QKeySequence());
@ -1139,9 +1157,9 @@ void Player::actViewBottomCards()
bool ok; bool ok;
int number = int number =
QInputDialog::getInt(game, tr("View bottom cards of library"), tr("Number of cards: (max. %1)").arg(deckSize), 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) { if (ok) {
defaultNumberTopCards = number; defaultNumberBottomCards = number;
static_cast<GameScene *>(scene())->toggleZoneView(this, "deck", number, true); static_cast<GameScene *>(scene())->toggleZoneView(this, "deck", number, true);
} }
} }
@ -1202,6 +1220,64 @@ void Player::actShuffle()
sendGameCommand(Command_Shuffle()); 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() void Player::actDrawCard()
{ {
Command_DrawCards cmd; 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); auto cardId = event.card_id_size() == 0 ? -1 : event.card_id(0);
if (cardList.size() == 1) { if (cardList.size() == 1) {
cardName = QString::fromStdString(cardList.first()->name()); cardName = QString::fromStdString(cardList.first()->name());
if ((cardId == 0) && dynamic_cast<PileZone *>(zone)) {
zone->getCards().first()->setName(cardName); // Handle case of revealing top card of library in-place
if (cardId == 0 && dynamic_cast<PileZone *>(zone)) {
auto card = zone->getCards().first();
card->setName(cardName);
card->setProviderId(QString::fromStdString(cardList.first()->provider_id()));
zone->update(); zone->update();
showZoneView = false; showZoneView = false;
} }

View file

@ -161,6 +161,8 @@ public slots:
void actCreateToken(); void actCreateToken();
void actCreateAnotherToken(); void actCreateAnotherToken();
void actShuffle(); void actShuffle();
void actShuffleTop();
void actShuffleBottom();
void actDrawCard(); void actDrawCard();
void actDrawCards(); void actDrawCards();
void actUndoDraw(); void actUndoDraw();
@ -263,10 +265,10 @@ private:
*aViewBottomCards, *aAlwaysRevealTopCard, *aAlwaysLookAtTopCard, *aOpenDeckInDeckEditor, *aViewBottomCards, *aAlwaysRevealTopCard, *aAlwaysLookAtTopCard, *aOpenDeckInDeckEditor,
*aMoveTopCardToGraveyard, *aMoveTopCardToExile, *aMoveTopCardsToGraveyard, *aMoveTopCardsToExile, *aMoveTopCardToGraveyard, *aMoveTopCardToExile, *aMoveTopCardsToGraveyard, *aMoveTopCardsToExile,
*aMoveTopCardsUntil, *aMoveTopCardToBottom, *aViewGraveyard, *aViewRfg, *aViewSideboard, *aDrawCard, *aMoveTopCardsUntil, *aMoveTopCardToBottom, *aViewGraveyard, *aViewRfg, *aViewSideboard, *aDrawCard,
*aDrawCards, *aUndoDraw, *aMulligan, *aShuffle, *aMoveTopToPlay, *aMoveTopToPlayFaceDown, *aUntapAll, *aRollDie, *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle, *aShuffleTopCards, *aShuffleBottomCards, *aMoveTopToPlay,
*aCreateToken, *aCreateAnotherToken, *aMoveBottomToPlay, *aMoveBottomToPlayFaceDown, *aMoveBottomCardToTop, *aMoveTopToPlayFaceDown, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken, *aMoveBottomToPlay,
*aMoveBottomCardToGraveyard, *aMoveBottomCardToExile, *aMoveBottomCardsToGraveyard, *aMoveBottomCardsToExile, *aMoveBottomToPlayFaceDown, *aMoveBottomCardToTop, *aMoveBottomCardToGraveyard, *aMoveBottomCardToExile,
*aDrawBottomCard, *aDrawBottomCards; *aMoveBottomCardsToGraveyard, *aMoveBottomCardsToExile, *aDrawBottomCard, *aDrawBottomCards;
QAction *aCardMenu; QAction *aCardMenu;
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter; QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;

View file

@ -240,10 +240,18 @@ private:
ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard, Annotated"), ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard, Annotated"),
parseSequenceString("Ctrl+Shift+C"), parseSequenceString("Ctrl+Shift+C"),
ShortcutGroup::Deck_Editor)}, ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aSaveDeckToClipboardNoSetInfo",
ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard, Annotated (No Set Info)"),
parseSequenceString(""),
ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aSaveDeckToClipboardRaw", {"TabDeckEditor/aSaveDeckToClipboardRaw",
ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard"), ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Save Deck to Clipboard"),
parseSequenceString("Ctrl+Shift+R"), parseSequenceString("Ctrl+Shift+R"),
ShortcutGroup::Deck_Editor)}, 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..."), {"DeckViewContainer/loadLocalButton", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Load Local Deck..."),
parseSequenceString("Ctrl+O"), parseSequenceString("Ctrl+O"),
ShortcutGroup::Game_Lobby)}, ShortcutGroup::Game_Lobby)},
@ -578,6 +586,12 @@ private:
{"Player/aShuffle", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Shuffle Library"), {"Player/aShuffle", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Shuffle Library"),
parseSequenceString("Ctrl+S"), parseSequenceString("Ctrl+S"),
ShortcutGroup::Gameplay)}, 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"), {"Player/aMulligan", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Mulligan"),
parseSequenceString("Ctrl+M"), parseSequenceString("Ctrl+M"),
ShortcutGroup::Drawing)}, ShortcutGroup::Drawing)},