diff --git a/cockatrice/src/client/tabs/tab_deck_editor.cpp b/cockatrice/src/client/tabs/tab_deck_editor.cpp index cc8c53069..da980db55 100644 --- a/cockatrice/src/client/tabs/tab_deck_editor.cpp +++ b/cockatrice/src/client/tabs/tab_deck_editor.cpp @@ -829,7 +829,7 @@ void TabDeckEditor::updateBannerCardComboBox() bannerCardComboBox->clear(); // Prepare the new items with deduplication - QSet bannerCardSet; + QSet> bannerCardSet; InnerDecklistNode *listRoot = deckModel->getDeckList()->getRoot(); for (int i = 0; i < listRoot->size(); i++) { InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); @@ -839,23 +839,29 @@ void TabDeckEditor::updateBannerCardComboBox() continue; for (int k = 0; k < currentCard->getNumber(); ++k) { - CardInfoPtr info = CardDatabaseManager::getInstance()->getCard(currentCard->getName()); + CardInfoPtr info = CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + currentCard->getName(), currentCard->getCardProviderId()); if (info) { - bannerCardSet.insert(currentCard->getName()); + bannerCardSet.insert(QPair(currentCard->getName(), currentCard->getCardProviderId())); } } } } - // Convert the QSet to a sorted QStringList - QStringList bannerCardChoices; - for (const QString &entry : bannerCardSet) { - bannerCardChoices.append(entry); - } - bannerCardChoices.sort(Qt::CaseInsensitive); + QList> pairList = bannerCardSet.values(); - // Populate the combo box with new items - bannerCardComboBox->addItems(bannerCardChoices); + // 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); @@ -863,7 +869,7 @@ void TabDeckEditor::updateBannerCardComboBox() bannerCardComboBox->setCurrentIndex(restoredIndex); } else { // Add a placeholder "-" and set it as the current selection - int bannerIndex = bannerCardComboBox->findText(deckModel->getDeckList()->getBannerCard()); + int bannerIndex = bannerCardComboBox->findText(deckModel->getDeckList()->getBannerCard().first); if (bannerIndex != -1) { bannerCardComboBox->setCurrentIndex(bannerIndex); } else { @@ -878,8 +884,9 @@ void TabDeckEditor::updateBannerCardComboBox() void TabDeckEditor::setBannerCard(int /* changedIndex */) { - qDebug() << "Banner card was set to: " << bannerCardComboBox->currentText(); - deckModel->getDeckList()->setBannerCard(bannerCardComboBox->currentText()); + QVariantMap data = bannerCardComboBox->itemData(bannerCardComboBox->currentIndex()).toMap(); + qDebug() << "Banner card is " << data["name"].toString() << " and " << data["uuid"].toString(); + deckModel->getDeckList()->setBannerCard(QPair(data["name"].toString(), data["uuid"].toString())); } void TabDeckEditor::updateCardInfo(CardInfoPtr _card) @@ -1048,8 +1055,8 @@ void TabDeckEditor::openDeckFromFile(const QString &fileName, DeckOpenLocation d if (l->loadFromFile(fileName, fmt, true)) { SettingsCache::instance().recents().updateRecentlyOpenedDeckPaths(fileName); updateBannerCardComboBox(); - if (!l->getBannerCard().isEmpty()) { - bannerCardComboBox->setCurrentIndex(bannerCardComboBox->findText(l->getBannerCard())); + if (!l->getBannerCard().first.isEmpty()) { + bannerCardComboBox->setCurrentIndex(bannerCardComboBox->findText(l->getBannerCard().first)); } if (deckOpenLocation == NEW_TAB) { emit openDeckEditor(l); @@ -1544,13 +1551,13 @@ void TabDeckEditor::actDecrement() void TabDeckEditor::setDeck(DeckLoader *_deck) { - qDebug() << " ORIGINAL BANNER CARD " << _deck->getBannerCard(); + qDebug() << " ORIGINAL BANNER CARD " << _deck->getBannerCard().first; deckModel->setDeckList(_deck); nameEdit->setText(deckModel->getDeckList()->getName()); commentsEdit->setText(deckModel->getDeckList()->getComments()); qDebug() << deckModel->getDeckList()->getBannerCard() << " was the banner card"; - bannerCardComboBox->setCurrentText(deckModel->getDeckList()->getBannerCard()); + bannerCardComboBox->setCurrentText(deckModel->getDeckList()->getBannerCard().first); updateBannerCardComboBox(); updateHash(); deckModel->sort(deckView->header()->sortIndicatorSection(), deckView->header()->sortIndicatorOrder()); diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview_widget.cpp index 7fb05bd8c..a656b3c01 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/deck_preview_widget.cpp @@ -14,9 +14,10 @@ DeckPreviewWidget::DeckPreviewWidget(QWidget *parent, const QString &_filePath) deckLoader = new DeckLoader(); deckLoader->loadFromFile(filePath, DeckLoader::CockatriceFormat); - auto bannerCard = deckLoader->getBannerCard().isEmpty() + auto bannerCard = deckLoader->getBannerCard().first.isEmpty() ? CardInfoPtr() - : CardDatabaseManager::getInstance()->getCard(deckLoader->getBannerCard()); + : CardDatabaseManager::getInstance()->getCardByNameAndProviderId( + deckLoader->getBannerCard().first, deckLoader->getBannerCard().second); bannerCardDisplayWidget = new DeckPreviewCardPictureWidget(this); diff --git a/common/decklist.cpp b/common/decklist.cpp index c6f345d58..0b7a9b049 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -427,7 +427,9 @@ bool DeckList::readElement(QXmlStreamReader *xml) else if (childName == "comments") comments = xml->readElementText(); else if (childName == "bannerCard") { - bannerCard = xml->readElementText(); + QString providerId = xml->attributes().value("providerId").toString(); + QString cardName = xml->readElementText(); + bannerCard = QPair(cardName, providerId); } else if (childName == "zone") { InnerDecklistNode *newZone = getZoneObjFromName(xml->attributes().value("name").toString()); newZone->readElement(xml); @@ -449,8 +451,11 @@ void DeckList::write(QXmlStreamWriter *xml) xml->writeAttribute("version", "1"); xml->writeTextElement("lastLoadedTimestamp", lastLoadedTimestamp); xml->writeTextElement("deckname", name); + xml->writeStartElement("bannerCard"); + xml->writeAttribute("providerId", bannerCard.second); + xml->writeCharacters(bannerCard.first); + xml->writeEndElement(); xml->writeTextElement("comments", comments); - xml->writeTextElement("bannerCard", bannerCard); for (int i = 0; i < root->size(); i++) root->at(i)->writeElement(xml); @@ -458,6 +463,7 @@ void DeckList::write(QXmlStreamWriter *xml) QMapIterator i(sideboardPlans); while (i.hasNext()) i.next().value()->write(xml); + xml->writeEndElement(); } diff --git a/common/decklist.h b/common/decklist.h index 8da5ae44b..4aedb8611 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -250,7 +250,8 @@ class DeckList : public QObject { Q_OBJECT private: - QString name, comments, bannerCard; + QString name, comments; + QPair bannerCard; QString deckHash; QString lastLoadedTimestamp; QMap sideboardPlans; @@ -280,7 +281,7 @@ public slots: { comments = _comments; } - void setBannerCard(const QString &_bannerCard = QString()) + void setBannerCard(const QPair &_bannerCard = QPair()) { bannerCard = _bannerCard; } @@ -302,7 +303,7 @@ public: { return comments; } - QString getBannerCard() const + QPair getBannerCard() const { return bannerCard; }