Helper to query deckList for DecklistCardNodes. (#6242)

* Helper to query deckList for DecklistCardNodes.

Took 30 minutes

Took 6 minutes

Took 2 minutes

* Fix unused.

Took 3 minutes


Took 1 minute

* Convert string to string list.

Took 2 minutes

* Adjust to rebase.

Took 2 minutes

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
BruebachL 2025-11-15 17:21:43 +01:00 committed by GitHub
parent f62e29f5d5
commit ace4063371
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 117 additions and 194 deletions

View file

@ -78,20 +78,14 @@ void ManaBaseWidget::updateDisplay()
QHash<QString, int> ManaBaseWidget::analyzeManaBase() QHash<QString, int> ManaBaseWidget::analyzeManaBase()
{ {
manaBaseMap.clear(); manaBaseMap.clear();
InnerDecklistNode *listRoot = deckListModel->getDeckList()->getRoot(); QList<DecklistCardNode *> cardsInDeck = deckListModel->getDeckList()->getCardNodes();
for (int i = 0; i < listRoot->size(); i++) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (auto currentCard : cardsInDeck) {
CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); for (int k = 0; k < currentCard->getNumber(); ++k) {
if (info) { CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
auto devotion = determineManaProduction(info->getText()); if (info) {
mergeManaCounts(manaBaseMap, devotion); auto devotion = determineManaProduction(info->getText());
} mergeManaCounts(manaBaseMap, devotion);
} }
} }
} }

View file

@ -44,20 +44,15 @@ void ManaCurveWidget::setDeckModel(DeckListModel *deckModel)
std::unordered_map<int, int> ManaCurveWidget::analyzeManaCurve() std::unordered_map<int, int> ManaCurveWidget::analyzeManaCurve()
{ {
manaCurveMap.clear(); manaCurveMap.clear();
InnerDecklistNode *listRoot = deckListModel->getDeckList()->getRoot();
for (int i = 0; i < listRoot->size(); i++) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { QList<DecklistCardNode *> cardsInDeck = deckListModel->getDeckList()->getCardNodes();
CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
if (info) { for (auto currentCard : cardsInDeck) {
int cmc = info->getCmc().toInt(); for (int k = 0; k < currentCard->getNumber(); ++k) {
manaCurveMap[cmc]++; CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
} if (info) {
int cmc = info->getCmc().toInt();
manaCurveMap[cmc]++;
} }
} }
} }

View file

@ -46,20 +46,15 @@ void ManaDevotionWidget::setDeckModel(DeckListModel *deckModel)
std::unordered_map<char, int> ManaDevotionWidget::analyzeManaDevotion() std::unordered_map<char, int> ManaDevotionWidget::analyzeManaDevotion()
{ {
manaDevotionMap.clear(); manaDevotionMap.clear();
InnerDecklistNode *listRoot = deckListModel->getDeckList()->getRoot();
for (int i = 0; i < listRoot->size(); i++) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { QList<DecklistCardNode *> cardsInDeck = deckListModel->getDeckList()->getCardNodes();
CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
if (info) { for (auto currentCard : cardsInDeck) {
auto devotion = countManaSymbols(info->getManaCost()); for (int k = 0; k < currentCard->getNumber(); ++k) {
mergeManaCounts(manaDevotionMap, devotion); CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
} if (info) {
auto devotion = countManaSymbols(info->getManaCost());
mergeManaCounts(manaDevotionMap, devotion);
} }
} }
} }

View file

@ -285,18 +285,12 @@ void DeckEditorDeckDockWidget::updateBannerCardComboBox()
// Prepare the new items with deduplication // Prepare the new items with deduplication
QSet<QPair<QString, QString>> bannerCardSet; QSet<QPair<QString, QString>> bannerCardSet;
InnerDecklistNode *listRoot = deckModel->getDeckList()->getRoot(); QList<DecklistCardNode *> cardsInDeck = deckModel->getDeckList()->getCardNodes();
for (int i = 0; i < listRoot->size(); i++) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { for (auto currentCard : cardsInDeck) {
if (CardDatabaseManager::query()->getCard(currentCard->toCardRef())) { for (int k = 0; k < currentCard->getNumber(); ++k) {
bannerCardSet.insert({currentCard->getName(), currentCard->getCardProviderId()}); if (CardDatabaseManager::query()->getCard(currentCard->toCardRef())) {
} bannerCardSet.insert({currentCard->getName(), currentCard->getCardProviderId()});
} }
} }
} }

View file

