diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp index 27519c252..0fb32984a 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp @@ -38,6 +38,15 @@ DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent, layout->addWidget(bannerCardDisplayWidget); } +void DeckPreviewWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + if (bannerCardDisplayWidget == nullptr || bannerCardComboBox == nullptr) { + return; + } + bannerCardComboBox->setMaximumWidth(bannerCardDisplayWidget->width()); +} + void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess) { if (!deckLoadSuccess) { @@ -56,10 +65,26 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess) colorIdentityWidget = new DeckPreviewColorIdentityWidget(this, getColorIdentity()); deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, deckLoader); + + bannerCardLabel = new QLabel(); + bannerCardLabel->setObjectName("bannerCardLabel"); + bannerCardLabel->setText(tr("Banner Card")); + bannerCardComboBox = new QComboBox(this); + bannerCardComboBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + bannerCardComboBox->setObjectName("bannerCardComboBox"); + bannerCardComboBox->setCurrentText(deckLoader->getBannerCard().first); + bannerCardComboBox->installEventFilter(new NoScrollFilter()); + connect(bannerCardComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, + &DeckPreviewWidget::setBannerCard); + updateTagsVisibility(SettingsCache::instance().getVisualDeckStorageShowTagsOnDeckPreviews()); + updateBannerCardComboBox(); + layout->addWidget(colorIdentityWidget); layout->addWidget(deckTagsDisplayWidget); + layout->addWidget(bannerCardLabel); + layout->addWidget(bannerCardComboBox); } void DeckPreviewWidget::updateVisibility() @@ -133,6 +158,79 @@ void DeckPreviewWidget::refreshBannerCardText() deckLoader->getName().isEmpty() ? QFileInfo(deckLoader->getLastFileName()).fileName() : deckLoader->getName()); } +void DeckPreviewWidget::updateBannerCardComboBox() +{ + // Store the current text of the combo box + QString currentText = bannerCardComboBox->currentText(); + + // Block signals temporarily + bool wasBlocked = bannerCardComboBox->blockSignals(true); + + // Clear the existing items in the combo box + bannerCardComboBox->clear(); + + // Prepare the new items with deduplication + QSet> bannerCardSet; + InnerDecklistNode *listRoot = deckLoader->getRoot(); + for (int i = 0; i < listRoot->size(); i++) { + InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); + for (int j = 0; j < currentZone->size(); j++) { + DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); + if (!currentCard) + continue; + + for (int k = 0; k < currentCard->getNumber(); ++k) { + CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + currentCard->getName(), currentCard->getCardProviderId()); + if (info) { + bannerCardSet.insert( + QPair(currentCard->getName(), currentCard->getCardProviderId())); + } + } + } + } + + QList> pairList = bannerCardSet.values(); + + // Sort QList by the first() element of the QPair + std::sort(pairList.begin(), pairList.end(), [](const QPair &a, const QPair &b) { + return a.first.toLower() < b.first.toLower(); + }); + + for (const auto &pair : pairList) { + QVariantMap dataMap; + dataMap["name"] = pair.first; + dataMap["uuid"] = pair.second; + + bannerCardComboBox->addItem(pair.first, dataMap); + } + + // Try to restore the previous selection by finding the currentText + int restoredIndex = bannerCardComboBox->findText(currentText); + if (restoredIndex != -1) { + bannerCardComboBox->setCurrentIndex(restoredIndex); + } else { + // Add a placeholder "-" and set it as the current selection + int bannerIndex = bannerCardComboBox->findText(deckLoader->getBannerCard().first); + if (bannerIndex != -1) { + bannerCardComboBox->setCurrentIndex(bannerIndex); + } else { + bannerCardComboBox->insertItem(0, "-"); + bannerCardComboBox->setCurrentIndex(0); + } + } + + // Restore the previous signal blocking state + bannerCardComboBox->blockSignals(wasBlocked); +} + +void DeckPreviewWidget::setBannerCard(int /* changedIndex */) +{ + QVariantMap itemData = bannerCardComboBox->itemData(bannerCardComboBox->currentIndex()).toMap(); + deckLoader->setBannerCard(QPair(itemData["name"].toString(), itemData["uuid"].toString())); + deckLoader->saveToFile(filePath, DeckLoader::getFormatFromName(filePath)); +} + void DeckPreviewWidget::imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance) { Q_UNUSED(instance); diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h index af5dd04b7..b0f973d05 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h @@ -25,9 +25,11 @@ public: QVBoxLayout *layout; QString filePath; DeckLoader *deckLoader; - DeckPreviewCardPictureWidget *bannerCardDisplayWidget; - DeckPreviewColorIdentityWidget *colorIdentityWidget; - DeckPreviewDeckTagsDisplayWidget *deckTagsDisplayWidget; + DeckPreviewCardPictureWidget *bannerCardDisplayWidget = nullptr; + DeckPreviewColorIdentityWidget *colorIdentityWidget = nullptr; + DeckPreviewDeckTagsDisplayWidget *deckTagsDisplayWidget = nullptr; + QLabel *bannerCardLabel = nullptr; + QComboBox *bannerCardComboBox = nullptr; bool filteredBySearch = false; bool filteredByColor = false; bool filteredByTags = false; @@ -41,11 +43,27 @@ signals: public slots: void setFilePath(const QString &filePath); void refreshBannerCardText(); + void updateBannerCardComboBox(); + void setBannerCard(int); void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); void initializeUi(bool deckLoadSuccess); void updateVisibility(); void updateTagsVisibility(bool visible); + void resizeEvent(QResizeEvent *event) override; +}; + +class NoScrollFilter : public QObject +{ + Q_OBJECT +protected: + bool eventFilter(QObject *obj, QEvent *event) override + { + if (event->type() == QEvent::Wheel) { + return true; // Blocks the event + } + return QObject::eventFilter(obj, event); + } }; #endif // DECK_PREVIEW_WIDGET_H