diff --git a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp index 4914d927e..a79ef9ff6 100644 --- a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp @@ -3,12 +3,44 @@ #include "../../../../game/cards/card_database_manager.h" #include "../../../../game/filters/filter_tree.h" #include "../../../../game/filters/filter_tree_model.h" +#include "../../../../settings/cache_settings.h" #include #include #include #include +VisualDatabaseDisplayRecentSetFilterSettingsWidget::VisualDatabaseDisplayRecentSetFilterSettingsWidget(QWidget *parent) + : QWidget(parent) +{ + layout = new QHBoxLayout(this); + setLayout(layout); + + filterToMostRecentSetsCheckBox = new QCheckBox(this); + filterToMostRecentSetsCheckBox->setChecked( + SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsEnabled()); + connect(filterToMostRecentSetsCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), + &SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled); + + filterToMostRecentSetsAmount = new QSpinBox(this); + filterToMostRecentSetsAmount->setMinimum(1); + filterToMostRecentSetsAmount->setMaximum(100); + filterToMostRecentSetsAmount->setValue( + SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsAmount()); + connect(filterToMostRecentSetsAmount, QOverload::of(&QSpinBox::valueChanged), &SettingsCache::instance(), + &SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsAmount); + + layout->addWidget(filterToMostRecentSetsCheckBox); + layout->addWidget(filterToMostRecentSetsAmount); + + retranslateUi(); +} + +void VisualDatabaseDisplayRecentSetFilterSettingsWidget::retranslateUi() +{ + filterToMostRecentSetsCheckBox->setText(tr("Filter to most recent sets")); +} + VisualDatabaseDisplaySetFilterWidget::VisualDatabaseDisplaySetFilterWidget(QWidget *parent, FilterTreeModel *_filterModel) : QWidget(parent), filterModel(_filterModel) @@ -19,6 +51,14 @@ VisualDatabaseDisplaySetFilterWidget::VisualDatabaseDisplaySetFilterWidget(QWidg layout = new QVBoxLayout(this); setLayout(layout); + recentSetsSettingsWidget = new VisualDatabaseDisplayRecentSetFilterSettingsWidget(this); + layout->addWidget(recentSetsSettingsWidget); + + connect(&SettingsCache::instance(), &SettingsCache::visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged, this, + &VisualDatabaseDisplaySetFilterWidget::filterToRecentSets); + connect(&SettingsCache::instance(), &SettingsCache::visualDatabaseDisplayFilterToMostRecentSetsAmountChanged, this, + &VisualDatabaseDisplaySetFilterWidget::filterToRecentSets); + searchBox = new QLineEdit(this); searchBox->setPlaceholderText(tr("Search sets...")); layout->addWidget(searchBox); @@ -47,18 +87,15 @@ void VisualDatabaseDisplaySetFilterWidget::retranslateUi() void VisualDatabaseDisplaySetFilterWidget::createSetButtons() { - SetList shared_pointerses = CardDatabaseManager::getInstance()->getSetList(); + SetList allSets = CardDatabaseManager::getInstance()->getSetList(); // Sort by release date - std::sort(shared_pointerses.begin(), shared_pointerses.end(), + std::sort(allSets.begin(), allSets.end(), [](const auto &a, const auto &b) { return a->getReleaseDate() > b->getReleaseDate(); }); - int setsToPreactivate = 10; - int setsActivated = 0; - - for (const auto &shared_pointer : shared_pointerses) { - QString shortName = shared_pointer->getShortName(); - QString longName = shared_pointer->getLongName(); + for (const auto &set : allSets) { + QString shortName = set->getShortName(); + QString longName = set->getLongName(); auto *button = new QPushButton(longName + " (" + shortName + ")", flowWidget); button->setCheckable(true); @@ -69,16 +106,49 @@ void VisualDatabaseDisplaySetFilterWidget::createSetButtons() setButtons[shortName] = button; // Connect toggle signal - if (setsActivated < setsToPreactivate) { - setsActivated++; - activeSets[shortName] = true; - button->setChecked(true); - } connect(button, &QPushButton::toggled, this, [this, shortName](bool checked) { handleSetToggled(shortName, checked); }); } - updateSetFilter(); - updateSetButtonsVisibility(); // Ensure visibility is updated initially + + filterToRecentSets(); +} + +void VisualDatabaseDisplaySetFilterWidget::filterToRecentSets() +{ + if (SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsEnabled()) { + for (auto set : activeSets.keys()) { + activeSets[set] = false; + } + + SetList allSets = CardDatabaseManager::getInstance()->getSetList(); + + // Sort by release date + std::sort(allSets.begin(), allSets.end(), + [](const auto &a, const auto &b) { return a->getReleaseDate() > b->getReleaseDate(); }); + + int setsToPreactivate = SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsAmount(); + int setsActivated = 0; + + for (const auto &set : allSets) { + QString shortName = set->getShortName(); + QString longName = set->getLongName(); + + auto button = setButtons[shortName]; + + if (setsActivated < setsToPreactivate) { + setsActivated++; + activeSets[shortName] = true; + button->blockSignals(true); + button->setChecked(true); + button->blockSignals(false); + } else { + break; + } + } + + updateSetFilter(); + updateSetButtonsVisibility(); + } } void VisualDatabaseDisplaySetFilterWidget::updateSetButtonsVisibility() @@ -188,7 +258,9 @@ void VisualDatabaseDisplaySetFilterWidget::syncWithFilterModel() for (const auto &key : setButtons.keys()) { bool active = selectedSets.contains(key); activeSets[key] = active; + setButtons[key]->blockSignals(true); setButtons[key]->setChecked(active); + setButtons[key]->blockSignals(false); } } diff --git a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.h b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.h index 2e63b3fdf..9079850ca 100644 --- a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_set_filter_widget.h @@ -4,13 +4,28 @@ #include "../../../../game/filters/filter_tree_model.h" #include "../general/layout_containers/flow_widget.h" +#include #include #include #include +#include #include #include #include +class VisualDatabaseDisplayRecentSetFilterSettingsWidget : public QWidget +{ + Q_OBJECT +public: + VisualDatabaseDisplayRecentSetFilterSettingsWidget(QWidget *parent); + void retranslateUi(); + +private: + QHBoxLayout *layout; + QCheckBox *filterToMostRecentSetsCheckBox; + QSpinBox *filterToMostRecentSetsAmount; +}; + class VisualDatabaseDisplaySetFilterWidget : public QWidget { Q_OBJECT @@ -18,6 +33,7 @@ public: explicit VisualDatabaseDisplaySetFilterWidget(QWidget *parent, FilterTreeModel *filterModel); void retranslateUi(); void createSetButtons(); + void filterToRecentSets(); void updateSetButtonsVisibility(); void handleSetToggled(const QString &setShortName, bool active); @@ -29,6 +45,7 @@ private: FilterTreeModel *filterModel; QMap allMainCardTypesWithCount; QVBoxLayout *layout; + VisualDatabaseDisplayRecentSetFilterSettingsWidget *recentSetsSettingsWidget; QLineEdit *searchBox; FlowWidget *flowWidget; QPushButton *toggleButton; // Mode switch button diff --git a/cockatrice/src/settings/cache_settings.cpp b/cockatrice/src/settings/cache_settings.cpp index fd4fafe87..ba25590f3 100644 --- a/cockatrice/src/settings/cache_settings.cpp +++ b/cockatrice/src/settings/cache_settings.cpp @@ -285,6 +285,10 @@ SettingsCache::SettingsCache() visualDeckStorageInGame = settings->value("interface/visualdeckstorageingame", true).toBool(); visualDeckStorageSelectionAnimation = settings->value("interface/visualdeckstorageselectionanimation", true).toBool(); + visualDatabaseDisplayFilterToMostRecentSetsEnabled = + settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsenabled", true).toBool(); + visualDatabaseDisplayFilterToMostRecentSetsAmount = + settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsamount", 10).toInt(); horizontalHand = settings->value("hand/horizontal", true).toBool(); invertVerticalCoordinate = settings->value("table/invert_vertical", false).toBool(); minPlayersForMultiColumnLayout = settings->value("interface/min_players_multicolumn", 4).toInt(); @@ -787,6 +791,22 @@ void SettingsCache::setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T va emit visualDeckStorageSelectionAnimationChanged(visualDeckStorageSelectionAnimation); } +void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T _enabled) +{ + visualDatabaseDisplayFilterToMostRecentSetsEnabled = _enabled; + settings->setValue("interface/visualdatabasedisplayfiltertomostrecentsetsenabled", + visualDatabaseDisplayFilterToMostRecentSetsEnabled); + emit visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(visualDatabaseDisplayFilterToMostRecentSetsEnabled); +} + +void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount) +{ + visualDatabaseDisplayFilterToMostRecentSetsAmount = _amount; + settings->setValue("interface/visualdatabasedisplayfiltertomostrecentsetsamount", + visualDatabaseDisplayFilterToMostRecentSetsAmount); + emit visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(visualDatabaseDisplayFilterToMostRecentSetsAmount); +} + void SettingsCache::setHorizontalHand(QT_STATE_CHANGED_T _horizontalHand) { horizontalHand = static_cast(_horizontalHand); diff --git a/cockatrice/src/settings/cache_settings.h b/cockatrice/src/settings/cache_settings.h index 64f8cc58a..78993ce4a 100644 --- a/cockatrice/src/settings/cache_settings.h +++ b/cockatrice/src/settings/cache_settings.h @@ -71,6 +71,8 @@ signals: void visualDeckStorageUnusedColorIdentitiesOpacityChanged(bool value); void visualDeckStorageInGameChanged(bool enabled); void visualDeckStorageSelectionAnimationChanged(bool enabled); + void visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(bool enabled); + void visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(int amount); void horizontalHandChanged(); void handJustificationChanged(); void invertVerticalCoordinateChanged(); @@ -151,6 +153,8 @@ private: bool visualDeckStorageAlwaysConvert; bool visualDeckStorageInGame; bool visualDeckStorageSelectionAnimation; + bool visualDatabaseDisplayFilterToMostRecentSetsEnabled; + int visualDatabaseDisplayFilterToMostRecentSetsAmount; bool horizontalHand; bool invertVerticalCoordinate; int minPlayersForMultiColumnLayout; @@ -484,6 +488,14 @@ public: { return visualDeckStorageSelectionAnimation; } + bool getVisualDatabaseDisplayFilterToMostRecentSetsEnabled() const + { + return visualDatabaseDisplayFilterToMostRecentSetsEnabled; + } + int getVisualDatabaseDisplayFilterToMostRecentSetsAmount() const + { + return visualDatabaseDisplayFilterToMostRecentSetsAmount; + } bool getHorizontalHand() const { return horizontalHand; @@ -827,6 +839,8 @@ public slots: void setVisualDeckStorageAlwaysConvert(bool _visualDeckStorageAlwaysConvert); void setVisualDeckStorageInGame(QT_STATE_CHANGED_T value); void setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T value); + void setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T _enabled); + void setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount); void setHorizontalHand(QT_STATE_CHANGED_T _horizontalHand); void setInvertVerticalCoordinate(QT_STATE_CHANGED_T _invertVerticalCoordinate); void setMinPlayersForMultiColumnLayout(int _minPlayersForMultiColumnLayout); diff --git a/dbconverter/src/mocks.cpp b/dbconverter/src/mocks.cpp index c4e716f48..93048d3cf 100644 --- a/dbconverter/src/mocks.cpp +++ b/dbconverter/src/mocks.cpp @@ -256,6 +256,12 @@ void SettingsCache::setVisualDeckStorageInGame(QT_STATE_CHANGED_T /* value */) void SettingsCache::setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T /* value */) { } +void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T /* _enabled */) +{ +} +void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int /* _amount */) +{ +} void SettingsCache::setHorizontalHand(QT_STATE_CHANGED_T /* _horizontalHand */) { } diff --git a/tests/carddatabase/mocks.cpp b/tests/carddatabase/mocks.cpp index 35df750d3..a2ca73fb1 100644 --- a/tests/carddatabase/mocks.cpp +++ b/tests/carddatabase/mocks.cpp @@ -260,6 +260,12 @@ void SettingsCache::setVisualDeckStorageInGame(QT_STATE_CHANGED_T /* value */) void SettingsCache::setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T /* value */) { } +void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T /* _enabled */) +{ +} +void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int /* _amount */) +{ +} void SettingsCache::setHorizontalHand(QT_STATE_CHANGED_T /* _horizontalHand */) { }