@ -209,30 +209,19 @@ QMap<QString, int> DlgSelectSetForCards::getSetsForCards()
if (!decklist) if (!decklist)
return setCounts; return setCounts;
InnerDecklistNode *listRoot = decklist->getRoot(); QList<DecklistCardNode *> cardsInDeck = decklist->getCardNodes();
if (!listRoot)
return setCounts;
for (auto *i : *listRoot) { for (auto currentCard : cardsInDeck) {
auto *countCurrentZone = dynamic_cast<InnerDecklistNode *>(i); CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
if (!countCurrentZone) if (!infoPtr)
continue; continue;
for (auto *cardNode : *countCurrentZone) { SetToPrintingsMap setMap = infoPtr->getSets();
auto *currentCard = dynamic_cast<DecklistCardNode *>(cardNode); for (auto &setName : setMap.keys()) {
if (!currentCard) setCounts[setName]++;
continue;
CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
if (!infoPtr)
continue;
SetToPrintingsMap setMap = infoPtr->getSets();
for (auto &setName : setMap.keys()) {
setCounts[setName]++;
}
} }
} }
return setCounts; return setCounts;
} }
@ -263,48 +252,36 @@ void DlgSelectSetForCards::updateCardLists()
if (!decklist) if (!decklist)
return; return;
InnerDecklistNode *listRoot = decklist->getRoot(); QList<DecklistCardNode *> cardsInDeck = decklist->getCardNodes();
if (!listRoot)
return;
for (auto *i : *listRoot) { for (auto currentCard : cardsInDeck) {
auto *countCurrentZone = dynamic_cast<InnerDecklistNode *>(i); bool found = false;
if (!countCurrentZone) QString foundSetName;
continue;
for (auto *cardNode : *countCurrentZone) { // Check across all sets if the card is present
auto *currentCard = dynamic_cast<DecklistCardNode *>(cardNode); for (auto it = selectedCardsBySet.begin(); it != selectedCardsBySet.end(); ++it) {
if (!currentCard) if (it.value().contains(currentCard->getName())) {
continue; found = true;
foundSetName = it.key(); // Store the set name where it was found
bool found = false; break; // Stop at the first match
QString foundSetName;
// Check across all sets if the card is present
for (auto it = selectedCardsBySet.begin(); it != selectedCardsBySet.end(); ++it) {
if (it.value().contains(currentCard->getName())) {
found = true;
foundSetName = it.key(); // Store the set name where it was found
break; // Stop at the first match
}
} }
}
if (!found) { if (!found) {
// The card was not in any selected set // The card was not in any selected set
ExactCard card = CardDatabaseManager::query()->getCard({currentCard->getName()}); ExactCard card = CardDatabaseManager::query()->getCard({currentCard->getName()});
CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(uneditedCardsFlowWidget); CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(uneditedCardsFlowWidget);
picture_widget->setCard(card); picture_widget->setCard(card);
uneditedCardsFlowWidget->addWidget(picture_widget); uneditedCardsFlowWidget->addWidget(picture_widget);
} else { } else {
ExactCard card = CardDatabaseManager::query()->getCard( ExactCard card = CardDatabaseManager::query()->getCard(
{currentCard->getName(), CardDatabaseManager::getInstance() {currentCard->getName(), CardDatabaseManager::getInstance()
->query() ->query()
->getSpecificPrinting(currentCard->getName(), foundSetName, "") ->getSpecificPrinting(currentCard->getName(), foundSetName, "")
.getUuid()}); .getUuid()});
CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(modifiedCardsFlowWidget); CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(modifiedCardsFlowWidget);
picture_widget->setCard(card); picture_widget->setCard(card);
modifiedCardsFlowWidget->addWidget(picture_widget); modifiedCardsFlowWidget->addWidget(picture_widget);
}
} }
} }
} }
@ -364,30 +341,19 @@ QMap<QString, QStringList> DlgSelectSetForCards::getCardsForSets()
if (!decklist) if (!decklist)
return setCards; return setCards;
InnerDecklistNode *listRoot = decklist->getRoot(); QList<DecklistCardNode *> cardsInDeck = decklist->getCardNodes();
if (!listRoot)
return setCards;
for (auto *i : *listRoot) { for (auto currentCard : cardsInDeck) {
auto *countCurrentZone = dynamic_cast<InnerDecklistNode *>(i); CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
if (!countCurrentZone) if (!infoPtr)
continue; continue;
for (auto *cardNode : *countCurrentZone) { SetToPrintingsMap setMap = infoPtr->getSets();
auto *currentCard = dynamic_cast<DecklistCardNode *>(cardNode); for (auto it = setMap.begin(); it != setMap.end(); ++it) {
if (!currentCard) setCards[it.key()].append(currentCard->getName());
continue;
CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName());
if (!infoPtr)
continue;
SetToPrintingsMap setMap = infoPtr->getSets();
for (auto it = setMap.begin(); it != setMap.end(); ++it) {
setCards[it.key()].append(currentCard->getName());
}
} }
} }
return setCards; return setCards;
} }

View file

@ -266,35 +266,16 @@ int CardAmountWidget::countCardsInZone(const QString &deckZone)
return -1; return -1;
} }
InnerDecklistNode *listRoot = decklist->getRoot(); QList<DecklistCardNode *> cardsInDeck = decklist->getCardNodes({deckZone});
if (!listRoot) {
return -1;
}
int count = 0; int count = 0;
for (auto currentCard : cardsInDeck) {
for (auto *i : *listRoot) { for (int k = 0; k < currentCard->getNumber(); ++k) {
auto *countCurrentZone = dynamic_cast<InnerDecklistNode *>(i); if (currentCard->getCardProviderId() == rootCard.getPrinting().getProperty("uuid")) {
if (!countCurrentZone) { count++;
continue;
}
if (countCurrentZone->getName() != deckZone) {
continue;
}
for (auto *cardNode : *countCurrentZone) {
auto *currentCard = dynamic_cast<DecklistCardNode *>(cardNode);
if (!currentCard) {
continue;
}
for (int k = 0; k < currentCard->getNumber(); ++k) {
if (currentCard->getCardProviderId() == rootCard.getPrinting().getProperty("uuid")) {
count++;
}
} }
} }
} }
return count; return count;
} }

