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..6439b5023 100644 --- a/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp +++ b/cockatrice/src/client/ui/widgets/printing_selector/printing_selector.cpp @@ -172,6 +172,19 @@ void PrintingSelector::getAllSetsForCurrentCard() setsToUse = filteredSets; } + const auto &cardProviderId = + SettingsCache::instance().cardOverrides().getCardPreferenceOverride(selectedCard->getName()); + if (!cardProviderId.isEmpty()) { + for (int i = 0; i < setsToUse.size(); ++i) { + const auto &card = setsToUse[i]; + if (card.getProperty("uuid") == cardProviderId) { + setsToUse.prepend(card); + setsToUse.removeAt(i + 1); + break; + } + } + } + // Defer widget creation currentIndex = 0; @@ -182,6 +195,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..64f8b120c 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,29 @@ void PrintingSelectorCardOverlayWidget::leaveEvent(QEvent *event) void PrintingSelectorCardOverlayWidget::customMenu(QPoint point) { QMenu menu; + + auto *preferenceMenu = new QMenu(tr("Preference")); + menu.addMenu(preferenceMenu); + QString preferredProviderId = + SettingsCache::instance().cardOverrides().getCardPreferenceOverride(rootCard->getName()); + + const auto &cardProviderId = setInfoForCard.getProperty("uuid"); + + if (preferredProviderId.isEmpty() || preferredProviderId != cardProviderId) { + QAction *setPreferred = preferenceMenu->addAction(tr("Set as preferred printing")); + connect(setPreferred, &QAction::triggered, this, [this, cardProviderId]() { + SettingsCache::instance().cardOverrides().setCardPreferenceOverride(rootCard->getName(), cardProviderId, + true); + emit cardPreferenceChanged(); + }); + } else { + QAction *setUnpreferred = preferenceMenu->addAction(tr("Unset as preferred printing")); + connect(setUnpreferred, &QAction::triggered, this, [this]() { + SettingsCache::instance().cardOverrides().setCardPreferenceOverride(rootCard->getName(), "", false); + 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/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..3d5b62f59 --- /dev/null +++ b/cockatrice/src/settings/card_override_settings.cpp @@ -0,0 +1,20 @@ +#include "card_override_settings.h" + +CardOverrideSettings::CardOverrideSettings(QString settingPath, QObject *parent) + : SettingsManager(settingPath + "cardPreferenceOverrides.ini", parent) +{ +} + +void CardOverrideSettings::setCardPreferenceOverride(QString cardName, QString providerId, bool enabled) +{ + if (enabled) { + setValue(providerId, cardName, "cards"); + } else { + deleteValue(providerId, cardName, "cards"); + } +} + +QString CardOverrideSettings::getCardPreferenceOverride(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..9f0c489eb --- /dev/null +++ b/cockatrice/src/settings/card_override_settings.h @@ -0,0 +1,23 @@ +#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(QString cardName, QString providerId, bool enabled); + + QString getCardPreferenceOverride(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}