"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)

View file

@ -244,6 +244,7 @@ private:
const QString &avalue,
bool allCards);
void addRelatedCardActions(const CardItem *card, QMenu *cardMenu);
void addRelatedCardView(const CardItem *card, QMenu *cardMenu);
void createCard(const CardItem *sourceCard, const QString &dbCardName, bool attach = false);
void createAttachedCard(const CardItem *sourceCard, const QString &dbCardName);
bool createRelatedFromRelation(const CardItem *sourceCard, const CardRelation *cardRelation);

View file

@ -1604,6 +1604,11 @@ void TabGame::createDeckViewContainerWidget(bool bReplay)
deckViewContainerWidget->setLayout(deckViewContainerLayout);
}
void TabGame::viewCardInfo(const QString &cardName)
{
cardInfo->setCard(cardName);
}
void TabGame::createCardInfoDock(bool bReplay)
{
Q_UNUSED(bReplay);

View file

@ -306,6 +306,7 @@ public:
public slots:
void sendGameCommand(PendingCommand *pend, int playerId = -1);
void sendGameCommand(const ::google::protobuf::Message &command, int playerId = -1);
void viewCardInfo(const QString &cardName);
};
#endif