diff --git a/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp b/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp index a5ddf37a1..3ca18d21c 100644 --- a/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp +++ b/cockatrice/src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp @@ -21,32 +21,26 @@ void DeckListStatisticsAnalyzer::update() manaCurveMap.clear(); manaDevotionMap.clear(); - auto nodes = model->getDeckList()->getCardNodes(); + QList cards = model->getCards(); - for (auto *node : nodes) { - CardInfoPtr info = CardDatabaseManager::query()->getCardInfo(node->getName()); - if (!info) - continue; + for (const ExactCard &card : cards) { + // ---- Mana curve ---- + if (config.computeManaCurve) { + manaCurveMap[card.getInfo().getCmc().toInt()]++; + } - for (int i = 0; i < node->getNumber(); ++i) { - // ---- Mana curve ---- - if (config.computeManaCurve) { - manaCurveMap[info->getCmc().toInt()]++; - } + // ---- Mana base ---- + if (config.computeManaBase) { + auto mana = determineManaProduction(card.getInfo().getText()); + for (auto it = mana.begin(); it != mana.end(); ++it) + manaBaseMap[it.key()] += it.value(); + } - // ---- Mana base ---- - if (config.computeManaBase) { - auto mana = determineManaProduction(info->getText()); - for (auto it = mana.begin(); it != mana.end(); ++it) - manaBaseMap[it.key()] += it.value(); - } - - // ---- Devotion ---- - if (config.computeDevotion) { - auto devo = countManaSymbols(info->getManaCost()); - for (auto &d : devo) - manaDevotionMap[d.first] += d.second; - } + // ---- Devotion ---- + if (config.computeDevotion) { + auto devo = countManaSymbols(card.getInfo().getManaCost()); + for (auto &d : devo) + manaDevotionMap[d.first] += d.second; } } 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 2bfe650c3..52768e0e7 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 @@ -224,14 +224,10 @@ QMap DlgSelectSetForCards::getSetsForCards() if (!model) return setCounts; - DeckList *decklist = model->getDeckList(); - if (!decklist) - return setCounts; + QList cardNames = model->getCardNames(); - QList cardsInDeck = decklist->getCardNodes(); - - for (auto currentCard : cardsInDeck) { - CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); + for (auto cardName : cardNames) { + CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(cardName); if (!infoPtr) continue; @@ -267,19 +263,15 @@ void DlgSelectSetForCards::updateCardLists() } } - DeckList *decklist = model->getDeckList(); - if (!decklist) - return; + QList cardNames = model->getCardNames(); - QList cardsInDeck = decklist->getCardNodes(); - - for (auto currentCard : cardsInDeck) { + for (auto cardName : cardNames) { 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())) { + if (it.value().contains(cardName)) { found = true; foundSetName = it.key(); // Store the set name where it was found break; // Stop at the first match @@ -288,16 +280,16 @@ void DlgSelectSetForCards::updateCardLists() if (!found) { // The card was not in any selected set - ExactCard card = CardDatabaseManager::query()->getCard({currentCard->getName()}); + ExactCard card = CardDatabaseManager::query()->getCard({cardName}); 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()}); + ExactCard card = + CardDatabaseManager::query()->getCard({cardName, CardDatabaseManager::getInstance() + ->query() + ->getSpecificPrinting(cardName, foundSetName, "") + .getUuid()}); CardInfoPictureWidget *picture_widget = new CardInfoPictureWidget(modifiedCardsFlowWidget); picture_widget->setCard(card); modifiedCardsFlowWidget->addWidget(picture_widget); @@ -356,20 +348,16 @@ QMap DlgSelectSetForCards::getCardsForSets() if (!model) return setCards; - DeckList *decklist = model->getDeckList(); - if (!decklist) - return setCards; + QList cardNames = model->getCardNames(); - QList cardsInDeck = decklist->getCardNodes(); - - for (auto currentCard : cardsInDeck) { - CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(currentCard->getName()); + for (auto cardName : cardNames) { + CardInfoPtr infoPtr = CardDatabaseManager::query()->getCardInfo(cardName); if (!infoPtr) continue; SetToPrintingsMap setMap = infoPtr->getSets(); for (auto it = setMap.begin(); it != setMap.end(); ++it) { - setCards[it.key()].append(currentCard->getName()); + setCards[it.key()].append(cardName); } } 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 0d0195d34..3d519e595 100644 --- a/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp +++ b/cockatrice/src/interface/widgets/printing_selector/card_amount_widget.cpp @@ -306,19 +306,12 @@ int CardAmountWidget::countCardsInZone(const QString &deckZone) return -1; } - DeckList *decklist = deckModel->getDeckList(); - if (!decklist) { - return -1; - } - - QList cardsInDeck = decklist->getCardNodes({deckZone}); + QList cards = deckModel->getCardsForZone(deckZone); int count = 0; - for (auto currentCard : cardsInDeck) { - for (int k = 0; k < currentCard->getNumber(); ++k) { - if (currentCard->getCardProviderId() == rootCard.getPrinting().getProperty("uuid")) { - count++; - } + for (auto currentCard : cards) { + if (currentCard.getPrinting().getUuid() == rootCard.getPrinting().getProperty("uuid")) { + count++; } } 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 9bc506056..b43b11f11 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 @@ -64,14 +64,10 @@ void VisualDatabaseDisplayNameFilterWidget::actLoadFromDeck() if (!deckListModel) return; - DeckList *decklist = deckListModel->getDeckList(); - if (!decklist) - return; - QList cardsInDeck = decklist->getCardNodes(); - - for (auto currentCard : cardsInDeck) { - createNameFilter(currentCard->getName()); + QList cardNames = deckListModel->getCardNames(); + for (auto cardName : cardNames) { + createNameFilter(cardName); } 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 778706f9a..0badb76ff 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 @@ -76,25 +76,11 @@ void VisualDeckEditorSampleHandWidget::updateDisplay() QList VisualDeckEditorSampleHandWidget::getRandomCards(int amountToGet) { - QList mainDeckCards; QList randomCards; if (!deckListModel) return randomCards; - DeckList *decklist = deckListModel->getDeckList(); - if (!decklist) - return randomCards; - QList cardsInDeck = decklist->getCardNodes({DECK_ZONE_MAIN}); - - // Collect all cards in the main deck, allowing duplicates based on their count - for (auto currentCard : cardsInDeck) { - for (int k = 0; k < currentCard->getNumber(); ++k) { - ExactCard card = CardDatabaseManager::query()->getCard(currentCard->toCardRef()); - if (card) { - mainDeckCards.append(card); - } - } - } + QList mainDeckCards = deckListModel->getCardsForZone(DECK_ZONE_MAIN); if (mainDeckCards.isEmpty()) return randomCards; diff --git a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp index 992c33961..8859a31fe 100644 --- a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp +++ b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp @@ -561,10 +561,8 @@ void DeckListModel::setDeckList(DeckList *_deck) rebuildTree(); } -QList DeckListModel::getCards() const +static QList cardNodesToExactCards(QList nodes) { - auto nodes = deckList->getCardNodes(); - QList cards; for (auto node : nodes) { ExactCard card = CardDatabaseManager::query()->getCard(node->toCardRef()); @@ -580,23 +578,26 @@ QList DeckListModel::getCards() const return cards; } +QList DeckListModel::getCards() const +{ + auto nodes = deckList->getCardNodes(); + return cardNodesToExactCards(nodes); +} + QList DeckListModel::getCardsForZone(const QString &zoneName) const { auto nodes = deckList->getCardNodes({zoneName}); + return cardNodesToExactCards(nodes); +} - QList cards; - for (auto node : nodes) { - ExactCard card = CardDatabaseManager::query()->getCard(node->toCardRef()); - if (card) { - for (int k = 0; k < node->getNumber(); ++k) { - cards.append(card); - } - } else { - qDebug() << "Card not found in database!"; - } - } +QList DeckListModel::getCardNames() const +{ + auto nodes = deckList->getCardNodes(); - return cards; + QList names; + std::transform(nodes.cbegin(), nodes.cend(), std::back_inserter(names), [](auto node) { return node->getName(); }); + + return names; } QList DeckListModel::getZones() const @@ -632,7 +633,6 @@ static int maxAllowedForLegality(const FormatRules &format, const QString &legal return -1; // unknown legality → treat as illegal } - bool DeckListModel::isCardQuantityLegalForCurrentFormat(const CardInfoPtr cardInfo, int quantity) { auto formatRules = CardDatabaseManager::query()->getFormat(deckList->getGameFormat()); diff --git a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h index 7d8265d7a..6e8882084 100644 --- a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h +++ b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h @@ -309,9 +309,25 @@ public: } void setDeckList(DeckList *_deck); + /** + * @brief Creates a list consisting of the entries of the model mapped into ExactCards (with each entry looked up + * in the card database). + * If a card node has number > 1, it will be added that many times to the list. + * If an entry's card is not found in the card database, that entry will be left out of the list. + * @return An ordered list of ExactCards + */ [[nodiscard]] QList getCards() const; [[nodiscard]] QList getCardsForZone(const QString &zoneName) const; + + /** + * @brief Gets a deduplicated list of all card names that appear in the model + */ + [[nodiscard]] QList getCardNames() const; + /** + * @brief Gets a list of all zone names that appear in the model + */ [[nodiscard]] QList getZones() const; + bool isCardLegalForCurrentFormat(CardInfoPtr cardInfo); bool isCardQuantityLegalForCurrentFormat(CardInfoPtr cardInfo, int quantity); void refreshCardFormatLegalities();