From c7ca55ceb56e7a79e82fc4dea626dead2a3f19fb Mon Sep 17 00:00:00 2001 From: Zach H Date: Wed, 25 Dec 2024 23:12:06 -0500 Subject: [PATCH] Support Picking Select Art per Card Basis (#5329) --- cockatrice/CMakeLists.txt | 1 + .../printing_selector/printing_selector.cpp | 3 +++ .../printing_selector_card_display_widget.cpp | 2 ++ .../printing_selector_card_display_widget.h | 3 +++ .../printing_selector_card_overlay_widget.cpp | 23 +++++++++++++++++ .../printing_selector_card_overlay_widget.h | 3 +++ .../printing_selector_card_sorting_widget.cpp | 20 ++++++++++++++- .../printing_selector_card_sorting_widget.h | 11 ++++---- cockatrice/src/settings/cache_settings.cpp | 2 ++ cockatrice/src/settings/cache_settings.h | 6 +++++ .../src/settings/card_override_settings.cpp | 21 ++++++++++++++++ .../src/settings/card_override_settings.h | 25 +++++++++++++++++++ oracle/CMakeLists.txt | 1 + 13 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 cockatrice/src/settings/card_override_settings.cpp create mode 100644 cockatrice/src/settings/card_override_settings.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 53ff29d26..d020046d7 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -128,6 +128,7 @@ set(cockatrice_SOURCES src/settings/cache_settings.cpp src/settings/shortcuts_settings.cpp src/settings/shortcut_treeview.cpp + src/settings/card_override_settings.cpp src/client/sound_engine.cpp src/client/network/spoiler_background_updater.cpp src/game/zones/stack_zone.cpp diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp index 64b11ccfd..33f76ada7 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp @@ -171,6 +171,7 @@ void PrintingSelector::getAllSetsForCurrentCard() } else { setsToUse = filteredSets; } + setsToUse = sortToolBar->prependPinnedPrintings(setsToUse, selectedCard->getName()); // Defer widget creation currentIndex = 0; @@ -182,6 +183,8 @@ void PrintingSelector::getAllSetsForCurrentCard() setsToUse[currentIndex], currentZone); flowWidget->addWidget(cardDisplayWidget); cardDisplayWidget->clampSetNameToPicture(); + connect(cardDisplayWidget, &PrintingSelectorCardDisplayWidget::cardPreferenceChanged, this, + &PrintingSelector::updateDisplay); } // Stop timer when done diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.cpp b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.cpp index 176cc793f..6772fe224 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.cpp +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.cpp @@ -46,6 +46,8 @@ PrintingSelectorCardDisplayWidget::PrintingSelectorCardDisplayWidget(QWidget *pa // Create the overlay widget for the card display overlayWidget = new PrintingSelectorCardOverlayWidget(this, deckEditor, deckModel, deckView, cardSizeSlider, rootCard, setInfoForCard); + connect(overlayWidget, &PrintingSelectorCardOverlayWidget::cardPreferenceChanged, this, + [this]() { emit cardPreferenceChanged(); }); // Create the widget to display the set name and collector's number const QString combinedSetName = diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.h b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.h index f8b351c84..4928c82a7 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.h +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_display_widget.h @@ -35,6 +35,9 @@ public: public slots: void clampSetNameToPicture(); +signals: + void cardPreferenceChanged(); + private: QVBoxLayout *layout; SetNameAndCollectorsNumberDisplayWidget *setNameAndCollectorsNumberDisplayWidget; diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.cpp b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.cpp index b996a6aff..f94a76252 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.cpp +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.cpp @@ -1,6 +1,7 @@ #include "printing_selector_card_overlay_widget.h" #include "../../../../game/cards/card_database_manager.h" +#include "../../../../settings/cache_settings.h" #include "printing_selector_card_display_widget.h" #include @@ -165,6 +166,28 @@ void PrintingSelectorCardOverlayWidget::leaveEvent(QEvent *event) void PrintingSelectorCardOverlayWidget::customMenu(QPoint point) { QMenu menu; + + auto *preferenceMenu = new QMenu(tr("Preference")); + menu.addMenu(preferenceMenu); + + const auto &preferredProviderId = + SettingsCache::instance().cardOverrides().getCardPreferenceOverride(rootCard->getName()); + const auto &cardProviderId = setInfoForCard.getProperty("uuid"); + + if (preferredProviderId.isEmpty() || preferredProviderId != cardProviderId) { + auto *pinAction = preferenceMenu->addAction(tr("Pin Printing")); + connect(pinAction, &QAction::triggered, this, [this, cardProviderId]() { + SettingsCache::instance().cardOverrides().setCardPreferenceOverride(rootCard->getName(), cardProviderId); + emit cardPreferenceChanged(); + }); + } else { + auto *unpinAction = preferenceMenu->addAction(tr("Unpin Printing")); + connect(unpinAction, &QAction::triggered, this, [this, cardProviderId]() { + SettingsCache::instance().cardOverrides().deleteCardPreferenceOverride(rootCard->getName()); + emit cardPreferenceChanged(); + }); + } + // filling out the related cards submenu auto *relatedMenu = new QMenu(tr("Show Related cards")); menu.addMenu(relatedMenu); diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.h b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.h index 03e1b0c95..5a7c0bfa9 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.h +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_overlay_widget.h @@ -34,6 +34,9 @@ protected: void mousePressEvent(QMouseEvent *event) override; void customMenu(QPoint point); +signals: + void cardPreferenceChanged(); + private: CardInfoPictureWidget *cardInfoPicture; AllZonesCardAmountWidget *allZonesCardAmountWidget; diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp index aac777332..8fc9e0705 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.cpp @@ -74,7 +74,7 @@ void PrintingSelectorCardSortingWidget::updateSortSetting() * @param cardInfoPerSets The list of card sets to be sorted. * @return A sorted list of card sets. */ -QList PrintingSelectorCardSortingWidget::sortSets(CardInfoPerSetMap cardInfoPerSets) +QList PrintingSelectorCardSortingWidget::sortSets(const CardInfoPerSetMap &cardInfoPerSets) { QList sortedSets; @@ -148,6 +148,24 @@ QList PrintingSelectorCardSortingWidget::filterSets(const QList< return filteredSets; } +QList PrintingSelectorCardSortingWidget::prependPinnedPrintings(const QList &sets, + const QString &cardName) +{ + auto setsToUse = sets; + const auto &cardProviderId = SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardName); + if (!cardProviderId.isEmpty()) { + for (int i = 0; i < setsToUse.size(); ++i) { + const auto &card = setsToUse[i]; + if (card.getProperty("uuid") == cardProviderId) { + setsToUse.move(i, 0); + break; + } + } + } + + return setsToUse; +} + /** * @brief Prepend card printings that are contained in the deck to the list of card sets. * diff --git a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h index 6c9efa4e6..4c8d304aa 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector_card_sorting_widget.h @@ -12,11 +12,12 @@ class PrintingSelectorCardSortingWidget : public QWidget Q_OBJECT public: explicit PrintingSelectorCardSortingWidget(PrintingSelector *parent); - QList sortSets(CardInfoPerSetMap cardInfoPerSets); - static QList filterSets(const QList &sets, const QString &searchText); - static QList prependPrintingsInDeck(const QList &sets, - const CardInfoPtr &selectedCard, - DeckListModel *deckModel); + QList sortSets(const CardInfoPerSetMap &cardInfoPerSets); + QList filterSets(const QList &sets, const QString &searchText); + QList prependPinnedPrintings(const QList &sets, const QString &cardName); + QList prependPrintingsInDeck(const QList &sets, + const CardInfoPtr &selectedCard, + DeckListModel *deckModel); public slots: void updateSortOrder(); diff --git a/cockatrice/src/settings/cache_settings.cpp b/cockatrice/src/settings/cache_settings.cpp index 36259977d..204497c87 100644 --- a/cockatrice/src/settings/cache_settings.cpp +++ b/cockatrice/src/settings/cache_settings.cpp @@ -1,6 +1,7 @@ #include "cache_settings.h" #include "../client/network/release_channel.h" +#include "card_override_settings.h" #include #include @@ -179,6 +180,7 @@ SettingsCache::SettingsCache() layoutsSettings = new LayoutsSettings(settingsPath, this); downloadSettings = new DownloadSettings(settingsPath, this); recentsSettings = new RecentsSettings(settingsPath, this); + cardOverrideSettings = new CardOverrideSettings(settingsPath, this); if (!QFile(settingsPath + "global.ini").exists()) translateLegacySettings(); diff --git a/cockatrice/src/settings/cache_settings.h b/cockatrice/src/settings/cache_settings.h index 31676ac2f..19c736fbd 100644 --- a/cockatrice/src/settings/cache_settings.h +++ b/cockatrice/src/settings/cache_settings.h @@ -3,6 +3,7 @@ #include "../utility/macros.h" #include "card_database_settings.h" +#include "card_override_settings.h" #include "download_settings.h" #include "game_filters_settings.h" #include "layouts_settings.h" @@ -84,6 +85,7 @@ private: LayoutsSettings *layoutsSettings; DownloadSettings *downloadSettings; RecentsSettings *recentsSettings; + CardOverrideSettings *cardOverrideSettings; QByteArray mainWindowGeometry; QByteArray tokenDialogGeometry; @@ -604,6 +606,10 @@ public: { return *recentsSettings; } + CardOverrideSettings &cardOverrides() const + { + return *cardOverrideSettings; + } bool getIsPortableBuild() const { return isPortableBuild; diff --git a/cockatrice/src/settings/card_override_settings.cpp b/cockatrice/src/settings/card_override_settings.cpp new file mode 100644 index 000000000..0bcdcf5e5 --- /dev/null +++ b/cockatrice/src/settings/card_override_settings.cpp @@ -0,0 +1,21 @@ +#include "card_override_settings.h" + +CardOverrideSettings::CardOverrideSettings(QString settingPath, QObject *parent) + : SettingsManager(settingPath + "cardPreferenceOverrides.ini", parent) +{ +} + +void CardOverrideSettings::setCardPreferenceOverride(const QString &cardName, const QString &providerId) +{ + setValue(providerId, cardName, "cards"); +} + +void CardOverrideSettings::deleteCardPreferenceOverride(const QString &cardName) +{ + deleteValue(cardName, "cards"); +} + +QString CardOverrideSettings::getCardPreferenceOverride(const QString &cardName) +{ + return getValue(cardName, "cards").toString(); +} \ No newline at end of file diff --git a/cockatrice/src/settings/card_override_settings.h b/cockatrice/src/settings/card_override_settings.h new file mode 100644 index 000000000..1f6b08817 --- /dev/null +++ b/cockatrice/src/settings/card_override_settings.h @@ -0,0 +1,25 @@ +#ifndef COCKATRICE_CARD_OVERRIDE_SETTINGS_H +#define COCKATRICE_CARD_OVERRIDE_SETTINGS_H + +#include "settings_manager.h" + +#include + +class CardOverrideSettings : public SettingsManager +{ + Q_OBJECT + friend class SettingsCache; + +public: + void setCardPreferenceOverride(const QString &cardName, const QString &providerId); + + void deleteCardPreferenceOverride(const QString &cardName); + + QString getCardPreferenceOverride(const QString &cardName); + +private: + explicit CardOverrideSettings(QString settingPath, QObject *parent = nullptr); + CardOverrideSettings(const CardOverrideSettings & /*other*/); +}; + +#endif // COCKATRICE_CARD_OVERRIDE_SETTINGS_H diff --git a/oracle/CMakeLists.txt b/oracle/CMakeLists.txt index 27baf6014..016fad7a6 100644 --- a/oracle/CMakeLists.txt +++ b/oracle/CMakeLists.txt @@ -32,6 +32,7 @@ set(oracle_SOURCES ../cockatrice/src/settings/game_filters_settings.cpp ../cockatrice/src/settings/layouts_settings.cpp ../cockatrice/src/settings/download_settings.cpp + ../cockatrice/src/settings/card_override_settings.cpp ../cockatrice/src/client/ui/theme_manager.cpp ../cockatrice/src/client/network/release_channel.cpp ${VERSION_STRING_CPP}