From 3ccb0cbb23d28d352f0a31f00d70588916a16815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sun, 14 Sep 2025 15:45:26 +0200 Subject: [PATCH] Have CardDatabase::getPreferredPrintingInfo respect card provider ID overrides (pinned printings) Took 13 minutes Took 37 seconds Took 10 seconds Took 10 seconds # Commit time for manual adjustment: # Took 30 seconds Took 15 seconds Took 8 minutes Took 21 seconds --- .../interface_card_preference_provider.h | 13 +++++++++++ .../interface/noop_card_preference_provider.h | 14 +++++++++++ .../settings_card_preference_provider.h | 15 ++++++++++++ .../src/game/dialogs/dlg_create_token.cpp | 11 +-------- .../deck_editor_database_display_widget.cpp | 18 ++------------- .../deck_editor_database_display_widget.h | 1 - dbconverter/src/main.h | 8 +++++++ .../card/database/card_database.cpp | 5 ++-- .../card/database/card_database.h | 3 ++- .../card/database/card_database_manager.cpp | 3 ++- .../card/database/card_database_querier.cpp | 23 ++++++++++++++++++- .../card/database/card_database_querier.h | 9 +++++++- tests/carddatabase/filter_string_test.cpp | 12 ++++++---- 13 files changed, 97 insertions(+), 38 deletions(-) create mode 100644 cockatrice/src/database/interface/interface_card_preference_provider.h create mode 100644 cockatrice/src/database/interface/noop_card_preference_provider.h create mode 100644 cockatrice/src/database/interface/settings_card_preference_provider.h diff --git a/cockatrice/src/database/interface/interface_card_preference_provider.h b/cockatrice/src/database/interface/interface_card_preference_provider.h new file mode 100644 index 000000000..ea599f5e8 --- /dev/null +++ b/cockatrice/src/database/interface/interface_card_preference_provider.h @@ -0,0 +1,13 @@ +#ifndef COCKATRICE_INTERFACE_CARD_PREFERENCE_PROVIDER_H +#define COCKATRICE_INTERFACE_CARD_PREFERENCE_PROVIDER_H + +#include + +class ICardPreferenceProvider +{ +public: + virtual ~ICardPreferenceProvider() = default; + virtual QString getCardPreferenceOverride(const QString &cardName) const = 0; +}; + +#endif // COCKATRICE_INTERFACE_CARD_PREFERENCE_PROVIDER_H diff --git a/cockatrice/src/database/interface/noop_card_preference_provider.h b/cockatrice/src/database/interface/noop_card_preference_provider.h new file mode 100644 index 000000000..6e4bf7d73 --- /dev/null +++ b/cockatrice/src/database/interface/noop_card_preference_provider.h @@ -0,0 +1,14 @@ +#ifndef COCKATRICE_NOOP_CARD_PREFERENCE_PROVIDER_H +#define COCKATRICE_NOOP_CARD_PREFERENCE_PROVIDER_H +#include "interface_card_preference_provider.h" + +class NoopCardPreferenceProvider : public ICardPreferenceProvider +{ +public: + QString getCardPreferenceOverride(const QString &) const override + { + return {}; + } +}; + +#endif // COCKATRICE_NOOP_CARD_PREFERENCE_PROVIDER_H diff --git a/cockatrice/src/database/interface/settings_card_preference_provider.h b/cockatrice/src/database/interface/settings_card_preference_provider.h new file mode 100644 index 000000000..fa1ff04f4 --- /dev/null +++ b/cockatrice/src/database/interface/settings_card_preference_provider.h @@ -0,0 +1,15 @@ +#ifndef COCKATRICE_SETTINGS_CARD_PREFERENCE_PROVIDER_H +#define COCKATRICE_SETTINGS_CARD_PREFERENCE_PROVIDER_H +#include "../../settings/cache_settings.h" +#include "interface_card_preference_provider.h" + +class SettingsCardPreferenceProvider : public ICardPreferenceProvider +{ +public: + QString getCardPreferenceOverride(const QString &cardName) const override + { + return SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardName); + } +}; + +#endif // COCKATRICE_SETTINGS_CARD_PREFERENCE_PROVIDER_H diff --git a/cockatrice/src/game/dialogs/dlg_create_token.cpp b/cockatrice/src/game/dialogs/dlg_create_token.cpp index d2002b6e0..c4898b910 100644 --- a/cockatrice/src/game/dialogs/dlg_create_token.cpp +++ b/cockatrice/src/game/dialogs/dlg_create_token.cpp @@ -199,16 +199,7 @@ void DlgCreateToken::tokenSelectionChanged(const QModelIndex ¤t, const QMo annotationEdit->setText(""); } - const auto &cardProviderId = - SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardInfo->getName()); - if (!cardProviderId.isEmpty()) { - CardRef ref; - ref.name = cardInfo->getName(); - ref.providerId = cardProviderId; - pic->setCard(CardDatabaseManager::query()->getCard(ref)); - } else { - pic->setCard(CardDatabaseManager::query()->getPreferredCard(cardInfo)); - } + pic->setCard(CardDatabaseManager::query()->getPreferredCard(cardInfo)); } void DlgCreateToken::updateSearchFieldWithoutUpdatingFilter(const QString &newValue) const diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp index 4695eda0b..947d522f1 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.cpp @@ -143,7 +143,7 @@ void DeckEditorDatabaseDisplayWidget::updateCard(const QModelIndex ¤t, con } if (!current.model()->hasChildren(current.sibling(current.row(), 0))) { - emit cardChanged(getCardOrPinnedPrinting(cardName)); + emit cardChanged(CardDatabaseManager::query()->getPreferredCard(cardName)); } } @@ -176,21 +176,7 @@ ExactCard DeckEditorDatabaseDisplayWidget::currentCard() const const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString(); - return getCardOrPinnedPrinting(cardName); -} - -ExactCard DeckEditorDatabaseDisplayWidget::getCardOrPinnedPrinting(QString cardName) const -{ - const auto &cardProviderId = SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardName); - - ExactCard card = CardDatabaseManager::query()->getCard({cardName}); - - if (cardProviderId != "") { - return ExactCard(card.getCardPtr(), - CardDatabaseManager::query()->getSpecificPrinting({cardName, cardProviderId})); - } - - return card; + return CardDatabaseManager::query()->getPreferredCard(cardName); } void DeckEditorDatabaseDisplayWidget::databaseCustomMenu(QPoint point) diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.h b/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.h index 0add31322..efac97eae 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.h +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_database_display_widget.h @@ -31,7 +31,6 @@ public: public slots: ExactCard currentCard() const; - ExactCard getCardOrPinnedPrinting(QString cardName) const; void setFilterTree(FilterTree *filterTree); void clearAllDatabaseFilters(); diff --git a/dbconverter/src/main.h b/dbconverter/src/main.h index 1fa1335d0..079f3ebf7 100644 --- a/dbconverter/src/main.h +++ b/dbconverter/src/main.h @@ -2,11 +2,19 @@ #define MAIN_H #include +#include #include class CardDatabaseConverter : public CardDatabase { public: + explicit CardDatabaseConverter() + { + // Replace querier with one that ignores SettingsCache + delete querier; + querier = new CardDatabaseQuerier(this, this, QSharedPointer::create()); + }; + LoadStatus loadCardDatabase(const QString &path) { return loader->loadCardDatabase(path); diff --git a/libcockatrice_card/libcockatrice/card/database/card_database.cpp b/libcockatrice_card/libcockatrice/card/database/card_database.cpp index 6ff5fe02c..bd43c68fe 100644 --- a/libcockatrice_card/libcockatrice/card/database/card_database.cpp +++ b/libcockatrice_card/libcockatrice/card/database/card_database.cpp @@ -15,7 +15,8 @@ #include #include -CardDatabase::CardDatabase(QObject *parent) : QObject(parent), loadStatus(NotLoaded) +CardDatabase::CardDatabase(QObject *parent, QSharedPointer prefs) + : QObject(parent), loadStatus(NotLoaded) { qRegisterMetaType("CardInfoPtr"); qRegisterMetaType("CardSetPtr"); @@ -28,7 +29,7 @@ CardDatabase::CardDatabase(QObject *parent) : QObject(parent), loadStatus(NotLoa connect(loader, &CardDatabaseLoader::newSetsFound, this, &CardDatabase::cardDatabaseNewSetsFound); connect(loader, &CardDatabaseLoader::allNewSetsEnabled, this, &CardDatabase::cardDatabaseAllNewSetsEnabled); - querier = new CardDatabaseQuerier(this, this); + querier = new CardDatabaseQuerier(this, this, prefs); } CardDatabase::~CardDatabase() diff --git a/libcockatrice_card/libcockatrice/card/database/card_database.h b/libcockatrice_card/libcockatrice/card/database/card_database.h index 8c7a78ffe..8ebf855c7 100644 --- a/libcockatrice_card/libcockatrice/card/database/card_database.h +++ b/libcockatrice_card/libcockatrice/card/database/card_database.h @@ -10,6 +10,7 @@ #include "../set/card_set_list.h" #include "card_database_loader.h" #include "card_database_querier.h" +#include "interface/noop_card_preference_provider.h" #include #include @@ -57,7 +58,7 @@ private: *removeCardMutex = new QBasicMutex(); public: - explicit CardDatabase(QObject *parent = nullptr); + explicit CardDatabase(QObject *parent = nullptr, QSharedPointer prefs = nullptr); ~CardDatabase() override; void removeCard(CardInfoPtr card); diff --git a/libcockatrice_card/libcockatrice/card/database/card_database_manager.cpp b/libcockatrice_card/libcockatrice/card/database/card_database_manager.cpp index 4ffe0cc70..782da0133 100644 --- a/libcockatrice_card/libcockatrice/card/database/card_database_manager.cpp +++ b/libcockatrice_card/libcockatrice/card/database/card_database_manager.cpp @@ -2,7 +2,8 @@ CardDatabase *CardDatabaseManager::getInstance() { - static CardDatabase instance; // Created only once, on first access + static CardDatabase instance( + nullptr, QSharedPointer::create()); // Created only once, on first access return &instance; } diff --git a/libcockatrice_card/libcockatrice/card/database/card_database_querier.cpp b/libcockatrice_card/libcockatrice/card/database/card_database_querier.cpp index f422c51f9..13bfb6b54 100644 --- a/libcockatrice_card/libcockatrice/card/database/card_database_querier.cpp +++ b/libcockatrice_card/libcockatrice/card/database/card_database_querier.cpp @@ -4,10 +4,14 @@ #include "../printing/exact_card.h" #include "../set/card_set_comparator.h" #include "card_database.h" +#include "interface/settings_card_preference_provider.h" #include -CardDatabaseQuerier::CardDatabaseQuerier(QObject *_parent, const CardDatabase *_db) : QObject(_parent), db(_db) +CardDatabaseQuerier::CardDatabaseQuerier(QObject *_parent, + const CardDatabase *_db, + const QSharedPointer &prefs) + : QObject(_parent), db(_db), prefs(prefs) { } @@ -204,6 +208,17 @@ PrintingInfo CardDatabaseQuerier::getSpecificPrinting(const QString &cardName, return PrintingInfo(nullptr); } +/** + * Gets the card representing the preferred printing of the cardInfo + * + * @param cardName The cardName to find the preferred card and printing for + * @return A specific printing of a card + */ +ExactCard CardDatabaseQuerier::getPreferredCard(const QString &cardName) const +{ + return getPreferredCard(getCardInfo(cardName)); +} + /** * Gets the card representing the preferred printing of the cardInfo * @@ -236,6 +251,12 @@ PrintingInfo CardDatabaseQuerier::getPreferredPrinting(const CardInfoPtr &cardIn return PrintingInfo(nullptr); } + const auto &pinnedPrintingProviderId = prefs->getCardPreferenceOverride(cardInfo->getName()); + + if (!pinnedPrintingProviderId.isEmpty()) { + return getSpecificPrinting({cardInfo->getName(), pinnedPrintingProviderId}); + } + SetToPrintingsMap setMap = cardInfo->getSets(); if (setMap.empty()) { return PrintingInfo(nullptr); diff --git a/libcockatrice_card/libcockatrice/card/database/card_database_querier.h b/libcockatrice_card/libcockatrice/card/database/card_database_querier.h index cb440706b..5d4ce7d37 100644 --- a/libcockatrice_card/libcockatrice/card/database/card_database_querier.h +++ b/libcockatrice_card/libcockatrice/card/database/card_database_querier.h @@ -9,6 +9,8 @@ #include "../card_info.h" #include "../printing/exact_card.h" +#include "interface/interface_card_preference_provider.h" +#include "interface/settings_card_preference_provider.h" #include #include @@ -19,7 +21,9 @@ class CardDatabaseQuerier : public QObject Q_OBJECT public: - explicit CardDatabaseQuerier(QObject *parent, const CardDatabase *db); + explicit CardDatabaseQuerier(QObject *parent, + const CardDatabase *db, + const QSharedPointer &prefs); [[nodiscard]] CardInfoPtr getCardInfo(const QString &cardName) const; [[nodiscard]] QList getCardInfos(const QStringList &cardNames) const; @@ -46,6 +50,7 @@ public: [[nodiscard]] PrintingInfo getSpecificPrinting(const CardRef &cardRef) const; [[nodiscard]] PrintingInfo getSpecificPrinting(const QString &cardName, const QString &setCode, const QString &collectorNumber) const; + ExactCard getPreferredCard(const QString &cardName) const; [[nodiscard]] PrintingInfo findPrintingWithId(const CardInfoPtr &card, const QString &providerId) const; [[nodiscard]] QStringList getAllMainCardTypes() const; @@ -55,6 +60,8 @@ public: private: const CardDatabase *db; + QSharedPointer prefs; + CardInfoPtr lookupCardByName(const QString &name) const; }; diff --git a/tests/carddatabase/filter_string_test.cpp b/tests/carddatabase/filter_string_test.cpp index f0c7d9768..46a110b3a 100644 --- a/tests/carddatabase/filter_string_test.cpp +++ b/tests/carddatabase/filter_string_test.cpp @@ -18,10 +18,13 @@ class CardQuery : public ::testing::Test protected: void SetUp() override { - cat = CardDatabaseManager::query()->getCardBySimpleName("Cat"); - notDeadAfterAll = CardDatabaseManager::query()->getCardBySimpleName("Not Dead"); - truth = CardDatabaseManager::query()->getCardBySimpleName("Truth"); - doctor = CardDatabaseManager::query()->getCardBySimpleName("Doctor"); + CardDatabase *db = new CardDatabase(nullptr, QSharedPointer::create()); + db->loadCardDatabases(); + + cat = db->query()->getCardBySimpleName("Cat"); + notDeadAfterAll = db->query()->getCardBySimpleName("Not Dead"); + truth = db->query()->getCardBySimpleName("Truth"); + doctor = db->query()->getCardBySimpleName("Doctor"); } // void TearDown() override {} @@ -70,7 +73,6 @@ QUERY(Color4, cat, "c!gw", false) int main(int argc, char **argv) { settingsCache = new SettingsCache; - CardDatabaseManager::getInstance()->loadCardDatabases(); ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();