mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-18 00:12:15 -07:00
Refactor card and move menu.
Took 1 hour 6 minutes Took 36 seconds Took 52 seconds
This commit is contained in:
parent
5401efe245
commit
a19229d0c7
11 changed files with 629 additions and 502 deletions
|
|
@ -233,9 +233,11 @@ set(cockatrice_SOURCES
|
|||
src/game/player/player_list_widget.cpp
|
||||
src/game/player/player_manager.cpp
|
||||
src/game/player/player_target.cpp
|
||||
src/game/player/player_menu/card_menu.cpp
|
||||
src/game/player/player_menu/grave_menu.cpp
|
||||
src/game/player/player_menu/hand_menu.cpp
|
||||
src/game/player/player_menu/library_menu.cpp
|
||||
src/game/player/player_menu/move_menu.cpp
|
||||
src/game/player/player_menu/player_menu.cpp
|
||||
src/game/player/player_menu/pt_menu.cpp
|
||||
src/game/player/player_menu/rfg_menu.cpp
|
||||
|
|
|
|||
477
cockatrice/src/game/player/player_menu/card_menu.cpp
Normal file
477
cockatrice/src/game/player/player_menu/card_menu.cpp
Normal file
|
|
@ -0,0 +1,477 @@
|
|||
#include "card_menu.h"
|
||||
|
||||
#include "../../../client/tabs/tab_game.h"
|
||||
#include "../../../settings/card_counter_settings.h"
|
||||
#include "../../board/card_item.h"
|
||||
#include "../../cards/card_database_manager.h"
|
||||
#include "../../zones/logic/view_zone_logic.h"
|
||||
#include "../card_menu_action_type.h"
|
||||
#include "../player.h"
|
||||
#include "../player_actions.h"
|
||||
#include "move_menu.h"
|
||||
#include "pt_menu.h"
|
||||
|
||||
CardMenu::CardMenu(Player *_player,
|
||||
const CardItem *_card,
|
||||
QList<QPair<QString, int>> _playersInfo,
|
||||
bool _shortcutsActive)
|
||||
: player(_player), card(_card), playersInfo(_playersInfo), shortcutsActive(_shortcutsActive)
|
||||
{
|
||||
auto playerActions = player->getPlayerActions();
|
||||
|
||||
aTap = new QAction(this);
|
||||
aTap->setData(cmTap);
|
||||
connect(aTap, &QAction::triggered, playerActions, &PlayerActions::cardMenuAction);
|
||||
aDoesntUntap = new QAction(this);
|
||||
aDoesntUntap->setData(cmDoesntUntap);
|
||||
connect(aDoesntUntap, &QAction::triggered, playerActions, &PlayerActions::cardMenuAction);
|
||||
aAttach = new QAction(this);
|
||||
connect(aAttach, &QAction::triggered, playerActions, &PlayerActions::actAttach);
|
||||
aUnattach = new QAction(this);
|
||||
connect(aUnattach, &QAction::triggered, playerActions, &PlayerActions::actUnattach);
|
||||
aDrawArrow = new QAction(this);
|
||||
connect(aDrawArrow, &QAction::triggered, playerActions, &PlayerActions::actDrawArrow);
|
||||
aSetAnnotation = new QAction(this);
|
||||
connect(aSetAnnotation, &QAction::triggered, playerActions, &PlayerActions::actSetAnnotation);
|
||||
aFlip = new QAction(this);
|
||||
aFlip->setData(cmFlip);
|
||||
connect(aFlip, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
aPeek = new QAction(this);
|
||||
aPeek->setData(cmPeek);
|
||||
connect(aPeek, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
aClone = new QAction(this);
|
||||
aClone->setData(cmClone);
|
||||
connect(aClone, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
aSelectAll = new QAction(this);
|
||||
connect(aSelectAll, &QAction::triggered, playerActions, &PlayerActions::actSelectAll);
|
||||
aSelectRow = new QAction(this);
|
||||
connect(aSelectRow, &QAction::triggered, playerActions, &PlayerActions::actSelectRow);
|
||||
aSelectColumn = new QAction(this);
|
||||
connect(aSelectColumn, &QAction::triggered, playerActions, &PlayerActions::actSelectColumn);
|
||||
|
||||
aPlay = new QAction(this);
|
||||
connect(aPlay, &QAction::triggered, playerActions, &PlayerActions::actPlay);
|
||||
aHide = new QAction(this);
|
||||
connect(aHide, &QAction::triggered, playerActions, &PlayerActions::actHide);
|
||||
aPlayFacedown = new QAction(this);
|
||||
connect(aPlayFacedown, &QAction::triggered, playerActions, &PlayerActions::actPlayFacedown);
|
||||
|
||||
mCardCounters = new QMenu;
|
||||
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
auto *tempAddCounter = new QAction(this);
|
||||
tempAddCounter->setData(9 + i * 1000);
|
||||
auto *tempRemoveCounter = new QAction(this);
|
||||
tempRemoveCounter->setData(10 + i * 1000);
|
||||
auto *tempSetCounter = new QAction(this);
|
||||
tempSetCounter->setData(11 + i * 1000);
|
||||
aAddCounter.append(tempAddCounter);
|
||||
aRemoveCounter.append(tempRemoveCounter);
|
||||
aSetCounter.append(tempSetCounter);
|
||||
connect(tempAddCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger);
|
||||
connect(tempRemoveCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger);
|
||||
connect(tempSetCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger);
|
||||
}
|
||||
|
||||
retranslateUi();
|
||||
|
||||
if (card == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool revealedCard = false;
|
||||
bool writeableCard = player->getPlayerInfo()->getLocalOrJudge();
|
||||
if (auto *view = qobject_cast<ZoneViewZoneLogic *>(card->getZone())) {
|
||||
if (view->getRevealZone()) {
|
||||
if (view->getWriteableRevealZone()) {
|
||||
writeableCard = true;
|
||||
} else {
|
||||
revealedCard = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (revealedCard) {
|
||||
addAction(aHide);
|
||||
addAction(aClone);
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
addAction(aSelectColumn);
|
||||
addRelatedCardView();
|
||||
} else if (writeableCard) {
|
||||
|
||||
if (card->getZone()) {
|
||||
if (card->getZone()->getName() == "table") {
|
||||
createTableMenu();
|
||||
} else if (card->getZone()->getName() == "stack") {
|
||||
createStackMenu();
|
||||
} else if (card->getZone()->getName() == "rfg" || card->getZone()->getName() == "grave") {
|
||||
createGraveyardOrExileMenu();
|
||||
} else {
|
||||
createHandOrCustomZoneMenu();
|
||||
}
|
||||
} else {
|
||||
addMenu(new MoveMenu(player));
|
||||
}
|
||||
} else {
|
||||
if (card->getZone() && card->getZone()->getName() != "hand") {
|
||||
addAction(aDrawArrow);
|
||||
addSeparator();
|
||||
addRelatedCardView();
|
||||
addRelatedCardActions();
|
||||
addSeparator();
|
||||
addAction(aClone);
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CardMenu::createTableMenu()
|
||||
{
|
||||
// Card is on the battlefield
|
||||
bool canModifyCard = player->getPlayerInfo()->judge || card->getOwner() == player;
|
||||
|
||||
if (!canModifyCard) {
|
||||
addRelatedCardView();
|
||||
addRelatedCardActions();
|
||||
|
||||
addSeparator();
|
||||
addAction(aDrawArrow);
|
||||
addSeparator();
|
||||
addAction(aClone);
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
addAction(aSelectRow);
|
||||
return;
|
||||
}
|
||||
|
||||
addAction(aTap);
|
||||
addAction(aDoesntUntap);
|
||||
addAction(aFlip);
|
||||
if (card->getFaceDown()) {
|
||||
addAction(aPeek);
|
||||
}
|
||||
|
||||
addRelatedCardView();
|
||||
addRelatedCardActions();
|
||||
|
||||
addSeparator();
|
||||
addAction(aAttach);
|
||||
if (card->getAttachedTo()) {
|
||||
addAction(aUnattach);
|
||||
}
|
||||
addAction(aDrawArrow);
|
||||
addSeparator();
|
||||
addMenu(new PtMenu(player));
|
||||
addAction(aSetAnnotation);
|
||||
addSeparator();
|
||||
addAction(aClone);
|
||||
addMenu(new MoveMenu(player));
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
addAction(aSelectRow);
|
||||
|
||||
addSeparator();
|
||||
mCardCounters->clear();
|
||||
for (int i = 0; i < aAddCounter.size(); ++i) {
|
||||
mCardCounters->addSeparator();
|
||||
mCardCounters->addAction(aAddCounter[i]);
|
||||
if (card->getCounters().contains(i)) {
|
||||
mCardCounters->addAction(aRemoveCounter[i]);
|
||||
}
|
||||
mCardCounters->addAction(aSetCounter[i]);
|
||||
}
|
||||
addSeparator();
|
||||
addMenu(mCardCounters);
|
||||
}
|
||||
|
||||
void CardMenu::createStackMenu()
|
||||
{
|
||||
bool canModifyCard = player->getPlayerInfo()->judge || card->getOwner() == player;
|
||||
|
||||
// Card is on the stack
|
||||
if (canModifyCard) {
|
||||
addAction(aAttach);
|
||||
addAction(aDrawArrow);
|
||||
addSeparator();
|
||||
addAction(aClone);
|
||||
addMenu(new MoveMenu(player));
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
} else {
|
||||
addAction(aDrawArrow);
|
||||
addSeparator();
|
||||
addAction(aClone);
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
}
|
||||
|
||||
addRelatedCardView();
|
||||
addRelatedCardActions();
|
||||
}
|
||||
|
||||
void CardMenu::createGraveyardOrExileMenu()
|
||||
{
|
||||
bool canModifyCard = player->getPlayerInfo()->judge || card->getOwner() == player;
|
||||
|
||||
// Card is in the graveyard or exile
|
||||
if (canModifyCard) {
|
||||
addAction(aPlay);
|
||||
addAction(aPlayFacedown);
|
||||
|
||||
addSeparator();
|
||||
addAction(aClone);
|
||||
addMenu(new MoveMenu(player));
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
addAction(aSelectColumn);
|
||||
|
||||
addSeparator();
|
||||
addAction(aAttach);
|
||||
addAction(aDrawArrow);
|
||||
} else {
|
||||
addAction(aClone);
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
addAction(aSelectColumn);
|
||||
addSeparator();
|
||||
addAction(aDrawArrow);
|
||||
}
|
||||
|
||||
addRelatedCardView();
|
||||
addRelatedCardActions();
|
||||
}
|
||||
|
||||
void CardMenu::createHandOrCustomZoneMenu()
|
||||
{
|
||||
// Card is in hand or a custom zone specified by server
|
||||
addAction(aPlay);
|
||||
addAction(aPlayFacedown);
|
||||
|
||||
QMenu *revealMenu = addMenu(tr("Re&veal to..."));
|
||||
|
||||
initContextualPlayersMenu(revealMenu);
|
||||
|
||||
connect(revealMenu, &QMenu::triggered, player->getPlayerActions(), &PlayerActions::actReveal);
|
||||
|
||||
addSeparator();
|
||||
addAction(aClone);
|
||||
addMenu(new MoveMenu(player));
|
||||
|
||||
// actions that are really wonky when done from deck or sideboard
|
||||
if (card->getZone()->getName() == "hand") {
|
||||
addSeparator();
|
||||
addAction(aAttach);
|
||||
addAction(aDrawArrow);
|
||||
}
|
||||
|
||||
addSeparator();
|
||||
addAction(aSelectAll);
|
||||
if (qobject_cast<ZoneViewZoneLogic *>(card->getZone())) {
|
||||
addAction(aSelectColumn);
|
||||
}
|
||||
|
||||
addRelatedCardView();
|
||||
if (card->getZone()->getName() == "hand") {
|
||||
addRelatedCardActions();
|
||||
}
|
||||
}
|
||||
|
||||
void CardMenu::initContextualPlayersMenu(QMenu *menu)
|
||||
{
|
||||
menu->addAction(tr("&All players"))->setData(-1);
|
||||
menu->addSeparator();
|
||||
|
||||
for (const auto &playerInfo : playersInfo) {
|
||||
menu->addAction(playerInfo.first)->setData(playerInfo.second);
|
||||
}
|
||||
}
|
||||
|
||||
void CardMenu::addRelatedCardView()
|
||||
{
|
||||
if (!card) {
|
||||
return;
|
||||
}
|
||||
auto exactCard = card->getCard();
|
||||
if (!exactCard) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool atLeastOneGoodRelationFound = false;
|
||||
QList<CardRelation *> relatedCards = exactCard.getInfo().getAllRelatedCards();
|
||||
for (const CardRelation *cardRelation : relatedCards) {
|
||||
CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCardInfo(cardRelation->getName());
|
||||
if (relatedCard != nullptr) {
|
||||
atLeastOneGoodRelationFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!atLeastOneGoodRelationFound) {
|
||||
return;
|
||||
}
|
||||
|
||||
addSeparator();
|
||||
auto viewRelatedCards = new QMenu(tr("View related cards"));
|
||||
addMenu(viewRelatedCards);
|
||||
for (const CardRelation *relatedCard : relatedCards) {
|
||||
QString relatedCardName = relatedCard->getName();
|
||||
CardRef cardRef = {relatedCardName, exactCard.getPrinting().getUuid()};
|
||||
QAction *viewCard = viewRelatedCards->addAction(relatedCardName);
|
||||
Q_UNUSED(viewCard);
|
||||
|
||||
connect(viewCard, &QAction::triggered, player->getGame(),
|
||||
[this, cardRef] { player->getGame()->getTab()->viewCardInfo(cardRef); });
|
||||
}
|
||||
}
|
||||
|
||||
void CardMenu::addRelatedCardActions()
|
||||
{
|
||||
if (!card) {
|
||||
return;
|
||||
}
|
||||
auto exactCard = card->getCard();
|
||||
if (!exactCard) {
|
||||
return;
|
||||
}
|
||||
|
||||
QList<CardRelation *> relatedCards = exactCard.getInfo().getAllRelatedCards();
|
||||
if (relatedCards.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
addSeparator();
|
||||
int index = 0;
|
||||
QAction *createRelatedCards = nullptr;
|
||||
for (const CardRelation *cardRelation : relatedCards) {
|
||||
ExactCard relatedCard = CardDatabaseManager::getInstance()->getCardFromSameSet(cardRelation->getName(),
|
||||
card->getCard().getPrinting());
|
||||
if (!relatedCard) {
|
||||
relatedCard = CardDatabaseManager::getInstance()->getCard({cardRelation->getName()});
|
||||
}
|
||||
if (!relatedCard) {
|
||||
continue;
|
||||
}
|
||||
|
||||
QString relatedCardName;
|
||||
if (relatedCard.getInfo().getPowTough().size() > 0) {
|
||||
relatedCardName = relatedCard.getInfo().getPowTough() + " " + relatedCard.getName(); // "n/n name"
|
||||
} else {
|
||||
relatedCardName = relatedCard.getName(); // "name"
|
||||
}
|
||||
|
||||
QString text = tr("Token: ");
|
||||
if (cardRelation->getDoesAttach()) {
|
||||
text +=
|
||||
tr(cardRelation->getDoesTransform() ? "Transform into " : "Attach to ") + "\"" + relatedCardName + "\"";
|
||||
} else if (cardRelation->getIsVariable()) {
|
||||
text += "X " + relatedCardName;
|
||||
} else if (cardRelation->getDefaultCount() != 1) {
|
||||
text += QString::number(cardRelation->getDefaultCount()) + "x " + relatedCardName;
|
||||
} else {
|
||||
text += relatedCardName;
|
||||
}
|
||||
|
||||
if (createRelatedCards == nullptr) {
|
||||
if (relatedCards.length() == 1) {
|
||||
createRelatedCards = new QAction(text, this); // set actCreateAllRelatedCards with this text
|
||||
break; // do not set an individual entry as there is only one entry
|
||||
} else {
|
||||
createRelatedCards = new QAction(tr("All tokens"), this);
|
||||
}
|
||||
}
|
||||
|
||||
auto *createRelated = new QAction(text, this);
|
||||
createRelated->setData(QVariant(index++));
|
||||
connect(createRelated, &QAction::triggered, player->getPlayerActions(), &PlayerActions::actCreateRelatedCard);
|
||||
addAction(createRelated);
|
||||
}
|
||||
|
||||
if (createRelatedCards) {
|
||||
if (shortcutsActive) {
|
||||
createRelatedCards->setShortcuts(
|
||||
SettingsCache::instance().shortcuts().getShortcut("Player/aCreateRelatedTokens"));
|
||||
}
|
||||
connect(createRelatedCards, &QAction::triggered, player->getPlayerActions(),
|
||||
&PlayerActions::actCreateAllRelatedCards);
|
||||
addAction(createRelatedCards);
|
||||
}
|
||||
}
|
||||
|
||||
void CardMenu::retranslateUi()
|
||||
{
|
||||
aSelectAll->setText(tr("&Select All"));
|
||||
aSelectRow->setText(tr("S&elect Row"));
|
||||
aSelectColumn->setText(tr("S&elect Column"));
|
||||
|
||||
aPlay->setText(tr("&Play"));
|
||||
aHide->setText(tr("&Hide"));
|
||||
aPlayFacedown->setText(tr("Play &Face Down"));
|
||||
//: Turn sideways or back again
|
||||
aTap->setText(tr("&Tap / Untap"));
|
||||
aDoesntUntap->setText(tr("Toggle &normal untapping"));
|
||||
//: Turn face up/face down
|
||||
aFlip->setText(tr("T&urn Over")); // Only the user facing names in client got renamed to "turn over"
|
||||
// All code and proto bits are still unchanged (flip) for compatibility reasons
|
||||
// A protocol rewrite with v3 could incorporate that, see #3100
|
||||
aPeek->setText(tr("&Peek at card face"));
|
||||
aClone->setText(tr("&Clone"));
|
||||
aAttach->setText(tr("Attac&h to card..."));
|
||||
aUnattach->setText(tr("Unattac&h"));
|
||||
aDrawArrow->setText(tr("&Draw arrow..."));
|
||||
aSetAnnotation->setText(tr("&Set annotation..."));
|
||||
|
||||
mCardCounters->setTitle(tr("Ca&rd counters"));
|
||||
|
||||
auto &cardCounterSettings = SettingsCache::instance().cardCounters();
|
||||
|
||||
for (int i = 0; i < aAddCounter.size(); ++i) {
|
||||
aAddCounter[i]->setText(tr("&Add counter (%1)").arg(cardCounterSettings.displayName(i)));
|
||||
}
|
||||
for (int i = 0; i < aRemoveCounter.size(); ++i) {
|
||||
aRemoveCounter[i]->setText(tr("&Remove counter (%1)").arg(cardCounterSettings.displayName(i)));
|
||||
}
|
||||
for (int i = 0; i < aSetCounter.size(); ++i) {
|
||||
aSetCounter[i]->setText(tr("&Set counters (%1)...").arg(cardCounterSettings.displayName(i)));
|
||||
}
|
||||
}
|
||||
|
||||
void CardMenu::setShortcutsActive()
|
||||
{
|
||||
ShortcutsSettings &shortcuts = SettingsCache::instance().shortcuts();
|
||||
|
||||
aHide->setShortcuts(shortcuts.getShortcut("Player/aHide"));
|
||||
aPlay->setShortcuts(shortcuts.getShortcut("Player/aPlay"));
|
||||
aTap->setShortcuts(shortcuts.getShortcut("Player/aTap"));
|
||||
aDoesntUntap->setShortcuts(shortcuts.getShortcut("Player/aDoesntUntap"));
|
||||
aFlip->setShortcuts(shortcuts.getShortcut("Player/aFlip"));
|
||||
aPeek->setShortcuts(shortcuts.getShortcut("Player/aPeek"));
|
||||
aClone->setShortcuts(shortcuts.getShortcut("Player/aClone"));
|
||||
aAttach->setShortcuts(shortcuts.getShortcut("Player/aAttach"));
|
||||
aUnattach->setShortcuts(shortcuts.getShortcut("Player/aUnattach"));
|
||||
aDrawArrow->setShortcuts(shortcuts.getShortcut("Player/aDrawArrow"));
|
||||
aSetAnnotation->setShortcuts(shortcuts.getShortcut("Player/aSetAnnotation"));
|
||||
|
||||
aSelectAll->setShortcuts(shortcuts.getShortcut("Player/aSelectAll"));
|
||||
aSelectRow->setShortcuts(shortcuts.getShortcut("Player/aSelectRow"));
|
||||
aSelectColumn->setShortcuts(shortcuts.getShortcut("Player/aSelectColumn"));
|
||||
|
||||
aPlayFacedown->setShortcuts(shortcuts.getShortcut("Player/aPlayFacedown"));
|
||||
aPlay->setShortcuts(shortcuts.getShortcut("Player/aPlay"));
|
||||
|
||||
static const QStringList colorWords = {"Red", "Yellow", "Green", "Cyan", "Purple", "Magenta"};
|
||||
for (int i = 0; i < aAddCounter.size(); i++) {
|
||||
aAddCounter[i]->setShortcuts(shortcuts.getShortcut("Player/aCC" + colorWords[i]));
|
||||
aRemoveCounter[i]->setShortcuts(shortcuts.getShortcut("Player/aRC" + colorWords[i]));
|
||||
aSetCounter[i]->setShortcuts(shortcuts.getShortcut("Player/aSC" + colorWords[i]));
|
||||
}
|
||||
|
||||
// Don't enable always-active shortcuts in local games, since it causes keyboard shortcuts to work inconsistently
|
||||
// when there are more than 1 player.
|
||||
if (!player->getGame()->getGameState()->getIsLocalGame()) {
|
||||
// unattach action is only active in card menu if the active card is attached.
|
||||
// make unattach shortcut always active so that it consistently works when multiple cards are selected.
|
||||
player->getGame()->getTab()->addAction(aUnattach);
|
||||
}
|
||||
}
|
||||
49
cockatrice/src/game/player/player_menu/card_menu.h
Normal file
49
cockatrice/src/game/player/player_menu/card_menu.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
#ifndef COCKATRICE_CARD_MENU_H
|
||||
#define COCKATRICE_CARD_MENU_H
|
||||
|
||||
#include <QMenu>
|
||||
|
||||
class CardItem;
|
||||
class Player;
|
||||
class CardMenu : public QMenu
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CardMenu(Player *player,
|
||||
const CardItem *card,
|
||||
QList<QPair<QString, int>> playersInfo,
|
||||
bool shortcutsActive);
|
||||
void createTableMenu();
|
||||
void createStackMenu();
|
||||
void createGraveyardOrExileMenu();
|
||||
void createHandOrCustomZoneMenu();
|
||||
|
||||
QMenu *mCardCounters = nullptr;
|
||||
|
||||
QAction *aPlay, *aPlayFacedown;
|
||||
QAction *aHide;
|
||||
QAction *aClone;
|
||||
QAction *aSelectAll, *aSelectRow, *aSelectColumn;
|
||||
QAction *aDrawArrow;
|
||||
QAction *aTap, *aDoesntUntap;
|
||||
QAction *aFlip, *aPeek;
|
||||
QAction *aAttach, *aUnattach;
|
||||
QAction *aSetAnnotation;
|
||||
|
||||
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;
|
||||
|
||||
private:
|
||||
Player *player;
|
||||
const CardItem *card;
|
||||
QList<QPair<QString, int>> playersInfo;
|
||||
bool shortcutsActive;
|
||||
|
||||
void addRelatedCardActions();
|
||||
void retranslateUi();
|
||||
void initContextualPlayersMenu(QMenu *menu);
|
||||
void setShortcutsActive();
|
||||
void addRelatedCardView();
|
||||
};
|
||||
|
||||
#endif // COCKATRICE_CARD_MENU_H
|
||||
|
|
@ -63,6 +63,8 @@ void GraveyardMenu::createViewActions()
|
|||
|
||||
void GraveyardMenu::retranslateUi()
|
||||
{
|
||||
setTitle(tr("&Graveyard"));
|
||||
|
||||
aViewGraveyard->setText(tr("&View graveyard"));
|
||||
|
||||
if (player->getPlayerInfo()->getLocalOrJudge()) {
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ HandMenu::HandMenu(Player *_player, PlayerActions *actions, QWidget *parent) : T
|
|||
|
||||
void HandMenu::retranslateUi()
|
||||
{
|
||||
setTitle(tr("&Hand"));
|
||||
|
||||
if (player->getPlayerInfo()->getLocalOrJudge()) {
|
||||
aViewHand->setText(tr("&View hand"));
|
||||
aSortHand->setText(tr("&Sort hand"));
|
||||
|
|
|
|||
|
|
@ -177,6 +177,8 @@ void LibraryMenu::createViewActions()
|
|||
|
||||
void LibraryMenu::retranslateUi()
|
||||
{
|
||||
setTitle(tr("&Library"));
|
||||
|
||||
if (player->getPlayerInfo()->getLocalOrJudge()) {
|
||||
aViewLibrary->setText(tr("&View library"));
|
||||
aViewTopCards->setText(tr("View &top cards of library..."));
|
||||
|
|
|
|||
61
cockatrice/src/game/player/player_menu/move_menu.cpp
Normal file
61
cockatrice/src/game/player/player_menu/move_menu.cpp
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
#include "move_menu.h"
|
||||
|
||||
#include "../card_menu_action_type.h"
|
||||
#include "../player.h"
|
||||
#include "../player_actions.h"
|
||||
|
||||
MoveMenu::MoveMenu(Player *player) : QMenu(tr("Move to"))
|
||||
{
|
||||
aMoveToTopLibrary = new QAction(this);
|
||||
aMoveToTopLibrary->setData(cmMoveToTopLibrary);
|
||||
aMoveToBottomLibrary = new QAction(this);
|
||||
aMoveToBottomLibrary->setData(cmMoveToBottomLibrary);
|
||||
aMoveToXfromTopOfLibrary = new QAction(this);
|
||||
aMoveToGraveyard = new QAction(this);
|
||||
aMoveToHand = new QAction(this);
|
||||
aMoveToHand->setData(cmMoveToHand);
|
||||
aMoveToGraveyard->setData(cmMoveToGraveyard);
|
||||
aMoveToExile = new QAction(this);
|
||||
aMoveToExile->setData(cmMoveToExile);
|
||||
|
||||
connect(aMoveToTopLibrary, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToBottomLibrary, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToXfromTopOfLibrary, &QAction::triggered, player->getPlayerActions(),
|
||||
&PlayerActions::actMoveCardXCardsFromTop);
|
||||
connect(aMoveToHand, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToGraveyard, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToExile, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
|
||||
addAction(aMoveToTopLibrary);
|
||||
addAction(aMoveToXfromTopOfLibrary);
|
||||
addAction(aMoveToBottomLibrary);
|
||||
addSeparator();
|
||||
addAction(aMoveToHand);
|
||||
addSeparator();
|
||||
addAction(aMoveToGraveyard);
|
||||
addSeparator();
|
||||
addAction(aMoveToExile);
|
||||
|
||||
retranslateUi();
|
||||
}
|
||||
|
||||
void MoveMenu::setShortcutsActive()
|
||||
{
|
||||
ShortcutsSettings &shortcuts = SettingsCache::instance().shortcuts();
|
||||
|
||||
aMoveToTopLibrary->setShortcuts(shortcuts.getShortcut("Player/aMoveToTopLibrary"));
|
||||
aMoveToBottomLibrary->setShortcuts(shortcuts.getShortcut("Player/aMoveToBottomLibrary"));
|
||||
aMoveToHand->setShortcuts(shortcuts.getShortcut("Player/aMoveToHand"));
|
||||
aMoveToGraveyard->setShortcuts(shortcuts.getShortcut("Player/aMoveToGraveyard"));
|
||||
aMoveToExile->setShortcuts(shortcuts.getShortcut("Player/aMoveToExile"));
|
||||
}
|
||||
|
||||
void MoveMenu::retranslateUi()
|
||||
{
|
||||
aMoveToTopLibrary->setText(tr("&Top of library in random order"));
|
||||
aMoveToXfromTopOfLibrary->setText(tr("X cards from the top of library..."));
|
||||
aMoveToBottomLibrary->setText(tr("&Bottom of library in random order"));
|
||||
aMoveToHand->setText(tr("&Hand"));
|
||||
aMoveToGraveyard->setText(tr("&Graveyard"));
|
||||
aMoveToExile->setText(tr("&Exile"));
|
||||
}
|
||||
24
cockatrice/src/game/player/player_menu/move_menu.h
Normal file
24
cockatrice/src/game/player/player_menu/move_menu.h
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
#ifndef COCKATRICE_MOVE_MENU_H
|
||||
#define COCKATRICE_MOVE_MENU_H
|
||||
#include <QMenu>
|
||||
|
||||
class Player;
|
||||
class MoveMenu : public QMenu
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MoveMenu(Player *player);
|
||||
void setShortcutsActive();
|
||||
void retranslateUi();
|
||||
|
||||
QAction *aMoveToTopLibrary = nullptr;
|
||||
QAction *aMoveToXfromTopOfLibrary = nullptr;
|
||||
QAction *aMoveToBottomLibrary = nullptr;
|
||||
|
||||
QAction *aMoveToHand = nullptr;
|
||||
QAction *aMoveToGraveyard = nullptr;
|
||||
QAction *aMoveToExile = nullptr;
|
||||
};
|
||||
|
||||
#endif // COCKATRICE_MOVE_MENU_H
|
||||
|
|
@ -2,15 +2,13 @@
|
|||
|
||||
#include "../../../client/tabs/tab_game.h"
|
||||
#include "../../../common/pb/command_reveal_cards.pb.h"
|
||||
#include "../../../settings/card_counter_settings.h"
|
||||
#include "../../board/card_item.h"
|
||||
#include "../../cards/card_database_manager.h"
|
||||
#include "../../zones/hand_zone.h"
|
||||
#include "../../zones/logic/view_zone_logic.h"
|
||||
#include "../card_menu_action_type.h"
|
||||
#include "../player_actions.h"
|
||||
#include "card_menu.h"
|
||||
#include "hand_menu.h"
|
||||
#include "pt_menu.h"
|
||||
|
||||
PlayerMenu::PlayerMenu(Player *_player) : player(_player)
|
||||
{
|
||||
|
|
@ -73,8 +71,6 @@ PlayerMenu::PlayerMenu(Player *_player) : player(_player)
|
|||
createPredefinedTokenMenu = new QMenu(QString());
|
||||
createPredefinedTokenMenu->setEnabled(false);
|
||||
|
||||
mCardCounters = new QMenu;
|
||||
|
||||
playerMenu->addSeparator();
|
||||
countersMenu = playerMenu->addMenu(QString());
|
||||
playerMenu->addAction(aIncrementAllCardCounters);
|
||||
|
|
@ -116,7 +112,6 @@ PlayerMenu::PlayerMenu(Player *_player) : player(_player)
|
|||
aCreateAnotherToken = nullptr;
|
||||
createPredefinedTokenMenu = nullptr;
|
||||
aIncrementAllCardCounters = nullptr;
|
||||
mCardCounters = nullptr;
|
||||
|
||||
aViewSideboard = nullptr;
|
||||
handMenu = nullptr;
|
||||
|
|
@ -127,76 +122,6 @@ PlayerMenu::PlayerMenu(Player *_player) : player(_player)
|
|||
aRollDie = nullptr;
|
||||
}
|
||||
|
||||
aTap = new QAction(this);
|
||||
aTap->setData(cmTap);
|
||||
connect(aTap, &QAction::triggered, playerActions, &PlayerActions::cardMenuAction);
|
||||
aDoesntUntap = new QAction(this);
|
||||
aDoesntUntap->setData(cmDoesntUntap);
|
||||
connect(aDoesntUntap, &QAction::triggered, playerActions, &PlayerActions::cardMenuAction);
|
||||
aAttach = new QAction(this);
|
||||
connect(aAttach, &QAction::triggered, playerActions, &PlayerActions::actAttach);
|
||||
aUnattach = new QAction(this);
|
||||
connect(aUnattach, &QAction::triggered, playerActions, &PlayerActions::actUnattach);
|
||||
aDrawArrow = new QAction(this);
|
||||
connect(aDrawArrow, &QAction::triggered, playerActions, &PlayerActions::actDrawArrow);
|
||||
aSetAnnotation = new QAction(this);
|
||||
connect(aSetAnnotation, &QAction::triggered, playerActions, &PlayerActions::actSetAnnotation);
|
||||
aFlip = new QAction(this);
|
||||
aFlip->setData(cmFlip);
|
||||
connect(aFlip, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
aPeek = new QAction(this);
|
||||
aPeek->setData(cmPeek);
|
||||
connect(aPeek, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
aClone = new QAction(this);
|
||||
aClone->setData(cmClone);
|
||||
connect(aClone, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
aMoveToTopLibrary = new QAction(this);
|
||||
aMoveToTopLibrary->setData(cmMoveToTopLibrary);
|
||||
aMoveToBottomLibrary = new QAction(this);
|
||||
aMoveToBottomLibrary->setData(cmMoveToBottomLibrary);
|
||||
aMoveToXfromTopOfLibrary = new QAction(this);
|
||||
aMoveToGraveyard = new QAction(this);
|
||||
aMoveToHand = new QAction(this);
|
||||
aMoveToHand->setData(cmMoveToHand);
|
||||
aMoveToGraveyard->setData(cmMoveToGraveyard);
|
||||
aMoveToExile = new QAction(this);
|
||||
aMoveToExile->setData(cmMoveToExile);
|
||||
connect(aMoveToTopLibrary, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToBottomLibrary, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToXfromTopOfLibrary, &QAction::triggered, playerActions, &PlayerActions::actMoveCardXCardsFromTop);
|
||||
connect(aMoveToHand, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToGraveyard, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
connect(aMoveToExile, &QAction::triggered, player->getPlayerActions(), &PlayerActions::cardMenuAction);
|
||||
|
||||
aSelectAll = new QAction(this);
|
||||
connect(aSelectAll, &QAction::triggered, playerActions, &PlayerActions::actSelectAll);
|
||||
aSelectRow = new QAction(this);
|
||||
connect(aSelectRow, &QAction::triggered, playerActions, &PlayerActions::actSelectRow);
|
||||
aSelectColumn = new QAction(this);
|
||||
connect(aSelectColumn, &QAction::triggered, playerActions, &PlayerActions::actSelectColumn);
|
||||
|
||||
aPlay = new QAction(this);
|
||||
connect(aPlay, &QAction::triggered, playerActions, &PlayerActions::actPlay);
|
||||
aHide = new QAction(this);
|
||||
connect(aHide, &QAction::triggered, playerActions, &PlayerActions::actHide);
|
||||
aPlayFacedown = new QAction(this);
|
||||
connect(aPlayFacedown, &QAction::triggered, playerActions, &PlayerActions::actPlayFacedown);
|
||||
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
auto *tempAddCounter = new QAction(this);
|
||||
tempAddCounter->setData(9 + i * 1000);
|
||||
auto *tempRemoveCounter = new QAction(this);
|
||||
tempRemoveCounter->setData(10 + i * 1000);
|
||||
auto *tempSetCounter = new QAction(this);
|
||||
tempSetCounter->setData(11 + i * 1000);
|
||||
aAddCounter.append(tempAddCounter);
|
||||
aRemoveCounter.append(tempRemoveCounter);
|
||||
aSetCounter.append(tempSetCounter);
|
||||
connect(tempAddCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger);
|
||||
connect(tempRemoveCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger);
|
||||
connect(tempSetCounter, &QAction::triggered, playerActions, &PlayerActions::actCardCounterTrigger);
|
||||
}
|
||||
|
||||
connect(&SettingsCache::instance().shortcuts(), &ShortcutsSettings::shortCutChanged, this,
|
||||
&PlayerMenu::refreshShortcuts);
|
||||
refreshShortcuts();
|
||||
|
|
@ -331,207 +256,6 @@ void PlayerMenu::playerListActionTriggered()
|
|||
player->getPlayerActions()->sendGameCommand(cmd);
|
||||
}
|
||||
|
||||
void PlayerMenu::initContextualPlayersMenu(QMenu *menu)
|
||||
{
|
||||
menu->addAction(tr("&All players"))->setData(-1);
|
||||
menu->addSeparator();
|
||||
|
||||
for (const auto &playerInfo : playersInfo) {
|
||||
menu->addAction(playerInfo.first)->setData(playerInfo.second);
|
||||
}
|
||||
}
|
||||
|
||||
QMenu *PlayerMenu::createCardMenu(const CardItem *card)
|
||||
{
|
||||
if (card == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool revealedCard = false;
|
||||
bool writeableCard = player->getPlayerInfo()->getLocalOrJudge();
|
||||
if (auto *view = qobject_cast<ZoneViewZoneLogic *>(card->getZone())) {
|
||||
if (view->getRevealZone()) {
|
||||
if (view->getWriteableRevealZone()) {
|
||||
writeableCard = true;
|
||||
} else {
|
||||
revealedCard = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QMenu *cardMenu = new QMenu;
|
||||
|
||||
if (revealedCard) {
|
||||
cardMenu->addAction(aHide);
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectColumn);
|
||||
addRelatedCardView(card, cardMenu);
|
||||
} else if (writeableCard) {
|
||||
bool canModifyCard = player->getPlayerInfo()->judge || card->getOwner() == player;
|
||||
|
||||
if (card->getZone()) {
|
||||
if (card->getZone()->getName() == "table") {
|
||||
// Card is on the battlefield
|
||||
|
||||
if (!canModifyCard) {
|
||||
addRelatedCardView(card, cardMenu);
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectRow);
|
||||
return cardMenu;
|
||||
}
|
||||
|
||||
cardMenu->addAction(aTap);
|
||||
cardMenu->addAction(aDoesntUntap);
|
||||
cardMenu->addAction(aFlip);
|
||||
if (card->getFaceDown()) {
|
||||
cardMenu->addAction(aPeek);
|
||||
}
|
||||
|
||||
addRelatedCardView(card, cardMenu);
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aAttach);
|
||||
if (card->getAttachedTo()) {
|
||||
cardMenu->addAction(aUnattach);
|
||||
}
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addMenu(new PtMenu(player));
|
||||
cardMenu->addAction(aSetAnnotation);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectRow);
|
||||
|
||||
cardMenu->addSeparator();
|
||||
mCardCounters->clear();
|
||||
for (int i = 0; i < aAddCounter.size(); ++i) {
|
||||
mCardCounters->addSeparator();
|
||||
mCardCounters->addAction(aAddCounter[i]);
|
||||
if (card->getCounters().contains(i)) {
|
||||
mCardCounters->addAction(aRemoveCounter[i]);
|
||||
}
|
||||
mCardCounters->addAction(aSetCounter[i]);
|
||||
}
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addMenu(mCardCounters);
|
||||
} else if (card->getZone()->getName() == "stack") {
|
||||
// Card is on the stack
|
||||
if (canModifyCard) {
|
||||
cardMenu->addAction(aAttach);
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
} else {
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
}
|
||||
|
||||
addRelatedCardView(card, cardMenu);
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
} else if (card->getZone()->getName() == "rfg" || card->getZone()->getName() == "grave") {
|
||||
// Card is in the graveyard or exile
|
||||
if (canModifyCard) {
|
||||
cardMenu->addAction(aPlay);
|
||||
cardMenu->addAction(aPlayFacedown);
|
||||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectColumn);
|
||||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aAttach);
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
} else {
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
cardMenu->addAction(aSelectColumn);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
}
|
||||
|
||||
addRelatedCardView(card, cardMenu);
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
} else {
|
||||
// Card is in hand or a custom zone specified by server
|
||||
cardMenu->addAction(aPlay);
|
||||
cardMenu->addAction(aPlayFacedown);
|
||||
|
||||
QMenu *revealMenu = cardMenu->addMenu(tr("Re&veal to..."));
|
||||
initContextualPlayersMenu(revealMenu);
|
||||
|
||||
connect(revealMenu, &QMenu::triggered, player->getPlayerActions(), &PlayerActions::actReveal);
|
||||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
|
||||
// actions that are really wonky when done from deck or sideboard
|
||||
if (card->getZone()->getName() == "hand") {
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aAttach);
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
}
|
||||
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
if (qobject_cast<ZoneViewZoneLogic *>(card->getZone())) {
|
||||
cardMenu->addAction(aSelectColumn);
|
||||
}
|
||||
|
||||
addRelatedCardView(card, cardMenu);
|
||||
if (card->getZone()->getName() == "hand") {
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cardMenu->addMenu(createMoveMenu());
|
||||
}
|
||||
} else {
|
||||
if (card->getZone() && card->getZone()->getName() != "hand") {
|
||||
cardMenu->addAction(aDrawArrow);
|
||||
cardMenu->addSeparator();
|
||||
addRelatedCardView(card, cardMenu);
|
||||
addRelatedCardActions(card, cardMenu);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aClone);
|
||||
cardMenu->addSeparator();
|
||||
cardMenu->addAction(aSelectAll);
|
||||
}
|
||||
}
|
||||
|
||||
return cardMenu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a card menu from the given card and sets it as the currently active card menu.
|
||||
* Will first check if the card should have a card menu, and no-ops if not.
|
||||
*
|
||||
* @param card The card to create the menu for. Pass nullptr to disable the card menu.
|
||||
* @return The new card menu, or nullptr if failed.
|
||||
*/
|
||||
QMenu *PlayerMenu::updateCardMenu(const CardItem *card)
|
||||
{
|
||||
if (!card) {
|
||||
|
|
@ -546,138 +270,12 @@ QMenu *PlayerMenu::updateCardMenu(const CardItem *card)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
QMenu *menu = createCardMenu(card);
|
||||
QMenu *menu = new CardMenu(player, card, playersInfo, shortcutsActive);
|
||||
emit cardMenuUpdated(menu);
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
QMenu *PlayerMenu::createMoveMenu() const
|
||||
{
|
||||
QMenu *moveMenu = new QMenu(tr("Move to"));
|
||||
moveMenu->addAction(aMoveToTopLibrary);
|
||||
moveMenu->addAction(aMoveToXfromTopOfLibrary);
|
||||
moveMenu->addAction(aMoveToBottomLibrary);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToHand);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToGraveyard);
|
||||
moveMenu->addSeparator();
|
||||
moveMenu->addAction(aMoveToExile);
|
||||
return moveMenu;
|
||||
}
|
||||
|
||||
void PlayerMenu::addRelatedCardView(const CardItem *card, QMenu *cardMenu)
|
||||
{
|
||||
if (!card || !cardMenu) {
|
||||
return;
|
||||
}
|
||||
auto exactCard = card->getCard();
|
||||
if (!exactCard) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool atLeastOneGoodRelationFound = false;
|
||||
QList<CardRelation *> relatedCards = exactCard.getInfo().getAllRelatedCards();
|
||||
for (const CardRelation *cardRelation : relatedCards) {
|
||||
CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCardInfo(cardRelation->getName());
|
||||
if (relatedCard != nullptr) {
|
||||
atLeastOneGoodRelationFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!atLeastOneGoodRelationFound) {
|
||||
return;
|
||||
}
|
||||
|
||||
cardMenu->addSeparator();
|
||||
auto viewRelatedCards = new QMenu(tr("View related cards"));
|
||||
cardMenu->addMenu(viewRelatedCards);
|
||||
for (const CardRelation *relatedCard : relatedCards) {
|
||||
QString relatedCardName = relatedCard->getName();
|
||||
CardRef cardRef = {relatedCardName, exactCard.getPrinting().getUuid()};
|
||||
QAction *viewCard = viewRelatedCards->addAction(relatedCardName);
|
||||
Q_UNUSED(viewCard);
|
||||
|
||||
connect(viewCard, &QAction::triggered, player->getGame(),
|
||||
[this, cardRef] { player->getGame()->getTab()->viewCardInfo(cardRef); });
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerMenu::addRelatedCardActions(const CardItem *card, QMenu *cardMenu)
|
||||
{
|
||||
if (!card || !cardMenu) {
|
||||
return;
|
||||
}
|
||||
auto exactCard = card->getCard();
|
||||
if (!exactCard) {
|
||||
return;
|
||||
}
|
||||
|
||||
QList<CardRelation *> relatedCards = exactCard.getInfo().getAllRelatedCards();
|
||||
if (relatedCards.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
cardMenu->addSeparator();
|
||||
int index = 0;
|
||||
QAction *createRelatedCards = nullptr;
|
||||
for (const CardRelation *cardRelation : relatedCards) {
|
||||
ExactCard relatedCard = CardDatabaseManager::getInstance()->getCardFromSameSet(cardRelation->getName(),
|
||||
card->getCard().getPrinting());
|
||||
if (!relatedCard) {
|
||||
relatedCard = CardDatabaseManager::getInstance()->getCard({cardRelation->getName()});
|
||||
}
|
||||
if (!relatedCard) {
|
||||
continue;
|
||||
}
|
||||
|
||||
QString relatedCardName;
|
||||
if (relatedCard.getInfo().getPowTough().size() > 0) {
|
||||
relatedCardName = relatedCard.getInfo().getPowTough() + " " + relatedCard.getName(); // "n/n name"
|
||||
} else {
|
||||
relatedCardName = relatedCard.getName(); // "name"
|
||||
}
|
||||
|
||||
QString text = tr("Token: ");
|
||||
if (cardRelation->getDoesAttach()) {
|
||||
text +=
|
||||
tr(cardRelation->getDoesTransform() ? "Transform into " : "Attach to ") + "\"" + relatedCardName + "\"";
|
||||
} else if (cardRelation->getIsVariable()) {
|
||||
text += "X " + relatedCardName;
|
||||
} else if (cardRelation->getDefaultCount() != 1) {
|
||||
text += QString::number(cardRelation->getDefaultCount()) + "x " + relatedCardName;
|
||||
} else {
|
||||
text += relatedCardName;
|
||||
}
|
||||
|
||||
if (createRelatedCards == nullptr) {
|
||||
if (relatedCards.length() == 1) {
|
||||
createRelatedCards = new QAction(text, this); // set actCreateAllRelatedCards with this text
|
||||
break; // do not set an individual entry as there is only one entry
|
||||
} else {
|
||||
createRelatedCards = new QAction(tr("All tokens"), this);
|
||||
}
|
||||
}
|
||||
|
||||
auto *createRelated = new QAction(text, this);
|
||||
createRelated->setData(QVariant(index++));
|
||||
connect(createRelated, &QAction::triggered, player->getPlayerActions(), &PlayerActions::actCreateRelatedCard);
|
||||
cardMenu->addAction(createRelated);
|
||||
}
|
||||
|
||||
if (createRelatedCards) {
|
||||
if (shortcutsActive) {
|
||||
createRelatedCards->setShortcuts(
|
||||
SettingsCache::instance().shortcuts().getShortcut("Player/aCreateRelatedTokens"));
|
||||
}
|
||||
connect(createRelatedCards, &QAction::triggered, player->getPlayerActions(),
|
||||
&PlayerActions::actCreateAllRelatedCards);
|
||||
cardMenu->addAction(createRelatedCards);
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerMenu::clearCustomZonesMenu()
|
||||
{
|
||||
// Can be null if we are not the local player!
|
||||
|
|
@ -722,20 +320,18 @@ void PlayerMenu::populatePredefinedTokensMenu()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void PlayerMenu::retranslateUi()
|
||||
{
|
||||
playerMenu->setTitle(tr("Player \"%1\"").arg(player->getPlayerInfo()->getName()));
|
||||
graveMenu->setTitle(tr("&Graveyard"));
|
||||
rfgMenu->setTitle(tr("&Exile"));
|
||||
graveMenu->retranslateUi();
|
||||
rfgMenu->retranslateUi();
|
||||
|
||||
if (player->getPlayerInfo()->getLocalOrJudge()) {
|
||||
aViewSideboard->setText(tr("&View sideboard"));
|
||||
|
||||
handMenu->setTitle(tr("&Hand"));
|
||||
handMenu->retranslateUi();
|
||||
sbMenu->setTitle(tr("&Sideboard"));
|
||||
libraryMenu->setTitle(tr("&Library"));
|
||||
libraryMenu->retranslateUi();
|
||||
countersMenu->setTitle(tr("&Counters"));
|
||||
mCustomZones->setTitle(tr("C&ustom Zones"));
|
||||
|
||||
|
|
@ -750,8 +346,6 @@ void PlayerMenu::retranslateUi()
|
|||
aCreateAnotherToken->setText(tr("C&reate another token"));
|
||||
createPredefinedTokenMenu->setTitle(tr("Cr&eate predefined token"));
|
||||
|
||||
mCardCounters->setTitle(tr("Ca&rd counters"));
|
||||
|
||||
for (auto &allPlayersAction : allPlayersActions) {
|
||||
allPlayersAction->setText(tr("&All players"));
|
||||
}
|
||||
|
|
@ -760,46 +354,6 @@ void PlayerMenu::retranslateUi()
|
|||
if (player->getPlayerInfo()->getLocal()) {
|
||||
sayMenu->setTitle(tr("S&ay"));
|
||||
}
|
||||
|
||||
aSelectAll->setText(tr("&Select All"));
|
||||
aSelectRow->setText(tr("S&elect Row"));
|
||||
aSelectColumn->setText(tr("S&elect Column"));
|
||||
|
||||
aPlay->setText(tr("&Play"));
|
||||
aHide->setText(tr("&Hide"));
|
||||
aPlayFacedown->setText(tr("Play &Face Down"));
|
||||
//: Turn sideways or back again
|
||||
aTap->setText(tr("&Tap / Untap"));
|
||||
aDoesntUntap->setText(tr("Toggle &normal untapping"));
|
||||
//: Turn face up/face down
|
||||
aFlip->setText(tr("T&urn Over")); // Only the user facing names in client got renamed to "turn over"
|
||||
// All code and proto bits are still unchanged (flip) for compatibility reasons
|
||||
// A protocol rewrite with v3 could incorporate that, see #3100
|
||||
aPeek->setText(tr("&Peek at card face"));
|
||||
aClone->setText(tr("&Clone"));
|
||||
aAttach->setText(tr("Attac&h to card..."));
|
||||
aUnattach->setText(tr("Unattac&h"));
|
||||
aDrawArrow->setText(tr("&Draw arrow..."));
|
||||
aSetAnnotation->setText(tr("&Set annotation..."));
|
||||
|
||||
auto &cardCounterSettings = SettingsCache::instance().cardCounters();
|
||||
|
||||
for (int i = 0; i < aAddCounter.size(); ++i) {
|
||||
aAddCounter[i]->setText(tr("&Add counter (%1)").arg(cardCounterSettings.displayName(i)));
|
||||
}
|
||||
for (int i = 0; i < aRemoveCounter.size(); ++i) {
|
||||
aRemoveCounter[i]->setText(tr("&Remove counter (%1)").arg(cardCounterSettings.displayName(i)));
|
||||
}
|
||||
for (int i = 0; i < aSetCounter.size(); ++i) {
|
||||
aSetCounter[i]->setText(tr("&Set counters (%1)...").arg(cardCounterSettings.displayName(i)));
|
||||
}
|
||||
|
||||
aMoveToTopLibrary->setText(tr("&Top of library in random order"));
|
||||
aMoveToXfromTopOfLibrary->setText(tr("X cards from the top of library..."));
|
||||
aMoveToBottomLibrary->setText(tr("&Bottom of library in random order"));
|
||||
aMoveToHand->setText(tr("&Hand"));
|
||||
aMoveToGraveyard->setText(tr("&Graveyard"));
|
||||
aMoveToExile->setText(tr("&Exile"));
|
||||
}
|
||||
|
||||
void PlayerMenu::setShortcutIfItExists(QAction *action, ShortcutKey shortcut)
|
||||
|
|
@ -821,34 +375,6 @@ void PlayerMenu::setShortcutsActive()
|
|||
shortcutsActive = true;
|
||||
ShortcutsSettings &shortcuts = SettingsCache::instance().shortcuts();
|
||||
|
||||
setShortcutIfItExists(aHide, shortcuts.getShortcut("Player/aHide"));
|
||||
setShortcutIfItExists(aPlay, shortcuts.getShortcut("Player/aPlay"));
|
||||
setShortcutIfItExists(aTap, shortcuts.getShortcut("Player/aTap"));
|
||||
setShortcutIfItExists(aDoesntUntap, shortcuts.getShortcut("Player/aDoesntUntap"));
|
||||
setShortcutIfItExists(aFlip, shortcuts.getShortcut("Player/aFlip"));
|
||||
setShortcutIfItExists(aPeek, shortcuts.getShortcut("Player/aPeek"));
|
||||
setShortcutIfItExists(aClone, shortcuts.getShortcut("Player/aClone"));
|
||||
setShortcutIfItExists(aAttach, shortcuts.getShortcut("Player/aAttach"));
|
||||
setShortcutIfItExists(aUnattach, shortcuts.getShortcut("Player/aUnattach"));
|
||||
setShortcutIfItExists(aDrawArrow, shortcuts.getShortcut("Player/aDrawArrow"));
|
||||
setShortcutIfItExists(aSetAnnotation, shortcuts.getShortcut("Player/aSetAnnotation"));
|
||||
setShortcutIfItExists(aMoveToTopLibrary, shortcuts.getShortcut("Player/aMoveToTopLibrary"));
|
||||
setShortcutIfItExists(aMoveToBottomLibrary, shortcuts.getShortcut("Player/aMoveToBottomLibrary"));
|
||||
setShortcutIfItExists(aMoveToHand, shortcuts.getShortcut("Player/aMoveToHand"));
|
||||
setShortcutIfItExists(aMoveToGraveyard, shortcuts.getShortcut("Player/aMoveToGraveyard"));
|
||||
setShortcutIfItExists(aMoveToExile, shortcuts.getShortcut("Player/aMoveToExile"));
|
||||
|
||||
setShortcutIfItExists(aSelectAll, shortcuts.getShortcut("Player/aSelectAll"));
|
||||
setShortcutIfItExists(aSelectRow, shortcuts.getShortcut("Player/aSelectRow"));
|
||||
setShortcutIfItExists(aSelectColumn, shortcuts.getShortcut("Player/aSelectColumn"));
|
||||
|
||||
static const QStringList colorWords = {"Red", "Yellow", "Green", "Cyan", "Purple", "Magenta"};
|
||||
for (int i = 0; i < aAddCounter.size(); i++) {
|
||||
setShortcutIfItExists(aAddCounter[i], shortcuts.getShortcut("Player/aCC" + colorWords[i]));
|
||||
setShortcutIfItExists(aRemoveCounter[i], shortcuts.getShortcut("Player/aRC" + colorWords[i]));
|
||||
setShortcutIfItExists(aSetCounter[i], shortcuts.getShortcut("Player/aSC" + colorWords[i]));
|
||||
}
|
||||
|
||||
QMapIterator<int, AbstractCounter *> counterIterator(player->getCounters());
|
||||
while (counterIterator.hasNext()) {
|
||||
counterIterator.next().value()->setShortcutsActive();
|
||||
|
|
@ -860,16 +386,6 @@ void PlayerMenu::setShortcutsActive()
|
|||
setShortcutIfItExists(aRollDie, shortcuts.getShortcut("Player/aRollDie"));
|
||||
setShortcutIfItExists(aCreateToken, shortcuts.getShortcut("Player/aCreateToken"));
|
||||
setShortcutIfItExists(aCreateAnotherToken, shortcuts.getShortcut("Player/aCreateAnotherToken"));
|
||||
setShortcutIfItExists(aPlayFacedown, shortcuts.getShortcut("Player/aPlayFacedown"));
|
||||
setShortcutIfItExists(aPlay, shortcuts.getShortcut("Player/aPlay"));
|
||||
|
||||
// Don't enable always-active shortcuts in local games, since it causes keyboard shortcuts to work inconsistently
|
||||
// when there are more than 1 player.
|
||||
if (!player->getGame()->getGameState()->getIsLocalGame()) {
|
||||
// unattach action is only active in card menu if the active card is attached.
|
||||
// make unattach shortcut always active so that it consistently works when multiple cards are selected.
|
||||
player->getGame()->getTab()->addAction(aUnattach);
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerMenu::setShortcutsInactive()
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ signals:
|
|||
void cardMenuUpdated(QMenu *cardMenu);
|
||||
|
||||
public slots:
|
||||
QMenu *createMoveMenu() const;
|
||||
void populatePredefinedTokensMenu();
|
||||
void setMenusForGraphicItems();
|
||||
|
||||
|
|
@ -84,7 +83,7 @@ public:
|
|||
|
||||
private:
|
||||
Player *player;
|
||||
QMenu *sbMenu, *countersMenu, *sayMenu, *createPredefinedTokenMenu, *mCustomZones, *mCardCounters;
|
||||
QMenu *sbMenu, *countersMenu, *sayMenu, *createPredefinedTokenMenu, *mCustomZones;
|
||||
HandMenu *handMenu;
|
||||
LibraryMenu *libraryMenu;
|
||||
GraveyardMenu *graveMenu;
|
||||
|
|
@ -96,21 +95,12 @@ private:
|
|||
QList<QPair<QString, int>> playersInfo;
|
||||
QAction *aViewSideboard, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken;
|
||||
|
||||
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;
|
||||
QAction *aPlay, *aPlayFacedown, *aHide, *aTap, *aDoesntUntap, *aAttach, *aUnattach, *aDrawArrow, *aSetAnnotation,
|
||||
*aFlip, *aPeek, *aClone, *aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToHand, *aMoveToGraveyard,
|
||||
*aMoveToExile, *aMoveToXfromTopOfLibrary, *aSelectAll, *aSelectRow, *aSelectColumn, *aIncrementAllCardCounters;
|
||||
QAction *aIncrementAllCardCounters;
|
||||
|
||||
bool shortcutsActive;
|
||||
QStringList predefinedTokens;
|
||||
|
||||
QMenu *createCardMenu(const CardItem *card);
|
||||
|
||||
void addRelatedCardActions(const CardItem *card, QMenu *cardMenu);
|
||||
void addRelatedCardView(const CardItem *card, QMenu *cardMenu);
|
||||
|
||||
void initSayMenu();
|
||||
void initContextualPlayersMenu(QMenu *menu);
|
||||
};
|
||||
|
||||
#endif // COCKATRICE_PLAYER_MENU_H
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ void RfgMenu::createViewActions()
|
|||
|
||||
void RfgMenu::retranslateUi()
|
||||
{
|
||||
setTitle(tr("&Exile"));
|
||||
|
||||
aViewRfg->setText(tr("&View exile"));
|
||||
|
||||
if (player->getPlayerInfo()->getLocalOrJudge()) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue