diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 3e2e0eb0..27f1d0be 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #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 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) diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index 70edd2cf..2078c43d 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -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); diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index 09991b70..7f564328 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -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); diff --git a/cockatrice/src/tab_game.h b/cockatrice/src/tab_game.h index 46aacc60..72d3331d 100644 --- a/cockatrice/src/tab_game.h +++ b/cockatrice/src/tab_game.h @@ -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