Cache correct providerId cards on deck load (#5668)

* 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 <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
BruebachL 2025-02-28 17:10:06 +01:00 committed by GitHub
parent 7ff43f15fc
commit 3620664a9f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 41 additions and 5 deletions

View file

@ -131,7 +131,8 @@ void AbstractTabDeckEditor::actSwapCard(CardInfoPtr info, QString zoneName)
void AbstractTabDeckEditor::setDeck(DeckLoader *_deck) void AbstractTabDeckEditor::setDeck(DeckLoader *_deck)
{ {
deckDockWidget->setDeck(_deck); deckDockWidget->setDeck(_deck);
PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(getDeckList()->getCardList())); PictureLoader::cacheCardPixmaps(
CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(getDeckList()->getCardListWithProviderId()));
setModified(false); setModified(false);
// If they load a deck, make the deck list appear // If they load a deck, make the deck list appear

View file

@ -929,8 +929,8 @@ void TabGame::eventGameStateChanged(const Event_GameStateChanged &event,
DeckViewContainer *deckViewContainer = deckViewContainers.value(playerId); DeckViewContainer *deckViewContainer = deckViewContainers.value(playerId);
if (playerInfo.has_deck_list()) { if (playerInfo.has_deck_list()) {
DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list()));
PictureLoader::cacheCardPixmaps( PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(
CardDatabaseManager::getInstance()->getCards(newDeck.getCardList())); newDeck.getCardListWithProviderId()));
deckViewContainer->setDeck(newDeck); deckViewContainer->setDeck(newDeck);
player->setDeck(newDeck); player->setDeck(newDeck);
} }

View file

@ -477,6 +477,18 @@ QList<CardInfoPtr> CardDatabase::getCards(const QStringList &cardNames) const
return cardInfos; return cardInfos;
} }
QList<CardInfoPtr> CardDatabase::getCardsByNameAndProviderId(const QMap<QString, QString> &cardNames) const
{
QList<CardInfoPtr> 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 CardInfoPtr CardDatabase::getCardByNameAndProviderId(const QString &cardName, const QString &providerId) const
{ {
auto info = getCard(cardName); auto info = getCard(cardName);

View file

@ -472,6 +472,7 @@ public:
void removeCard(CardInfoPtr card); void removeCard(CardInfoPtr card);
[[nodiscard]] CardInfoPtr getCard(const QString &cardName) const; [[nodiscard]] CardInfoPtr getCard(const QString &cardName) const;
[[nodiscard]] QList<CardInfoPtr> getCards(const QStringList &cardNames) const; [[nodiscard]] QList<CardInfoPtr> getCards(const QStringList &cardNames) const;
QList<CardInfoPtr> getCardsByNameAndProviderId(const QMap<QString, QString> &cardNames) const;
[[nodiscard]] CardInfoPtr getCardByNameAndProviderId(const QString &cardName, const QString &providerId) const; [[nodiscard]] CardInfoPtr getCardByNameAndProviderId(const QString &cardName, const QString &providerId) const;
[[nodiscard]] CardInfoPerSet getPreferredSetForCard(const QString &cardName) const; [[nodiscard]] CardInfoPerSet getPreferredSetForCard(const QString &cardName) const;
[[nodiscard]] CardInfoPerSet getSpecificSetForCard(const QString &cardName, const QString &providerId) const; [[nodiscard]] CardInfoPerSet getSpecificSetForCard(const QString &cardName, const QString &providerId) const;

View file

@ -290,8 +290,8 @@ void DeckViewContainer::deckSelectFinished(const Response &r)
{ {
const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext);
DeckLoader newDeck(QString::fromStdString(resp.deck())); DeckLoader newDeck(QString::fromStdString(resp.deck()));
// TODO CHANGE THIS TO BE SELECTED BY UUID PictureLoader::cacheCardPixmaps(
PictureLoader::cacheCardPixmaps(CardDatabaseManager::getInstance()->getCards(newDeck.getCardList())); CardDatabaseManager::getInstance()->getCardsByNameAndProviderId(newDeck.getCardListWithProviderId()));
setDeck(newDeck); setDeck(newDeck);
switchToDeckLoadedView(); switchToDeckLoadedView();
} }

View file

@ -825,6 +825,19 @@ void DeckList::getCardListHelper(InnerDecklistNode *item, QSet<QString> &result)
} }
} }
void DeckList::getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap<QString, QString> &result) const
{
for (int i = 0; i < item->size(); ++i) {
auto *node = dynamic_cast<DecklistCardNode *>(item->at(i));
if (node) {
result.insert(node->getName(), node->getCardProviderId());
} else {
getCardListWithProviderIdHelper(dynamic_cast<InnerDecklistNode *>(item->at(i)), result);
}
}
}
QStringList DeckList::getCardList() const QStringList DeckList::getCardList() const
{ {
QSet<QString> result; QSet<QString> result;
@ -832,6 +845,13 @@ QStringList DeckList::getCardList() const
return result.values(); return result.values();
} }
QMap<QString, QString> DeckList::getCardListWithProviderId() const
{
QMap<QString, QString> result;
getCardListWithProviderIdHelper(root, result);
return result;
}
int DeckList::getSideboardSize() const int DeckList::getSideboardSize() const
{ {
int size = 0; int size = 0;

View file

@ -258,6 +258,7 @@ private:
QMap<QString, SideboardPlan *> sideboardPlans; QMap<QString, SideboardPlan *> sideboardPlans;
InnerDecklistNode *root; InnerDecklistNode *root;
void getCardListHelper(InnerDecklistNode *node, QSet<QString> &result) const; void getCardListHelper(InnerDecklistNode *node, QSet<QString> &result) const;
void getCardListWithProviderIdHelper(InnerDecklistNode *item, QMap<QString, QString> &result) const;
InnerDecklistNode *getZoneObjFromName(const QString &zoneName); InnerDecklistNode *getZoneObjFromName(const QString &zoneName);
protected: protected:
@ -358,6 +359,7 @@ public:
return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty(); return root->isEmpty() && name.isEmpty() && comments.isEmpty() && sideboardPlans.isEmpty();
} }
QStringList getCardList() const; QStringList getCardList() const;
QMap<QString, QString> getCardListWithProviderId() const;
int getSideboardSize() const; int getSideboardSize() const;