From 3620664a9ff16f52405db3d344886d7462441c78 Mon Sep 17 00:00:00 2001 From: BruebachL <44814898+BruebachL@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:10:06 +0100 Subject: [PATCH] Cache correct providerId cards on deck load (#5668) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Implement new method for DeckList to return cardlist with providerId, a new carddatabase method to fetch a cardlist with name and providerId and changed PictureLoader to use providerId versions of cards for caching. --------- Co-authored-by: Lukas BrĂ¼bach --- .../client/tabs/abstract_tab_deck_editor.cpp | 3 ++- cockatrice/src/client/tabs/tab_game.cpp | 4 ++-- cockatrice/src/game/cards/card_database.cpp | 12 +++++++++++ cockatrice/src/game/cards/card_database.h | 1 + .../src/game/deckview/deck_view_container.cpp | 4 ++-- common/decklist.cpp | 20 +++++++++++++++++++ common/decklist.h | 2 ++ 7 files changed, 41 insertions(+), 5 deletions(-) diff --git a/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp b/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp index 94a5139fb..fdcbd372f 100644 --- a/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp +++ b/cockatrice/src/client/tabs/abstract_tab_deck_editor.cpp @@ -131,7 +131,8 @@ void AbstractTabDeckEditor::actSwapCard(CardInfoPtr info, QString zoneName) void AbstractTabDeckEditor::setDeck(DeckLoader *_deck) { deckDockWidget->setDeck(_deck); - PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(getDeckList()->getCardList())); + PictureLoader::cacheCardPixmaps( + CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(getDeckList()->getCardListWithProviderId())); setModified(false); // If they load a deck, make the deck list appear diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index a1cb8a938..87f92c845 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -929,8 +929,8 @@ void TabGame::eventGameStateChanged(const Event_GameStateChanged &event, DeckViewContainer *deckViewContainer = deckViewContainers.value(playerId); if (playerInfo.has_deck_list()) { DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); - PictureLoader::cacheCardPixmaps( - CardDatabaseManager::getInstance()->getCards(newDeck.getCardList())); + PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCardsByNameAndProviderId( + newDeck.getCardListWithProviderId())); deckViewContainer->setDeck(newDeck); player->setDeck(newDeck); } diff --git a/cockatrice/src/game/cards/card_database.cpp b/cockatrice/src/game/cards/card_database.cpp index d1e9eea31..c7e2f06f2 100644 --- a/cockatrice/src/game/cards/card_database.cpp +++ b/cockatrice/src/game/cards/card_database.cpp @@ -477,6 +477,18 @@ QList CardDatabase::getCards(const QStringList &cardNames) const return cardInfos; } +QList CardDatabase::getCardsByNameAndProviderId(const QMap &cardNames) const +{ + QList cardInfos; + for (const QString &cardName : cardNames) { + CardInfoPtr ptr = getCardByNameAndProviderId(cardName, cardNames[cardName]); + if (ptr) + cardInfos.append(ptr); + } + + return cardInfos; +} + CardInfoPtr CardDatabase::getCardByNameAndProviderId(const QString &cardName, const QString &providerId) const { auto info = getCard(cardName); diff --git a/cockatrice/src/game/cards/card_database.h b/cockatrice/src/game/cards/card_database.h index 74918939a..12b4a06fe 100644 --- a/cockatrice/src/game/cards/card_database.h +++ b/cockatrice/src/game/cards/card_database.h @@ -472,6 +472,7 @@ public: void removeCard(CardInfoPtr card); [[nodiscard]] CardInfoPtr getCard(const QString &cardName) const; [[nodiscard]] QList getCards(const QStringList &cardNames) const; + QList getCardsByNameAndProviderId(const QMap &cardNames) const; [[nodiscard]] CardInfoPtr getCardByNameAndProviderId(const QString &cardName, const QString &providerId) const; [[nodiscard]] CardInfoPerSet getPreferredSetForCard(const QString &cardName) const; [[nodiscard]] CardInfoPerSet getSpecificSetForCard(const QString &cardName, const QString &providerId) const; diff --git a/cockatrice/src/game/deckview/deck_view_container.cpp b/cockatrice/src/game/deckview/deck_view_container.cpp index 40473e66c..032e8a3c8 100644 --- a/cockatrice/src/game/deckview/deck_view_container.cpp +++ b/cockatrice/src/game/deckview/deck_view_container.cpp @@ -290,8 +290,8 @@ void DeckViewContainer::deckSelectFinished(const Response &r) { const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); DeckLoader newDeck(QString::fromStdString(resp.deck())); - // TODO CHANGE THIS TO BE SELECTED BY UUID - PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(newDeck.getCardList())); + PictureLoader::cacheCardPixmaps( + CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(newDeck.getCardListWithProviderId())); setDeck(newDeck); switchToDeckLoadedView(); } diff --git a/common/decklist.cpp b/common/decklist.cpp index d395accff..708912a29 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -825,6 +825,19 @@ void DeckList::getCardListHelper(InnerDecklistNode *item, QSet &result) } } +void DeckList::getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap &result) const +{ + for (int i = 0; i < item->size(); ++i) { + auto *node = dynamic_cast(item->at(i)); + + if (node) { + result.insert(node->getName(), node->getCardProviderId()); + } else { + getCardListWithProviderIdHelper(dynamic_cast(item->at(i)), result); + } + } +} + QStringList DeckList::getCardList() const { QSet result; @@ -832,6 +845,13 @@ QStringList DeckList::getCardList() const return result.values(); } +QMap DeckList::getCardListWithProviderId() const +{ + QMap result; + getCardListWithProviderIdHelper(root, result); + return result; +} + int DeckList::getSideboardSize() const { int size = 0; diff --git a/common/decklist.h b/common/decklist.h index a48f152e8..9c291cfba 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -258,6 +258,7 @@ private: QMap sideboardPlans; InnerDecklistNode *root; void getCardListHelper(InnerDecklistNode *node, QSet &result) const; + void getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap &result) const; InnerDecklistNode *getZoneObjFromName(const QString &zoneName); protected: @@ -358,6 +359,7 @@ public: return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty(); } QStringList getCardList() const; + QMap getCardListWithProviderId() const; int getSideboardSize() const;