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 facf0c98b..93286191f 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 @@ -386,15 +386,15 @@ void DeckEditorDeckDockWidget::updateBannerCardComboBox() // Collect unique (name, providerId) pairs QSet> bannerCardSet; - QList cardsInDeck = deckModel->getDeckList()->getCardNodes(); + QList cardsInDeck = deckModel->getCardRefs(); - for (auto currentCard : cardsInDeck) { - if (!CardDatabaseManager::query()->getCard(currentCard->toCardRef())) { + for (auto cardRef : cardsInDeck) { + if (!CardDatabaseManager::query()->getCard(cardRef)) { continue; } // Insert one entry per distinct card, ignore copies - bannerCardSet.insert({currentCard->getName(), currentCard->getCardProviderId()}); + bannerCardSet.insert({cardRef.name, cardRef.providerId}); } // Convert to sorted list 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 52768e0e7..656abbfdc 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 @@ -178,7 +178,7 @@ void DlgSelectSetForCards::actOK() void DlgSelectSetForCards::actClear() { emit deckAboutToBeModified(tr("Cleared all printing information.")); - model->getDeckList()->forEachCard(CardNodeFunction::ClearPrintingData()); + model->forEachCard(CardNodeFunction::ClearPrintingData()); emit deckModified(); accept(); } @@ -186,8 +186,8 @@ void DlgSelectSetForCards::actClear() void DlgSelectSetForCards::actSetAllToPreferred() { emit deckAboutToBeModified(tr("Set all printings to preferred.")); - model->getDeckList()->forEachCard(CardNodeFunction::ClearPrintingData()); - model->getDeckList()->forEachCard(CardNodeFunction::SetProviderIdToPreferred()); + model->forEachCard(CardNodeFunction::ClearPrintingData()); + model->forEachCard(CardNodeFunction::SetProviderIdToPreferred()); emit deckModified(); accept(); } diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_display_widget.cpp b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_display_widget.cpp index ef29a1732..288cdc425 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_display_widget.cpp +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_display_widget.cpp @@ -70,9 +70,7 @@ ArchidektApiResponseDeckDisplayWidget::ArchidektApiResponseDeckDisplayWidget(QWi connect(model, &DeckListModel::modelReset, this, &ArchidektApiResponseDeckDisplayWidget::decklistModelReset); model->getDeckList()->loadFromStream_Plain(deckStream, false); - model->getDeckList()->forEachCard(CardNodeFunction::ResolveProviderId()); - - model->rebuildTree(); + model->forEachCard(CardNodeFunction::ResolveProviderId()); retranslateUi(); } 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 8859a31fe..5fd4d71e8 100644 --- a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp +++ b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.cpp @@ -561,6 +561,11 @@ void DeckListModel::setDeckList(DeckList *_deck) rebuildTree(); } +void DeckListModel::forEachCard(const std::function &func) +{ + deckList->forEachCard(func); +} + static QList cardNodesToExactCards(QList nodes) { QList cards; @@ -600,6 +605,17 @@ QList DeckListModel::getCardNames() const return names; } +QList DeckListModel::getCardRefs() const +{ + auto nodes = deckList->getCardNodes(); + + QList cardRefs; + std::transform(nodes.cbegin(), nodes.cend(), std::back_inserter(cardRefs), + [](auto node) { return node->toCardRef(); }); + + return cardRefs; +} + QList DeckListModel::getZones() const { auto zoneNodes = deckList->getZoneNodes(); 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 6e8882084..80a519297 100644 --- a/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h +++ b/libcockatrice_models/libcockatrice/models/deck_list/deck_list_model.h @@ -309,6 +309,13 @@ public: } void setDeckList(DeckList *_deck); + /** + * @brief Apply a function to every card in the deck tree. + * + * @param func Function taking (zone node, card node). + */ + void forEachCard(const std::function &func); + /** * @brief Creates a list consisting of the entries of the model mapped into ExactCards (with each entry looked up * in the card database). @@ -323,6 +330,10 @@ public: * @brief Gets a deduplicated list of all card names that appear in the model */ [[nodiscard]] QList getCardNames() const; + /** + * @brief Gets a deduplicated list of all CardRefs that appear in the model + */ + [[nodiscard]] QList getCardRefs() const; /** * @brief Gets a list of all zone names that appear in the model */