From ac3aa949adfd505e1a96b66b4e6943ce222a09f3 Mon Sep 17 00:00:00 2001 From: RickyRister <42636155+RickyRister@users.noreply.github.com> Date: Sat, 28 Dec 2024 22:11:12 -0800 Subject: [PATCH] add "view related cards" right click menu to card info widget (#5375) --- .../widgets/cards/card_info_frame_widget.cpp | 3 ++ .../cards/card_info_picture_widget.cpp | 48 +++++++++++++++++++ .../widgets/cards/card_info_picture_widget.h | 5 ++ 3 files changed, 56 insertions(+) diff --git a/cockatrice/src/client/ui/widgets/cards/card_info_frame_widget.cpp b/cockatrice/src/client/ui/widgets/cards/card_info_frame_widget.cpp index fd9c84750..a7a789be1 100644 --- a/cockatrice/src/client/ui/widgets/cards/card_info_frame_widget.cpp +++ b/cockatrice/src/client/ui/widgets/cards/card_info_frame_widget.cpp @@ -3,6 +3,7 @@ #include "../../../../game/cards/card_database_manager.h" #include "../../../../game/cards/card_item.h" #include "../../../../settings/cache_settings.h" +#include "card_info_display_widget.h" #include "card_info_picture_widget.h" #include "card_info_text_widget.h" @@ -16,6 +17,8 @@ CardInfoFrameWidget::CardInfoFrameWidget(const QString &cardName, QWidget *paren setContentsMargins(3, 3, 3, 3); pic = new CardInfoPictureWidget(); pic->setObjectName("pic"); + connect(pic, &CardInfoPictureWidget::cardChanged, this, qOverload(&CardInfoFrameWidget::setCard)); + text = new CardInfoTextWidget(); text->setObjectName("text"); connect(text, SIGNAL(linkActivated(const QString &)), this, SLOT(setCard(const QString &))); diff --git a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp index 1cb000d7c..6f3badc88 100644 --- a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp +++ b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.cpp @@ -1,9 +1,11 @@ #include "card_info_picture_widget.h" +#include "../../../../game/cards/card_database_manager.h" #include "../../../../game/cards/card_item.h" #include "../../../../settings/cache_settings.h" #include "../../picture_loader.h" +#include #include #include #include @@ -235,6 +237,52 @@ void CardInfoPictureWidget::mouseMoveEvent(QMouseEvent *event) } } +void CardInfoPictureWidget::mousePressEvent(QMouseEvent *event) +{ + QWidget::mousePressEvent(event); + if (event->button() == Qt::RightButton) { + createRightClickMenu()->popup(QCursor::pos()); + } +} + +QMenu *CardInfoPictureWidget::createRightClickMenu() +{ + auto *cardMenu = new QMenu(this); + + if (!info) { + return cardMenu; + } + + auto viewRelatedCards = new QMenu(tr("View related cards")); + cardMenu->addMenu(viewRelatedCards); + + bool atLeastOneGoodRelationFound = false; + QList relatedCards = info->getAllRelatedCards(); + for (const CardRelation *cardRelation : relatedCards) { + CardInfoPtr relatedCard = CardDatabaseManager::getInstance()->getCard(cardRelation->getName()); + if (relatedCard != nullptr) { + atLeastOneGoodRelationFound = true; + break; + } + } + + if (!atLeastOneGoodRelationFound) { + viewRelatedCards->setEnabled(false); + return cardMenu; + } + + for (const auto &relatedCard : relatedCards) { + const auto &relatedCardName = relatedCard->getName(); + QAction *viewCard = viewRelatedCards->addAction(relatedCardName); + connect(viewCard, &QAction::triggered, this, [this, &relatedCardName] { + emit cardChanged(CardDatabaseManager::getInstance()->getCard(relatedCardName)); + }); + viewRelatedCards->addAction(viewCard); + } + + return cardMenu; +} + /** * @brief Displays the enlarged version of the card's pixmap near the cursor. * diff --git a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h index f274d8ad1..9419de5b9 100644 --- a/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h +++ b/cockatrice/src/client/ui/widgets/cards/card_info_picture_widget.h @@ -8,6 +8,7 @@ #include class AbstractCardItem; +class QMenu; class CardInfoPictureWidget : public QWidget { @@ -30,6 +31,7 @@ public slots: signals: void hoveredOnCard(CardInfoPtr hoveredCard); void cardScaleFactorChanged(int _scale); + void cardChanged(CardInfoPtr card); protected: void resizeEvent(QResizeEvent *event) override; @@ -41,6 +43,7 @@ protected: #endif void leaveEvent(QEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; void loadPixmap(); [[nodiscard]] const QPixmap &getResizedPixmap() const { @@ -63,6 +66,8 @@ private: CardInfoPictureEnlargedWidget *enlargedPixmapWidget; int enlargedPixmapOffset = 10; QTimer *hoverTimer; + + QMenu *createRightClickMenu(); }; #endif