View file

@ -67,21 +67,13 @@ void VisualDatabaseDisplayNameFilterWidget::actLoadFromDeck()
DeckList *decklist = deckListModel->getDeckList(); DeckList *decklist = deckListModel->getDeckList();
if (!decklist) if (!decklist)
return; return;
InnerDecklistNode *listRoot = decklist->getRoot();
if (!listRoot)
return;
for (int i = 0; i < listRoot->size(); i++) { QList<DecklistCardNode *> cardsInDeck = decklist->getCardNodes();
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
if (!currentZone) for (auto currentCard : cardsInDeck) {
continue; createNameFilter(currentCard->getName());
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
createNameFilter(currentCard->getName());
}
} }
updateFilterModel(); updateFilterModel();
} }

View file

@ -83,28 +83,15 @@ QList<ExactCard> VisualDeckEditorSampleHandWidget::getRandomCards(int amountToGe
DeckList *decklist = deckListModel->getDeckList(); DeckList *decklist = deckListModel->getDeckList();
if (!decklist) if (!decklist)
return randomCards; return randomCards;
InnerDecklistNode *listRoot = decklist->getRoot();
if (!listRoot) QList<DecklistCardNode *> cardsInDeck = decklist->getCardNodes({DECK_ZONE_MAIN});
return randomCards;
// Collect all cards in the main deck, allowing duplicates based on their count // Collect all cards in the main deck, allowing duplicates based on their count
for (int i = 0; i < listRoot->size(); i++) { for (auto currentCard : cardsInDeck) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i)); for (int k = 0; k < currentCard->getNumber(); ++k) {
if (!currentZone) ExactCard card = CardDatabaseManager::query()->getCard(currentCard->toCardRef());
continue; if (card) {
if (currentZone->getName() != DECK_ZONE_MAIN) mainDeckCards.append(card);
continue; // Only process the main deck
for (int j = 0; j < currentZone->size(); j++) {
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) {
ExactCard card = CardDatabaseManager::query()->getCard(currentCard->toCardRef());
if (card) {
mainDeckCards.append(card);
}
} }
} }
} }

View file

@ -232,17 +232,12 @@ void DeckPreviewWidget::updateBannerCardComboBox()
// Prepare the new items with deduplication // Prepare the new items with deduplication
QSet<QPair<QString, QString>> bannerCardSet; QSet<QPair<QString, QString>> bannerCardSet;
InnerDecklistNode *listRoot = deckLoader->getDeckList()->getRoot();
for (auto i : *listRoot) {
auto *currentZone = dynamic_cast<InnerDecklistNode *>(i);
for (auto j : *currentZone) {
auto *currentCard = dynamic_cast<DecklistCardNode *>(j);
if (!currentCard)
continue;
for (int k = 0; k < currentCard->getNumber(); ++k) { QList<DecklistCardNode *> cardsInDeck = deckLoader->getDeckList()->getCardNodes();
bannerCardSet.insert(QPair<QString, QString>(currentCard->getName(), currentCard->getCardProviderId()));
} for (auto currentCard : cardsInDeck) {
for (int k = 0; k < currentCard->getNumber(); ++k) {
bannerCardSet.insert(QPair<QString, QString>(currentCard->getName(), currentCard->getCardProviderId()));
} }
} }

View file

@ -563,6 +563,29 @@ QList<CardRef> DeckList::getCardRefList() const
return result; return result;
} }
QList<DecklistCardNode *> DeckList::getCardNodes(const QStringList &restrictToZones) const
{
QList<DecklistCardNode *> result;
for (auto *node : *root) {
auto *zoneNode = dynamic_cast<InnerDecklistNode *>(node);
if (zoneNode == nullptr) {
continue;
}
if (!restrictToZones.isEmpty() && !restrictToZones.contains(node->getName())) {
continue;
}
for (auto *cardNode : *zoneNode) {
auto *cardCardNode = dynamic_cast<DecklistCardNode *>(cardNode);
if (cardCardNode != nullptr) {
result.append(cardCardNode);
}
}
}
return result;
}
int DeckList::getSideboardSize() const int DeckList::getSideboardSize() const
{ {
int size = 0; int size = 0;

View file

@ -289,6 +289,7 @@ public:
} }
QStringList getCardList() const; QStringList getCardList() const;
QList<CardRef> getCardRefList() const; QList<CardRef> getCardRefList() const;
QList<DecklistCardNode *> getCardNodes(const QStringList &restrictToZones = QStringList()) const;
int getSideboardSize() const; int getSideboardSize() const;
InnerDecklistNode *getRoot() const InnerDecklistNode *getRoot() const
{ {