"Show related card" option added to ingame context menu (#3115)

This commit is contained in:
David Szabo 2018-02-19 07:12:25 +01:00 committed by Zach H
parent 2409eae940
commit 7cfbf114b7
4 changed files with 41 additions and 0 deletions

View file

@ -25,6 +25,7 @@
#include <QMenu>
#include <QPainter>
#include <QRegExp>
#include <QSignalMapper>
#include "pb/command_attach_card.pb.h"
#include "pb/command_change_zone_properties.pb.h"
@ -2596,6 +2597,7 @@ void Player::updateCardMenu(const CardItem *card)
if (revealedCard) {
cardMenu->addAction(aHide);
addRelatedCardView(card, cardMenu);
} else if (writeableCard) {
if (moveMenu->isEmpty()) {
moveMenu->addAction(aMoveToTopLibrary);
@ -2611,6 +2613,8 @@ void Player::updateCardMenu(const CardItem *card)
if (card->getZone()) {
if (card->getZone()->getName() == "table") {
// Card is on the battlefield
if (ptMenu->isEmpty()) {
ptMenu->addAction(aIncP);
ptMenu->addAction(aDecP);
@ -2631,6 +2635,7 @@ void Player::updateCardMenu(const CardItem *card)
cardMenu->addAction(aPeek);
}
addRelatedCardView(card, cardMenu);
addRelatedCardActions(card, cardMenu);
cardMenu->addSeparator();
@ -2656,22 +2661,27 @@ void Player::updateCardMenu(const CardItem *card)
}
cardMenu->addSeparator();
} else if (card->getZone()->getName() == "stack") {
// Card is on the stack
cardMenu->addAction(aDrawArrow);
cardMenu->addSeparator();
cardMenu->addAction(aClone);
cardMenu->addMenu(moveMenu);
addRelatedCardView(card, cardMenu);
addRelatedCardActions(card, cardMenu);
} else if (card->getZone()->getName() == "rfg" || card->getZone()->getName() == "grave") {
// Card is in the graveyard or exile
cardMenu->addAction(aPlay);
cardMenu->addAction(aPlayFacedown);
cardMenu->addSeparator();
cardMenu->addAction(aClone);
cardMenu->addMenu(moveMenu);
} else {
// Card is in hand or a custom zone specified by server
cardMenu->addAction(aPlay);
cardMenu->addAction(aPlayFacedown);
cardMenu->addMenu(moveMenu);
addRelatedCardView(card, cardMenu);
}
} else {
cardMenu->addMenu(moveMenu);
@ -2680,6 +2690,7 @@ void Player::updateCardMenu(const CardItem *card)
if (card->getZone() && card->getZone()->getName() != "hand") {
cardMenu->addAction(aDrawArrow);
cardMenu->addSeparator();
addRelatedCardView(card, cardMenu);
addRelatedCardActions(card, cardMenu);
cardMenu->addSeparator();
cardMenu->addAction(aClone);
@ -2687,6 +2698,29 @@ void Player::updateCardMenu(const CardItem *card)
}
}
void Player::addRelatedCardView(const CardItem *card, QMenu *cardMenu)
{
if (card == nullptr || cardMenu == nullptr || card->getInfo() == nullptr) {
return;
}
QList<CardRelation *> relatedCards = card->getInfo()->getRelatedCards();
if (relatedCards.isEmpty()) {
return;
}
cardMenu->addSeparator();
auto viewRelatedCards = new QMenu(tr("View related cards"));
cardMenu->addMenu(viewRelatedCards);
auto *signalMapper = new QSignalMapper(this);
for (const CardRelation *relatedCard : relatedCards) {
QAction *viewCard = viewRelatedCards->addAction(relatedCard->getName());
connect(viewCard, SIGNAL(triggered()), signalMapper, SLOT(map()));
signalMapper->setMapping(viewCard, relatedCard->getName());
}
connect(signalMapper, SIGNAL(mapped(const QString &)), game, SLOT(viewCardInfo(const QString &)));
}
void Player::addRelatedCardActions(const CardItem *card, QMenu *cardMenu)
{
if (card == nullptr || cardMenu == nullptr || card->getInfo() == nullptr)