diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp b/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp index 27079dd52..568583af5 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_base_widget.cpp @@ -78,20 +78,14 @@ void ManaBaseWidget::updateDisplay() QHash ManaBaseWidget::analyzeManaBase() { manaBaseMap.clear(); - InnerDecklistNode *listRoot = deckListModel->getDeckList()->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; + QList cardsInDeck = deckListModel->getDeckList()->getCardNodes(); - for (int k = 0; k < currentCard->getNumber(); ++k) { - CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); - if (info) { - auto devotion = determineManaProduction(info->getText()); - mergeManaCounts(manaBaseMap, devotion); - } + for (auto currentCard : cardsInDeck) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); + if (info) { + auto devotion = determineManaProduction(info->getText()); + mergeManaCounts(manaBaseMap, devotion); } } } diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp b/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp index 668b3afd5..4515b723b 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_curve_widget.cpp @@ -44,20 +44,15 @@ void ManaCurveWidget::setDeckModel(DeckListModel *deckModel) std::unordered_map ManaCurveWidget::analyzeManaCurve() { manaCurveMap.clear(); - InnerDecklistNode *listRoot = deckListModel->getDeckList()->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::query()->getCardInfo(currentCard->getName()); - if (info) { - int cmc = info->getCmc().toInt(); - manaCurveMap[cmc]++; - } + QList cardsInDeck = deckListModel->getDeckList()->getCardNodes(); + + for (auto currentCard : cardsInDeck) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); + if (info) { + int cmc = info->getCmc().toInt(); + manaCurveMap[cmc]++; } } } diff --git a/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp b/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp index 4454caef1..3cafdaeab 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/mana_devotion_widget.cpp @@ -46,20 +46,15 @@ void ManaDevotionWidget::setDeckModel(DeckListModel *deckModel) std::unordered_map ManaDevotionWidget::analyzeManaDevotion() { manaDevotionMap.clear(); - InnerDecklistNode *listRoot = deckListModel->getDeckList()->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::query()->getCardInfo(currentCard->getName()); - if (info) { - auto devotion = countManaSymbols(info->getManaCost()); - mergeManaCounts(manaDevotionMap, devotion); - } + QList cardsInDeck = deckListModel->getDeckList()->getCardNodes(); + + for (auto currentCard : cardsInDeck) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); + if (info) { + auto devotion = countManaSymbols(info->getManaCost()); + mergeManaCounts(manaDevotionMap, devotion); } } } diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp index 59c12927c..77086cccc 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp @@ -285,18 +285,12 @@ void DeckEditorDeckDockWidget::updateBannerCardComboBox() // Prepare the new items with deduplication QSet> bannerCardSet; - InnerDecklistNode *listRoot = deckModel->getDeckList()->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; + QList cardsInDeck = deckModel->getDeckList()->getCardNodes(); - for (int k = 0; k < currentCard->getNumber(); ++k) { - if (CardDatabaseManager::query()->getCard(currentCard->toCardRef())) { - bannerCardSet.insert({currentCard->getName(), currentCard->getCardProviderId()}); - } + for (auto currentCard : cardsInDeck) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + if (CardDatabaseManager::query()->getCard(currentCard->toCardRef())) { + bannerCardSet.insert({currentCard->getName(), currentCard->getCardProviderId()}); } } } diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp index 31e2f8d14..3bb81844c 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp @@ -209,30 +209,19 @@ QMap DlgSelectSetForCards::getSetsForCards() if (!decklist) return setCounts; - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return setCounts; + QList cardsInDeck = decklist->getCardNodes(); - for (auto *i : *listRoot) { - auto *countCurrentZone = dynamic_cast(i); - if (!countCurrentZone) + for (auto currentCard : cardsInDeck) { + CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); + if (!infoPtr) continue; - for (auto *cardNode : *countCurrentZone) { - auto *currentCard = dynamic_cast(cardNode); - if (!currentCard) - continue; - - CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); - if (!infoPtr) - continue; - - SetToPrintingsMap setMap = infoPtr->getSets(); - for (auto &setName : setMap.keys()) { - setCounts[setName]++; - } + SetToPrintingsMap setMap = infoPtr->getSets(); + for (auto &setName : setMap.keys()) { + setCounts[setName]++; } } + return setCounts; } @@ -263,48 +252,36 @@ void DlgSelectSetForCards::updateCardLists() if (!decklist) return; - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return; + QList cardsInDeck = decklist->getCardNodes(); - for (auto *i : *listRoot) { - auto *countCurrentZone = dynamic_cast(i); - if (!countCurrentZone) - continue; + for (auto currentCard : cardsInDeck) { + bool found = false; + QString foundSetName; - for (auto *cardNode : *countCurrentZone) { - auto *currentCard = dynamic_cast(cardNode); - if (!currentCard) - continue; - - bool found = false; - 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 - } + // 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) { - // The card was not in any selected set - ExactCard card = CardDatabaseManager::query()->getCard({currentCard->getName()}); - CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(uneditedCardsFlowWidget); - picture_widget->setCard(card); - uneditedCardsFlowWidget->addWidget(picture_widget); - } else { - ExactCard card = CardDatabaseManager::query()->getCard( - {currentCard->getName(), CardDatabaseManager::getInstance() - ->query() - ->getSpecificPrinting(currentCard->getName(), foundSetName, "") - .getUuid()}); - CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(modifiedCardsFlowWidget); - picture_widget->setCard(card); - modifiedCardsFlowWidget->addWidget(picture_widget); - } + if (!found) { + // The card was not in any selected set + ExactCard card = CardDatabaseManager::query()->getCard({currentCard->getName()}); + CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(uneditedCardsFlowWidget); + picture_widget->setCard(card); + uneditedCardsFlowWidget->addWidget(picture_widget); + } else { + ExactCard card = CardDatabaseManager::query()->getCard( + {currentCard->getName(), CardDatabaseManager::getInstance() + ->query() + ->getSpecificPrinting(currentCard->getName(), foundSetName, "") + .getUuid()}); + CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(modifiedCardsFlowWidget); + picture_widget->setCard(card); + modifiedCardsFlowWidget->addWidget(picture_widget); } } } @@ -364,30 +341,19 @@ QMap DlgSelectSetForCards::getCardsForSets() if (!decklist) return setCards; - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return setCards; + QList cardsInDeck = decklist->getCardNodes(); - for (auto *i : *listRoot) { - auto *countCurrentZone = dynamic_cast(i); - if (!countCurrentZone) + for (auto currentCard : cardsInDeck) { + CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); + if (!infoPtr) continue; - for (auto *cardNode : *countCurrentZone) { - auto *currentCard = dynamic_cast(cardNode); - if (!currentCard) - 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()); - } + SetToPrintingsMap setMap = infoPtr->getSets(); + for (auto it = setMap.begin(); it != setMap.end(); ++it) { + setCards[it.key()].append(currentCard->getName()); } } + return setCards; } diff --git a/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp b/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp index 168a21ee7..416de18dc 100644 --- a/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp +++ b/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp @@ -266,35 +266,16 @@ int CardAmountWidget::countCardsInZone(const QString &deckZone) return -1; } - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) { - return -1; - } + QList cardsInDeck = decklist->getCardNodes({deckZone}); int count = 0; - - for (auto *i : *listRoot) { - auto *countCurrentZone = dynamic_cast(i); - if (!countCurrentZone) { - continue; - } - - if (countCurrentZone->getName() != deckZone) { - continue; - } - - for (auto *cardNode : *countCurrentZone) { - auto *currentCard = dynamic_cast(cardNode); - if (!currentCard) { - continue; - } - - for (int k = 0; k < currentCard->getNumber(); ++k) { - if (currentCard->getCardProviderId() == rootCard.getPrinting().getProperty("uuid")) { - count++; - } + for (auto currentCard : cardsInDeck) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + if (currentCard->getCardProviderId() == rootCard.getPrinting().getProperty("uuid")) { + count++; } } } + return count; } \ No newline at end of file diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp index cdb9a8d0c..64eed8b16 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp @@ -67,21 +67,13 @@ void VisualDatabaseDisplayNameFilterWidget::actLoadFromDeck() DeckList *decklist = deckListModel->getDeckList(); if (!decklist) return; - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return; - for (int i = 0; i < listRoot->size(); i++) { - InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); - if (!currentZone) - continue; - for (int j = 0; j < currentZone->size(); j++) { - DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); - if (!currentCard) - continue; - createNameFilter(currentCard->getName()); - } + QList cardsInDeck = decklist->getCardNodes(); + + for (auto currentCard : cardsInDeck) { + createNameFilter(currentCard->getName()); } + updateFilterModel(); } diff --git a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp index ae9cb10ef..b1db1cf37 100644 --- a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp @@ -83,28 +83,15 @@ QList VisualDeckEditorSampleHandWidget::getRandomCards(int amountToGe DeckList *decklist = deckListModel->getDeckList(); if (!decklist) return randomCards; - InnerDecklistNode *listRoot = decklist->getRoot(); - if (!listRoot) - return randomCards; + + QList cardsInDeck = decklist->getCardNodes({DECK_ZONE_MAIN}); // Collect all cards in the main deck, allowing duplicates based on their count - for (int i = 0; i < listRoot->size(); i++) { - InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); - if (!currentZone) - continue; - if (currentZone->getName() != DECK_ZONE_MAIN) - continue; // Only process the main deck - - 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) { - ExactCard card = CardDatabaseManager::query()->getCard(currentCard->toCardRef()); - if (card) { - mainDeckCards.append(card); - } + for (auto currentCard : cardsInDeck) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + ExactCard card = CardDatabaseManager::query()->getCard(currentCard->toCardRef()); + if (card) { + mainDeckCards.append(card); } } } diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp index ca380bc22..df401e247 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp @@ -232,17 +232,12 @@ void DeckPreviewWidget::updateBannerCardComboBox() // Prepare the new items with deduplication QSet> bannerCardSet; - InnerDecklistNode *listRoot = deckLoader->getDeckList()->getRoot(); - for (auto i : *listRoot) { - auto *currentZone = dynamic_cast(i); - for (auto j : *currentZone) { - auto *currentCard = dynamic_cast(j); - if (!currentCard) - continue; - for (int k = 0; k < currentCard->getNumber(); ++k) { - bannerCardSet.insert(QPair(currentCard->getName(), currentCard->getCardProviderId())); - } + QList cardsInDeck = deckLoader->getDeckList()->getCardNodes(); + + for (auto currentCard : cardsInDeck) { + for (int k = 0; k < currentCard->getNumber(); ++k) { + bannerCardSet.insert(QPair(currentCard->getName(), currentCard->getCardProviderId())); } } diff --git a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp index b2fbdb028..43a474ca8 100644 --- a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp +++ b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.cpp @@ -563,6 +563,29 @@ QList DeckList::getCardRefList() const return result; } +QList DeckList::getCardNodes(const QStringList &restrictToZones) const +{ + QList result; + + for (auto *node : *root) { + auto *zoneNode = dynamic_cast(node); + if (zoneNode == nullptr) { + continue; + } + if (!restrictToZones.isEmpty() && !restrictToZones.contains(node->getName())) { + continue; + } + for (auto *cardNode : *zoneNode) { + auto *cardCardNode = dynamic_cast(cardNode); + if (cardCardNode != nullptr) { + result.append(cardCardNode); + } + } + } + + return result; +} + int DeckList::getSideboardSize() const { int size = 0; diff --git a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h index fc0c07405..5ea1b50cd 100644 --- a/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h +++ b/libcockatrice_deck_list/libcockatrice/deck_list/deck_list.h @@ -289,6 +289,7 @@ public: } QStringList getCardList() const; QList getCardRefList() const; + QList getCardNodes(const QStringList &restrictToZones = QStringList()) const; int getSideboardSize() const; InnerDecklistNode *getRoot() const {