From a4eef648bca7d45a89d470eec459a3eb702e9945 Mon Sep 17 00:00:00 2001 From: BruebachL <44814898+BruebachL@users.noreply.github.com> Date: Wed, 14 Jan 2026 11:56:09 +0100 Subject: [PATCH] [VDD] Move main type and format filter to quick settings (#6511) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [VDD] Reorder quick filters Took 1 hour 10 minutes Took 5 seconds Took 49 seconds * [VDD] Use Font Awesome Icons Took 49 minutes Took 5 seconds * [VDD] Shuffle some widgets around, label things. Took 31 minutes Took 5 seconds * Change buttons to be push rather than toggle. Took 17 minutes Took 9 seconds * Reduce margins, retranslate button texts. Took 15 minutes Took 9 seconds * Actually do it, don't commit the commented out testing version lol Took 3 minutes * Start sets in include, correct subtype include/exact match logic. Took 12 minutes * Block sync. Took 16 minutes Took 8 seconds --------- Co-authored-by: Lukas BrĂ¼bach --- cockatrice/CMakeLists.txt | 2 + cockatrice/cockatrice.qrc | 7 + .../resources/icons/circle_half_stroke.svg | 1 + cockatrice/resources/icons/dragon.svg | 1 + cockatrice/resources/icons/floppy_disk.svg | 1 + cockatrice/resources/icons/gear.svg | 1 + cockatrice/resources/icons/pen_to_square.svg | 1 + cockatrice/resources/icons/scale_balanced.svg | 1 + cockatrice/resources/icons/scroll.svg | 1 + .../quick_settings/settings_button_widget.cpp | 16 ++- .../quick_settings/settings_button_widget.h | 1 + ...l_database_display_color_filter_widget.cpp | 56 ++++---- ...ual_database_display_color_filter_widget.h | 6 +- ...database_display_filter_toolbar_widget.cpp | 135 ++++++++++++++++++ ...l_database_display_filter_toolbar_widget.h | 48 +++++++ ..._display_format_legality_filter_widget.cpp | 40 ++++-- ...se_display_format_legality_filter_widget.h | 11 +- ...tabase_display_main_type_filter_widget.cpp | 36 +++-- ...database_display_main_type_filter_widget.h | 11 +- ...ual_database_display_set_filter_widget.cpp | 31 ++-- ...isual_database_display_set_filter_widget.h | 4 +- ...atabase_display_sub_type_filter_widget.cpp | 47 +++--- ..._database_display_sub_type_filter_widget.h | 9 +- .../visual_database_display_widget.cpp | 108 +------------- .../visual_database_display_widget.h | 41 +++--- 25 files changed, 392 insertions(+), 224 deletions(-) create mode 100644 cockatrice/resources/icons/circle_half_stroke.svg create mode 100644 cockatrice/resources/icons/dragon.svg create mode 100644 cockatrice/resources/icons/floppy_disk.svg create mode 100644 cockatrice/resources/icons/gear.svg create mode 100644 cockatrice/resources/icons/pen_to_square.svg create mode 100644 cockatrice/resources/icons/scale_balanced.svg create mode 100644 cockatrice/resources/icons/scroll.svg create mode 100644 cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp create mode 100644 cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 85e1cd00f..fb57bf7e0 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -317,6 +317,8 @@ set(cockatrice_SOURCES src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_bracket_navigation_widget.h src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_budget_navigation_widget.cpp src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_budget_navigation_widget.h + src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp + src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.h ) add_subdirectory(sounds) diff --git a/cockatrice/cockatrice.qrc b/cockatrice/cockatrice.qrc index 0f7bca2f1..6e90d342d 100644 --- a/cockatrice/cockatrice.qrc +++ b/cockatrice/cockatrice.qrc @@ -15,18 +15,23 @@ resources/icons/arrow_top_green.svg resources/icons/arrow_up_green.svg resources/icons/arrow_undo.svg + resources/icons/circle_half_stroke.svg resources/icons/clearsearch.svg resources/icons/cogwheel.svg resources/icons/conceded.svg resources/icons/decrement.svg resources/icons/delete.svg + resources/icons/dragon.svg resources/icons/dropdown_collapsed.svg resources/icons/dropdown_expanded.svg + resources/icons/floppy_disk.svg resources/icons/forgot_password.svg + resources/icons/gear.svg resources/icons/increment.svg resources/icons/info.svg resources/icons/lock.svg resources/icons/not_ready_start.svg + resources/icons/pen_to_square.svg resources/icons/pencil.svg resources/icons/pin.svg resources/icons/player.svg @@ -34,7 +39,9 @@ resources/icons/reload.svg resources/icons/remove_row.svg resources/icons/rename.svg + resources/icons/scale_balanced.svg resources/icons/scales.svg + resources/icons/scroll.svg resources/icons/search.svg resources/icons/settings.svg resources/icons/share.svg diff --git a/cockatrice/resources/icons/circle_half_stroke.svg b/cockatrice/resources/icons/circle_half_stroke.svg new file mode 100644 index 000000000..42e4dbca2 --- /dev/null +++ b/cockatrice/resources/icons/circle_half_stroke.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cockatrice/resources/icons/dragon.svg b/cockatrice/resources/icons/dragon.svg new file mode 100644 index 000000000..f45af39ef --- /dev/null +++ b/cockatrice/resources/icons/dragon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cockatrice/resources/icons/floppy_disk.svg b/cockatrice/resources/icons/floppy_disk.svg new file mode 100644 index 000000000..3c5b5054d --- /dev/null +++ b/cockatrice/resources/icons/floppy_disk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cockatrice/resources/icons/gear.svg b/cockatrice/resources/icons/gear.svg new file mode 100644 index 000000000..fdee3a297 --- /dev/null +++ b/cockatrice/resources/icons/gear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cockatrice/resources/icons/pen_to_square.svg b/cockatrice/resources/icons/pen_to_square.svg new file mode 100644 index 000000000..60ff1d9c4 --- /dev/null +++ b/cockatrice/resources/icons/pen_to_square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cockatrice/resources/icons/scale_balanced.svg b/cockatrice/resources/icons/scale_balanced.svg new file mode 100644 index 000000000..fae468d38 --- /dev/null +++ b/cockatrice/resources/icons/scale_balanced.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cockatrice/resources/icons/scroll.svg b/cockatrice/resources/icons/scroll.svg new file mode 100644 index 000000000..f4828e679 --- /dev/null +++ b/cockatrice/resources/icons/scroll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.cpp b/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.cpp index 17087c8bc..57dfba800 100644 --- a/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.cpp +++ b/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.cpp @@ -8,7 +8,6 @@ SettingsButtonWidget::SettingsButtonWidget(QWidget *parent) : QWidget(parent), button(new QToolButton(this)), popup(new SettingsPopupWidget(nullptr)) { - button->setIcon(QPixmap("theme:icons/cogwheel")); button->setCheckable(true); button->setFixedSize(32, 32); @@ -36,6 +35,21 @@ void SettingsButtonWidget::setButtonIcon(QPixmap iconMap) button->setIcon(iconMap); } +void SettingsButtonWidget::setButtonText(const QString &buttonText) +{ + // đŸ”“ unlock size constraints + button->setMinimumSize(QSize()); + button->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)); + + button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + button->setText(buttonText); + + button->setFixedHeight(32); + button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + + button->setMinimumWidth(button->sizeHint().width()); +} + void SettingsButtonWidget::togglePopup() { if (popup->isVisible()) { diff --git a/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.h b/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.h index d93078126..36f01ac38 100644 --- a/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.h +++ b/cockatrice/src/interface/widgets/quick_settings/settings_button_widget.h @@ -22,6 +22,7 @@ public: void addSettingsWidget(QWidget *toAdd) const; void removeSettingsWidget(QWidget *toRemove) const; void setButtonIcon(QPixmap iconMap); + void setButtonText(const QString &buttonText); protected: void mousePressEvent(QMouseEvent *event) override; diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.cpp index 3ca709071..57c6da762 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.cpp @@ -31,12 +31,12 @@ VisualDatabaseDisplayColorFilterWidget::VisualDatabaseDisplayColorFilterWidget(Q &VisualDatabaseDisplayColorFilterWidget::handleColorToggled); } - toggleButton = new QPushButton(this); - toggleButton->setCheckable(true); - layout->addWidget(toggleButton); + modeComboBox = new QComboBox(this); + layout->addWidget(modeComboBox); + + connect(modeComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, + &VisualDatabaseDisplayColorFilterWidget::updateFilterMode); - // Connect the button's toggled signal - connect(toggleButton, &QPushButton::toggled, this, &VisualDatabaseDisplayColorFilterWidget::updateFilterMode); connect(filterModel, &FilterTreeModel::layoutChanged, this, [this]() { QTimer::singleShot(100, this, &VisualDatabaseDisplayColorFilterWidget::syncWithFilterModel); }); @@ -46,19 +46,22 @@ VisualDatabaseDisplayColorFilterWidget::VisualDatabaseDisplayColorFilterWidget(Q void VisualDatabaseDisplayColorFilterWidget::retranslateUi() { - switch (currentMode) { - case FilterMode::ExactMatch: - toggleButton->setText(tr("Mode: Exact Match")); - break; - case FilterMode::Includes: - toggleButton->setText(tr("Mode: Includes")); - break; - case FilterMode::IncludeExclude: - toggleButton->setText(tr("Mode: Include/Exclude")); - break; + modeComboBox->blockSignals(true); + modeComboBox->clear(); + + modeComboBox->addItem(tr("Exact match"), QVariant::fromValue(FilterMode::ExactMatch)); + modeComboBox->addItem(tr("Includes"), QVariant::fromValue(FilterMode::Includes)); + modeComboBox->addItem(tr("Include / Exclude"), QVariant::fromValue(FilterMode::IncludeExclude)); + + modeComboBox->setToolTip(tr("How selected and unselected colors are combined in the filter")); + + // Restore current mode + const int index = modeComboBox->findData(QVariant::fromValue(currentMode)); + if (index >= 0) { + modeComboBox->setCurrentIndex(index); } - toggleButton->setToolTip(tr("Filter mode (AND/OR/NOT conjunctions of filters)")); + modeComboBox->blockSignals(false); } void VisualDatabaseDisplayColorFilterWidget::handleColorToggled(QChar color, bool active) @@ -145,24 +148,19 @@ void VisualDatabaseDisplayColorFilterWidget::removeFilter(QChar color) void VisualDatabaseDisplayColorFilterWidget::updateFilterMode() { - switch (currentMode) { - case FilterMode::ExactMatch: - currentMode = FilterMode::Includes; // Switch to Includes - break; - case FilterMode::Includes: - currentMode = FilterMode::IncludeExclude; // Switch to Include/Exclude - break; - case FilterMode::IncludeExclude: - currentMode = FilterMode::ExactMatch; // Switch to Exact Match - break; + const QVariant data = modeComboBox->currentData(); + if (!data.isValid()) { + return; } + currentMode = data.value(); + filterModel->blockSignals(true); filterModel->filterTree()->blockSignals(true); filterModel->clearFiltersOfType(CardFilter::Attr::AttrColor); - QList manaSymbolWidgets = findChildren(); + const QList manaSymbolWidgets = findChildren(); for (ManaSymbolWidget *manaSymbolWidget : manaSymbolWidgets) { handleColorToggled(manaSymbolWidget->getSymbolChar(), manaSymbolWidget->isColorActive()); @@ -173,9 +171,7 @@ void VisualDatabaseDisplayColorFilterWidget::updateFilterMode() emit filterModel->filterTree()->changed(); emit filterModel->layoutChanged(); - - retranslateUi(); // Update button text based on the mode - emit filterModeChanged(currentMode); // Signal mode change + emit filterModeChanged(currentMode); } void VisualDatabaseDisplayColorFilterWidget::setManaSymbolActive(QChar color, bool active) diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.h index 7b4c365c0..698ea9e97 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.h @@ -9,8 +9,8 @@ #include "../../../filters/filter_tree_model.h" +#include #include -#include #include class VisualDatabaseDisplayColorFilterCircleWidget : public QWidget @@ -39,6 +39,8 @@ enum class FilterMode IncludeExclude // Include selected colors (OR) and exclude unselected colors (AND NOT). }; +Q_DECLARE_METATYPE(FilterMode) + class VisualDatabaseDisplayColorFilterWidget : public QWidget { Q_OBJECT @@ -62,7 +64,7 @@ private slots: private: FilterTreeModel *filterModel; QHBoxLayout *layout; - QPushButton *toggleButton; + QComboBox *modeComboBox; FilterMode currentMode = FilterMode::Includes; // Default mode }; diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp new file mode 100644 index 000000000..324236ab7 --- /dev/null +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.cpp @@ -0,0 +1,135 @@ +#include "visual_database_display_filter_toolbar_widget.h" + +#include "visual_database_display_widget.h" + +VisualDatabaseDisplayFilterToolbarWidget::VisualDatabaseDisplayFilterToolbarWidget(VisualDatabaseDisplayWidget *_parent) + : QWidget(_parent), visualDatabaseDisplay(_parent) +{ + filterContainerLayout = new QHBoxLayout(this); + filterContainerLayout->setContentsMargins(11, 0, 11, 0); + setLayout(filterContainerLayout); + filterContainerLayout->setAlignment(Qt::AlignLeft); + + setMaximumHeight(80); + + connect(this, &VisualDatabaseDisplayFilterToolbarWidget::searchModelChanged, visualDatabaseDisplay, + &VisualDatabaseDisplayWidget::onSearchModelChanged); + + filterByLabel = new QLabel(this); + + sortByLabel = new QLabel(this); + sortColumnCombo = new QComboBox(this); + sortColumnCombo->setSizeAdjustPolicy(QComboBox::SizeAdjustPolicy::AdjustToContents); + sortOrderCombo = new QComboBox(this); + sortOrderCombo->setSizeAdjustPolicy(QComboBox::SizeAdjustPolicy::AdjustToContents); + + sortOrderCombo->addItem("Ascending", Qt::AscendingOrder); + sortOrderCombo->addItem("Descending", Qt::DescendingOrder); + sortOrderCombo->view()->setMinimumWidth(sortOrderCombo->view()->sizeHintForColumn(0)); + sortOrderCombo->adjustSize(); + + // Populate columns dynamically from the model + for (int i = 0; i < visualDatabaseDisplay->getDatabaseDisplayModel()->columnCount(); ++i) { + QString header = visualDatabaseDisplay->getDatabaseDisplayModel()->headerData(i, Qt::Horizontal).toString(); + sortColumnCombo->addItem(header, i); + } + + sortColumnCombo->view()->setMinimumWidth(sortColumnCombo->view()->sizeHintForColumn(0)); + sortColumnCombo->adjustSize(); + + connect(sortColumnCombo, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { + int column = sortColumnCombo->currentData().toInt(); + Qt::SortOrder order = static_cast(sortOrderCombo->currentData().toInt()); + visualDatabaseDisplay->getDatabaseView()->sortByColumn(column, order); + + emit searchModelChanged(); + }); + + connect(sortOrderCombo, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { + int column = sortColumnCombo->currentData().toInt(); + Qt::SortOrder order = static_cast(sortOrderCombo->currentData().toInt()); + visualDatabaseDisplay->getDatabaseView()->sortByColumn(column, order); + + emit searchModelChanged(); + }); + + quickFilterSaveLoadWidget = new SettingsButtonWidget(this); + quickFilterSaveLoadWidget->setButtonIcon(QPixmap("theme:icons/floppy_disk")); + + quickFilterNameWidget = new SettingsButtonWidget(this); + quickFilterNameWidget->setButtonIcon(QPixmap("theme:icons/pen_to_square")); + + quickFilterMainTypeWidget = new SettingsButtonWidget(this); + quickFilterMainTypeWidget->setButtonIcon(QPixmap("theme:icons/circle_half_stroke")); + + quickFilterSubTypeWidget = new SettingsButtonWidget(this); + quickFilterSubTypeWidget->setButtonIcon(QPixmap("theme:icons/dragon")); + + quickFilterSetWidget = new SettingsButtonWidget(this); + quickFilterSetWidget->setButtonIcon(QPixmap("theme:icons/scroll")); + + quickFilterFormatLegalityWidget = new SettingsButtonWidget(this); + quickFilterFormatLegalityWidget->setButtonIcon(QPixmap("theme:icons/scale_balanced")); + + retranslateUi(); +} + +void VisualDatabaseDisplayFilterToolbarWidget::initialize() +{ + sortByLabel->setVisible(true); + filterByLabel->setVisible(true); + + quickFilterSaveLoadWidget->setVisible(true); + quickFilterNameWidget->setVisible(true); + quickFilterSubTypeWidget->setVisible(true); + quickFilterSetWidget->setVisible(true); + + auto filterModel = visualDatabaseDisplay->filterModel; + + saveLoadWidget = new VisualDatabaseDisplayFilterSaveLoadWidget(this, filterModel); + nameFilterWidget = + new VisualDatabaseDisplayNameFilterWidget(this, visualDatabaseDisplay->getDeckEditor(), filterModel); + mainTypeFilterWidget = new VisualDatabaseDisplayMainTypeFilterWidget(this, filterModel); + formatLegalityWidget = new VisualDatabaseDisplayFormatLegalityFilterWidget(this, filterModel); + subTypeFilterWidget = new VisualDatabaseDisplaySubTypeFilterWidget(this, filterModel); + setFilterWidget = new VisualDatabaseDisplaySetFilterWidget(this, filterModel); + + quickFilterSaveLoadWidget->addSettingsWidget(saveLoadWidget); + quickFilterNameWidget->addSettingsWidget(nameFilterWidget); + quickFilterMainTypeWidget->addSettingsWidget(mainTypeFilterWidget); + quickFilterSubTypeWidget->addSettingsWidget(subTypeFilterWidget); + quickFilterSetWidget->addSettingsWidget(setFilterWidget); + quickFilterFormatLegalityWidget->addSettingsWidget(formatLegalityWidget); + + filterContainerLayout->addWidget(sortByLabel); + filterContainerLayout->addWidget(sortColumnCombo); + filterContainerLayout->addWidget(sortOrderCombo); + filterContainerLayout->addWidget(filterByLabel); + filterContainerLayout->addWidget(quickFilterNameWidget); + filterContainerLayout->addWidget(quickFilterMainTypeWidget); + filterContainerLayout->addWidget(quickFilterSubTypeWidget); + filterContainerLayout->addWidget(quickFilterSetWidget); + filterContainerLayout->addWidget(quickFilterFormatLegalityWidget); + filterContainerLayout->addStretch(); + filterContainerLayout->addWidget(quickFilterSaveLoadWidget); +} + +void VisualDatabaseDisplayFilterToolbarWidget::retranslateUi() +{ + sortByLabel->setText(tr("Sort by:")); + filterByLabel->setText(tr("Filter by:")); + + quickFilterSaveLoadWidget->setToolTip(tr("Save and load filters")); + quickFilterNameWidget->setToolTip(tr("Filter by exact card name")); + quickFilterMainTypeWidget->setToolTip(tr("Filter by card main-type")); + quickFilterSubTypeWidget->setToolTip(tr("Filter by card sub-type")); + quickFilterSetWidget->setToolTip(tr("Filter by set")); + quickFilterFormatLegalityWidget->setToolTip(tr("Filter by format legality")); + + quickFilterSaveLoadWidget->setButtonText(tr("Save/Load")); + quickFilterNameWidget->setButtonText(tr("Name")); + quickFilterMainTypeWidget->setButtonText(tr("Main Type")); + quickFilterSubTypeWidget->setButtonText(tr("Sub Type")); + quickFilterSetWidget->setButtonText(tr("Sets")); + quickFilterFormatLegalityWidget->setButtonText(tr("Formats")); +} \ No newline at end of file diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.h new file mode 100644 index 000000000..a6c614656 --- /dev/null +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_toolbar_widget.h @@ -0,0 +1,48 @@ +#ifndef COCKATRICE_VISUAL_DATABASE_DISPLAY_FILTER_TOOLBAR_WIDGET_H +#define COCKATRICE_VISUAL_DATABASE_DISPLAY_FILTER_TOOLBAR_WIDGET_H + +#include "visual_database_display_filter_save_load_widget.h" +#include "visual_database_display_format_legality_filter_widget.h" +#include "visual_database_display_main_type_filter_widget.h" +#include "visual_database_display_name_filter_widget.h" +#include "visual_database_display_set_filter_widget.h" +#include "visual_database_display_sub_type_filter_widget.h" + +class VisualDatabaseDisplayWidget; + +class VisualDatabaseDisplayFilterToolbarWidget : public QWidget +{ + Q_OBJECT + +signals: + void searchModelChanged(); + +public: + explicit VisualDatabaseDisplayFilterToolbarWidget(VisualDatabaseDisplayWidget *parent); + void initialize(); + void retranslateUi(); + +private: + VisualDatabaseDisplayWidget *visualDatabaseDisplay; + + QLabel *sortByLabel; + QComboBox *sortColumnCombo, *sortOrderCombo; + + QLabel *filterByLabel; + + QHBoxLayout *filterContainerLayout; + SettingsButtonWidget *quickFilterSaveLoadWidget; + VisualDatabaseDisplayFilterSaveLoadWidget *saveLoadWidget; + SettingsButtonWidget *quickFilterNameWidget; + VisualDatabaseDisplayNameFilterWidget *nameFilterWidget; + SettingsButtonWidget *quickFilterMainTypeWidget; + VisualDatabaseDisplayMainTypeFilterWidget *mainTypeFilterWidget; + SettingsButtonWidget *quickFilterSubTypeWidget; + VisualDatabaseDisplaySubTypeFilterWidget *subTypeFilterWidget; + SettingsButtonWidget *quickFilterSetWidget; + VisualDatabaseDisplaySetFilterWidget *setFilterWidget; + SettingsButtonWidget *quickFilterFormatLegalityWidget; + VisualDatabaseDisplayFormatLegalityFilterWidget *formatLegalityWidget; +}; + +#endif // COCKATRICE_VISUAL_DATABASE_DISPLAY_FILTER_TOOLBAR_WIDGET_H diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.cpp index 1f1b7b94c..0df948016 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.cpp @@ -2,6 +2,7 @@ #include "../../../filters/filter_tree_model.h" +#include #include #include #include @@ -14,11 +15,14 @@ VisualDatabaseDisplayFormatLegalityFilterWidget::VisualDatabaseDisplayFormatLega : QWidget(parent), filterModel(_filterModel) { allFormatsWithCount = CardDatabaseManager::query()->getAllFormatsWithCount(); + int maxValue = std::numeric_limits::min(); + for (int value : allFormatsWithCount) { + maxValue = std::max(maxValue, value); + } + setMinimumWidth(300); + setMaximumHeight(300); - setMaximumHeight(75); - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); - - layout = new QHBoxLayout(this); + layout = new QVBoxLayout(this); setLayout(layout); layout->setContentsMargins(0, 1, 0, 1); layout->setSpacing(1); @@ -27,33 +31,45 @@ VisualDatabaseDisplayFormatLegalityFilterWidget::VisualDatabaseDisplayFormatLega flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); layout->addWidget(flowWidget); + // Create a container for the threshold control + auto *thresholdLayout = new QHBoxLayout(); + thresholdLayout->setContentsMargins(0, 0, 0, 0); + + thresholdLabel = new QLabel(this); + thresholdLayout->addWidget(thresholdLabel); + // Create the spinbox spinBox = new QSpinBox(this); spinBox->setMinimum(1); - spinBox->setMaximum(getMaxMainTypeCount()); // Set the max value dynamically + spinBox->setMaximum(maxValue); // Set the max value dynamically spinBox->setValue(150); - layout->addWidget(spinBox); + thresholdLayout->addWidget(spinBox); + thresholdLayout->addStretch(); + + layout->addLayout(thresholdLayout); + connect(spinBox, qOverload(&QSpinBox::valueChanged), this, &VisualDatabaseDisplayFormatLegalityFilterWidget::updateFormatButtonsVisibility); // Create the toggle button for Exact Match/Includes mode toggleButton = new QPushButton(this); - toggleButton->setCheckable(true); layout->addWidget(toggleButton); - connect(toggleButton, &QPushButton::toggled, this, + connect(toggleButton, &QPushButton::clicked, this, &VisualDatabaseDisplayFormatLegalityFilterWidget::updateFilterMode); connect(filterModel, &FilterTreeModel::layoutChanged, this, [this]() { QTimer::singleShot(100, this, &VisualDatabaseDisplayFormatLegalityFilterWidget::syncWithFilterModel); }); - createFormatButtons(); // Populate buttons initially - updateFilterMode(false); // Initialize toggle button text + createFormatButtons(); // Populate buttons initially + updateFilterMode(); // Initialize toggle button text retranslateUi(); } void VisualDatabaseDisplayFormatLegalityFilterWidget::retranslateUi() { + thresholdLabel->setText(tr("Show formats with at least:")); + spinBox->setSuffix(tr(" cards")); spinBox->setToolTip(tr("Do not display formats with less than this amount of cards in the database")); toggleButton->setToolTip(tr("Filter mode (AND/OR/NOT conjunctions of filters)")); } @@ -160,9 +176,9 @@ void VisualDatabaseDisplayFormatLegalityFilterWidget::updateFormatFilter() emit filterModel->layoutChanged(); } -void VisualDatabaseDisplayFormatLegalityFilterWidget::updateFilterMode(bool checked) +void VisualDatabaseDisplayFormatLegalityFilterWidget::updateFilterMode() { - exactMatchMode = checked; + exactMatchMode = !exactMatchMode; toggleButton->setText(exactMatchMode ? tr("Mode: Exact Match") : tr("Mode: Includes")); updateFormatFilter(); } diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.h index a2a00b740..1b1a1382e 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.h @@ -4,6 +4,7 @@ #include "../../../filters/filter_tree_model.h" #include "../general/layout_containers/flow_widget.h" +#include #include #include #include @@ -23,21 +24,23 @@ public: void handleFormatToggled(const QString &format, bool active); void updateFormatFilter(); - void updateFilterMode(bool checked); + void updateFilterMode(); void syncWithFilterModel(); private: FilterTreeModel *filterModel; QMap allFormatsWithCount; - QSpinBox *spinBox; - QHBoxLayout *layout; + + QVBoxLayout *layout; FlowWidget *flowWidget; + QLabel *thresholdLabel; + QSpinBox *spinBox; QPushButton *toggleButton; // Mode switch button QMap activeFormats; // Track active filters QMap formatButtons; // Store toggle buttons - bool exactMatchMode = false; // Toggle between "Exact Match" and "Includes" + bool exactMatchMode = true; // Toggle between "Exact Match" and "Includes" }; #endif // COCKATRICE_VISUAL_DATABASE_DISPLAY_FORMAT_LEGALITY_FILTER_WIDGET_H diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.cpp index 368ac8719..bc8e914bd 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.cpp @@ -2,6 +2,7 @@ #include "../../../filters/filter_tree_model.h" +#include #include #include #include @@ -12,13 +13,12 @@ VisualDatabaseDisplayMainTypeFilterWidget::VisualDatabaseDisplayMainTypeFilterWi FilterTreeModel *_filterModel) : QWidget(parent), filterModel(_filterModel) { - allMainCardTypesWithCount = CardDatabaseManager::query()->getAllMainCardTypesWithCount(); // Get all main card types with their count + allMainCardTypesWithCount = CardDatabaseManager::query()->getAllMainCardTypesWithCount(); + setMinimumWidth(300); + setMaximumHeight(200); - setMaximumHeight(75); - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); - - layout = new QHBoxLayout(this); + layout = new QVBoxLayout(this); setLayout(layout); layout->setContentsMargins(0, 1, 0, 1); layout->setSpacing(1); @@ -27,32 +27,44 @@ VisualDatabaseDisplayMainTypeFilterWidget::VisualDatabaseDisplayMainTypeFilterWi flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); layout->addWidget(flowWidget); + // Create a container for the threshold control + auto *thresholdLayout = new QHBoxLayout(); + thresholdLayout->setContentsMargins(0, 0, 0, 0); + + thresholdLabel = new QLabel(this); + thresholdLayout->addWidget(thresholdLabel); + // Create the spinbox spinBox = new QSpinBox(this); spinBox->setMinimum(1); - spinBox->setMaximum(getMaxMainTypeCount()); // Set the max value dynamically + spinBox->setMaximum(getMaxMainTypeCount()); spinBox->setValue(150); - layout->addWidget(spinBox); + thresholdLayout->addWidget(spinBox); + thresholdLayout->addStretch(); + + layout->addLayout(thresholdLayout); + connect(spinBox, qOverload(&QSpinBox::valueChanged), this, &VisualDatabaseDisplayMainTypeFilterWidget::updateMainTypeButtonsVisibility); // Create the toggle button for Exact Match/Includes mode toggleButton = new QPushButton(this); - toggleButton->setCheckable(true); layout->addWidget(toggleButton); - connect(toggleButton, &QPushButton::toggled, this, &VisualDatabaseDisplayMainTypeFilterWidget::updateFilterMode); + connect(toggleButton, &QPushButton::clicked, this, &VisualDatabaseDisplayMainTypeFilterWidget::updateFilterMode); connect(filterModel, &FilterTreeModel::layoutChanged, this, [this]() { QTimer::singleShot(100, this, &VisualDatabaseDisplayMainTypeFilterWidget::syncWithFilterModel); }); createMainTypeButtons(); // Populate buttons initially - updateFilterMode(false); // Initialize toggle button text + updateFilterMode(); // Initialize toggle button text retranslateUi(); } void VisualDatabaseDisplayMainTypeFilterWidget::retranslateUi() { + thresholdLabel->setText(tr("Show main types with at least:")); + spinBox->setSuffix(tr(" cards")); spinBox->setToolTip(tr("Do not display card main-types with less than this amount of cards in the database")); toggleButton->setToolTip(tr("Filter mode (AND/OR/NOT conjunctions of filters)")); } @@ -159,9 +171,9 @@ void VisualDatabaseDisplayMainTypeFilterWidget::updateMainTypeFilter() emit filterModel->layoutChanged(); } -void VisualDatabaseDisplayMainTypeFilterWidget::updateFilterMode(bool checked) +void VisualDatabaseDisplayMainTypeFilterWidget::updateFilterMode() { - exactMatchMode = checked; + exactMatchMode = !exactMatchMode; toggleButton->setText(exactMatchMode ? tr("Mode: Exact Match") : tr("Mode: Includes")); updateMainTypeFilter(); } diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.h index 27c61dffc..9145812a7 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.h @@ -10,6 +10,7 @@ #include "../../../filters/filter_tree_model.h" #include "../general/layout_containers/flow_widget.h" +#include #include #include #include @@ -28,21 +29,23 @@ public: void handleMainTypeToggled(const QString &mainType, bool active); void updateMainTypeFilter(); - void updateFilterMode(bool checked); + void updateFilterMode(); void syncWithFilterModel(); private: FilterTreeModel *filterModel; QMap allMainCardTypesWithCount; - QSpinBox *spinBox; - QHBoxLayout *layout; + + QVBoxLayout *layout; FlowWidget *flowWidget; + QLabel *thresholdLabel; + QSpinBox *spinBox; QPushButton *toggleButton; // Mode switch button QMap activeMainTypes; // Track active filters QMap typeButtons; // Store toggle buttons - bool exactMatchMode = false; // Toggle between "Exact Match" and "Includes" + bool exactMatchMode = true; // Toggle between "Exact Match" and "Includes" }; #endif // VISUAL_DATABASE_DISPLAY_MAIN_TYPE_FILTER_WIDGET_H diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp index 6e621e6d4..3339bc561 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp @@ -53,14 +53,6 @@ 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); @@ -70,15 +62,23 @@ VisualDatabaseDisplaySetFilterWidget::VisualDatabaseDisplaySetFilterWidget(QWidg flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); layout->addWidget(flowWidget); + recentSetsSettingsWidget = new VisualDatabaseDisplayRecentSetFilterSettingsWidget(this); + layout->addWidget(recentSetsSettingsWidget); + + connect(&SettingsCache::instance(), &SettingsCache::visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged, this, + &VisualDatabaseDisplaySetFilterWidget::filterToRecentSets); + connect(&SettingsCache::instance(), &SettingsCache::visualDatabaseDisplayFilterToMostRecentSetsAmountChanged, this, + &VisualDatabaseDisplaySetFilterWidget::filterToRecentSets); + // Create the toggle button for Exact Match/Includes mode toggleButton = new QPushButton(this); - toggleButton->setCheckable(true); layout->addWidget(toggleButton); - connect(toggleButton, &QPushButton::toggled, this, &VisualDatabaseDisplaySetFilterWidget::updateFilterMode); + connect(toggleButton, &QPushButton::clicked, this, &VisualDatabaseDisplaySetFilterWidget::updateFilterMode); connect(filterModel, &FilterTreeModel::layoutChanged, this, [this]() { QTimer::singleShot(100, this, &VisualDatabaseDisplaySetFilterWidget::syncWithFilterModel); }); createSetButtons(); // Populate buttons initially + updateFilterMode(); retranslateUi(); } @@ -266,9 +266,16 @@ void VisualDatabaseDisplaySetFilterWidget::syncWithFilterModel() } } -void VisualDatabaseDisplaySetFilterWidget::updateFilterMode(bool checked) +void VisualDatabaseDisplaySetFilterWidget::updateFilterMode() { - exactMatchMode = checked; + // Disconnect the layoutChanged -> sync lambda temporarily + disconnect(filterModel, &FilterTreeModel::layoutChanged, this, nullptr); + + exactMatchMode = !exactMatchMode; updateSetFilter(); retranslateUi(); + + // Reconnect the layoutChanged -> sync lambda + connect(filterModel, &FilterTreeModel::layoutChanged, this, + [this]() { QTimer::singleShot(100, this, &VisualDatabaseDisplaySetFilterWidget::syncWithFilterModel); }); } diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.h index b4362d1db..dc7fd0e92 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.h @@ -44,7 +44,7 @@ public: void updateSetFilter(); void syncWithFilterModel(); - void updateFilterMode(bool checked); + void updateFilterMode(); private: FilterTreeModel *filterModel; @@ -60,7 +60,7 @@ private: QMap setButtons; // Store set filter buttons QMap activeSets; // Track active set filters - bool exactMatchMode = false; // Toggle between "Exact Match" and "Includes" + bool exactMatchMode = true; // Toggle between "Exact Match" and "Includes" }; #endif // VISUAL_DATABASE_DISPLAY_SET_FILTER_WIDGET_H diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp index b34bb65d3..57559d12c 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp @@ -2,6 +2,7 @@ #include "../../../filters/filter_tree_model.h" +#include #include #include #include @@ -20,15 +21,6 @@ VisualDatabaseDisplaySubTypeFilterWidget::VisualDatabaseDisplaySubTypeFilterWidg layout = new QVBoxLayout(this); setLayout(layout); - // Create and setup the spinbox - spinBox = new QSpinBox(this); - spinBox->setMinimum(1); - spinBox->setMaximum(getMaxSubTypeCount()); - spinBox->setValue(150); - layout->addWidget(spinBox); - connect(spinBox, qOverload(&QSpinBox::valueChanged), this, - &VisualDatabaseDisplaySubTypeFilterWidget::updateSubTypeButtonsVisibility); - // Create search box searchBox = new QLineEdit(this); searchBox->setPlaceholderText(tr("Search subtypes...")); @@ -40,23 +32,44 @@ VisualDatabaseDisplaySubTypeFilterWidget::VisualDatabaseDisplaySubTypeFilterWidg flowWidget->setMaximumHeight(300); layout->addWidget(flowWidget); + // Create a container for the threshold control + auto *thresholdLayout = new QHBoxLayout(); + thresholdLayout->setContentsMargins(0, 0, 0, 0); + + thresholdLabel = new QLabel(this); + thresholdLayout->addWidget(thresholdLabel); + + // Create the spinbox + spinBox = new QSpinBox(this); + spinBox->setMinimum(1); + spinBox->setMaximum(getMaxSubTypeCount()); + spinBox->setValue(150); + thresholdLayout->addWidget(spinBox); + thresholdLayout->addStretch(); + + layout->addLayout(thresholdLayout); + + connect(spinBox, qOverload(&QSpinBox::valueChanged), this, + &VisualDatabaseDisplaySubTypeFilterWidget::updateSubTypeButtonsVisibility); + // Toggle button setup (Exact Match / Includes mode) toggleButton = new QPushButton(this); - toggleButton->setCheckable(true); layout->addWidget(toggleButton); - connect(toggleButton, &QPushButton::toggled, this, &VisualDatabaseDisplaySubTypeFilterWidget::updateFilterMode); + connect(toggleButton, &QPushButton::clicked, this, &VisualDatabaseDisplaySubTypeFilterWidget::updateFilterMode); connect(filterModel, &FilterTreeModel::layoutChanged, this, [this]() { QTimer::singleShot(100, this, &VisualDatabaseDisplaySubTypeFilterWidget::syncWithFilterModel); }); - createSubTypeButtons(); // Populate buttons initially - updateFilterMode(false); // Initialize the toggle button text + createSubTypeButtons(); // Populate buttons initially + updateFilterMode(); // Initialize the toggle button text retranslateUi(); } void VisualDatabaseDisplaySubTypeFilterWidget::retranslateUi() { + thresholdLabel->setText(tr("Show sub types with at least:")); + spinBox->setSuffix(tr(" cards")); spinBox->setToolTip(tr("Do not display card sub-types with less than this amount of cards in the database")); toggleButton->setToolTip(tr("Filter mode (AND/OR/NOT conjunctions of filters)")); } @@ -155,7 +168,7 @@ void VisualDatabaseDisplaySubTypeFilterWidget::updateSubTypeFilter() if (activeSubTypes[type]) { QString typeString = type; filterModel->addFilter( - new CardFilter(typeString, CardFilter::Type::TypeAnd, CardFilter::Attr::AttrSubType)); + new CardFilter(typeString, CardFilter::Type::TypeOr, CardFilter::Attr::AttrSubType)); } } } @@ -166,9 +179,9 @@ void VisualDatabaseDisplaySubTypeFilterWidget::updateSubTypeFilter() emit filterModel->layoutChanged(); } -void VisualDatabaseDisplaySubTypeFilterWidget::updateFilterMode(bool checked) +void VisualDatabaseDisplaySubTypeFilterWidget::updateFilterMode() { - exactMatchMode = checked; + exactMatchMode = !exactMatchMode; toggleButton->setText(exactMatchMode ? tr("Mode: Exact Match") : tr("Mode: Includes")); updateSubTypeFilter(); } @@ -188,7 +201,7 @@ void VisualDatabaseDisplaySubTypeFilterWidget::syncWithFilterModel() // Get active filters for sub types QSet activeTypes; for (const auto &filter : filterModel->getFiltersOfType(CardFilter::AttrSubType)) { - if (filter->type() == CardFilter::Type::TypeAnd) { + if (filter->type() == CardFilter::Type::TypeAnd || filter->type() == CardFilter::Type::TypeOr) { activeTypes.insert(filter->term()); } } diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.h index c02db29be..ce5546fc8 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.h @@ -10,6 +10,7 @@ #include "../../../filters/filter_tree_model.h" #include "../general/layout_containers/flow_widget.h" +#include #include #include #include @@ -27,22 +28,24 @@ public: void handleSubTypeToggled(const QString &mainType, bool active); void updateSubTypeFilter(); - void updateFilterMode(bool checked); + void updateFilterMode(); void syncWithFilterModel(); private: FilterTreeModel *filterModel; QMap allSubCardTypesWithCount; - QSpinBox *spinBox; + QVBoxLayout *layout; QLineEdit *searchBox; FlowWidget *flowWidget; + QLabel *thresholdLabel; + QSpinBox *spinBox; QPushButton *toggleButton; // Mode switch button QMap activeSubTypes; // Track active filters QMap typeButtons; // Store toggle buttons - bool exactMatchMode = false; // Toggle between "Exact Match" and "Includes" + bool exactMatchMode = true; // Toggle between "Exact Match" and "Includes" }; #endif // VISUAL_DATABASE_DISPLAY_SUB_TYPE_FILTER_WIDGET_H diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp index 6112faedf..44a9e98a0 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp @@ -101,49 +101,9 @@ VisualDatabaseDisplayWidget::VisualDatabaseDisplayWidget(QWidget *parent, searchEdit->setTreeView(databaseView); - sortByLabel = new QLabel(this); - sortColumnCombo = new QComboBox(this); - sortColumnCombo->setSizeAdjustPolicy(QComboBox::SizeAdjustPolicy::AdjustToContents); - sortOrderCombo = new QComboBox(this); - sortOrderCombo->setSizeAdjustPolicy(QComboBox::SizeAdjustPolicy::AdjustToContents); - - sortOrderCombo->addItem("Ascending", Qt::AscendingOrder); - sortOrderCombo->addItem("Descending", Qt::DescendingOrder); - sortOrderCombo->view()->setMinimumWidth(sortOrderCombo->view()->sizeHintForColumn(0)); - sortOrderCombo->adjustSize(); - - // Populate columns dynamically from the model - for (int i = 0; i < databaseDisplayModel->columnCount(); ++i) { - QString header = databaseDisplayModel->headerData(i, Qt::Horizontal).toString(); - sortColumnCombo->addItem(header, i); - } - - sortColumnCombo->view()->setMinimumWidth(sortColumnCombo->view()->sizeHintForColumn(0)); - sortColumnCombo->adjustSize(); - - connect(sortColumnCombo, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { - int column = sortColumnCombo->currentData().toInt(); - Qt::SortOrder order = static_cast(sortOrderCombo->currentData().toInt()); - databaseView->sortByColumn(column, order); - - searchModelChanged(); - }); - - connect(sortOrderCombo, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { - int column = sortColumnCombo->currentData().toInt(); - Qt::SortOrder order = static_cast(sortOrderCombo->currentData().toInt()); - databaseView->sortByColumn(column, order); - - searchModelChanged(); - }); - colorFilterWidget = new VisualDatabaseDisplayColorFilterWidget(this, filterModel); - filterContainer = new QWidget(this); - filterContainerLayout = new QHBoxLayout(filterContainer); - filterContainer->setLayout(filterContainerLayout); - - filterByLabel = new QLabel(this); + filterContainer = new VisualDatabaseDisplayFilterToolbarWidget(this); clearFilterWidget = new QToolButton(); clearFilterWidget->setFixedSize(32, 32); @@ -158,20 +118,6 @@ VisualDatabaseDisplayWidget::VisualDatabaseDisplayWidget(QWidget *parent, emit filterModel->layoutChanged(); }); - quickFilterSaveLoadWidget = new SettingsButtonWidget(this); - quickFilterSaveLoadWidget->setButtonIcon(QPixmap("theme:icons/lock")); - - quickFilterNameWidget = new SettingsButtonWidget(this); - quickFilterNameWidget->setButtonIcon(QPixmap("theme:icons/rename")); - - quickFilterSubTypeWidget = new SettingsButtonWidget(this); - quickFilterSubTypeWidget->setButtonIcon(QPixmap("theme:icons/player")); - - quickFilterSetWidget = new SettingsButtonWidget(this); - quickFilterSetWidget->setButtonIcon(QPixmap("theme:icons/scales")); - - filterContainer->setMaximumHeight(80); - databaseLoadIndicator = new QLabel(this); databaseLoadIndicator->setAlignment(Qt::AlignCenter); @@ -180,12 +126,7 @@ VisualDatabaseDisplayWidget::VisualDatabaseDisplayWidget(QWidget *parent, if (CardDatabaseManager::getInstance()->getLoadStatus() != LoadStatus::Ok) { connect(CardDatabaseManager::getInstance(), &CardDatabase::cardDatabaseLoadingFinished, this, &VisualDatabaseDisplayWidget::initialize); - sortByLabel->setVisible(false); - filterByLabel->setVisible(false); - quickFilterSaveLoadWidget->setVisible(false); - quickFilterNameWidget->setVisible(false); - quickFilterSubTypeWidget->setVisible(false); - quickFilterSetWidget->setVisible(false); + filterContainer->setVisible(false); } else { initialize(); databaseLoadIndicator->setVisible(false); @@ -198,35 +139,7 @@ void VisualDatabaseDisplayWidget::initialize() { databaseLoadIndicator->setVisible(false); - sortByLabel->setVisible(true); - filterByLabel->setVisible(true); - quickFilterSaveLoadWidget->setVisible(true); - quickFilterNameWidget->setVisible(true); - quickFilterSubTypeWidget->setVisible(true); - quickFilterSetWidget->setVisible(true); - - saveLoadWidget = new VisualDatabaseDisplayFilterSaveLoadWidget(this, filterModel); - nameFilterWidget = new VisualDatabaseDisplayNameFilterWidget(this, deckEditor, filterModel); - mainTypeFilterWidget = new VisualDatabaseDisplayMainTypeFilterWidget(this, filterModel); - formatLegalityWidget = new VisualDatabaseDisplayFormatLegalityFilterWidget(this, filterModel); - subTypeFilterWidget = new VisualDatabaseDisplaySubTypeFilterWidget(this, filterModel); - setFilterWidget = new VisualDatabaseDisplaySetFilterWidget(this, filterModel); - - quickFilterSaveLoadWidget->addSettingsWidget(saveLoadWidget); - quickFilterNameWidget->addSettingsWidget(nameFilterWidget); - quickFilterSubTypeWidget->addSettingsWidget(subTypeFilterWidget); - quickFilterSetWidget->addSettingsWidget(setFilterWidget); - - filterContainerLayout->addWidget(sortByLabel); - filterContainerLayout->addWidget(sortColumnCombo); - filterContainerLayout->addWidget(sortOrderCombo); - filterContainerLayout->addWidget(filterByLabel); - filterContainerLayout->addWidget(quickFilterSaveLoadWidget); - filterContainerLayout->addWidget(quickFilterNameWidget); - filterContainerLayout->addWidget(quickFilterSubTypeWidget); - filterContainerLayout->addWidget(quickFilterSetWidget); - filterContainerLayout->addWidget(mainTypeFilterWidget); - filterContainerLayout->addWidget(formatLegalityWidget); + filterContainer->initialize(); searchLayout->addWidget(colorFilterWidget); searchLayout->addWidget(clearFilterWidget); @@ -246,11 +159,11 @@ void VisualDatabaseDisplayWidget::initialize() debounceTimer = new QTimer(this); debounceTimer->setSingleShot(true); // Ensure it only fires once after the timeout - connect(debounceTimer, &QTimer::timeout, this, &VisualDatabaseDisplayWidget::searchModelChanged); + connect(debounceTimer, &QTimer::timeout, this, &VisualDatabaseDisplayWidget::onSearchModelChanged); databaseDisplayModel->setFilterTree(filterModel->filterTree()); - connect(filterModel, &FilterTreeModel::layoutChanged, this, &VisualDatabaseDisplayWidget::searchModelChanged); + connect(filterModel, &FilterTreeModel::layoutChanged, this, &VisualDatabaseDisplayWidget::onSearchModelChanged); loadCardsTimer = new QTimer(this); loadCardsTimer->setSingleShot(true); // Ensure it only fires once after the timeout @@ -264,16 +177,7 @@ void VisualDatabaseDisplayWidget::initialize() void VisualDatabaseDisplayWidget::retranslateUi() { databaseLoadIndicator->setText(tr("Loading database ...")); - clearFilterWidget->setToolTip(tr("Clear all filters")); - - sortByLabel->setText(tr("Sort by:")); - filterByLabel->setText(tr("Filter by:")); - - quickFilterSaveLoadWidget->setToolTip(tr("Save and load filters")); - quickFilterNameWidget->setToolTip(tr("Filter by exact card name")); - quickFilterSubTypeWidget->setToolTip(tr("Filter by card sub-type")); - quickFilterSetWidget->setToolTip(tr("Filter by set")); } void VisualDatabaseDisplayWidget::resizeEvent(QResizeEvent *event) @@ -332,7 +236,7 @@ void VisualDatabaseDisplayWidget::updateSearch(const QString &search) const QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } -void VisualDatabaseDisplayWidget::searchModelChanged() +void VisualDatabaseDisplayWidget::onSearchModelChanged() { if (flowWidget->isVisible()) { // Clear the current page and prepare for new data diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h index 24990f8e5..3aa8d7f8e 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.h @@ -16,12 +16,7 @@ #include "../general/layout_containers/overlap_control_widget.h" #include "../utility/custom_line_edit.h" #include "visual_database_display_color_filter_widget.h" -#include "visual_database_display_filter_save_load_widget.h" -#include "visual_database_display_format_legality_filter_widget.h" -#include "visual_database_display_main_type_filter_widget.h" -#include "visual_database_display_name_filter_widget.h" -#include "visual_database_display_set_filter_widget.h" -#include "visual_database_display_sub_type_filter_widget.h" +#include "visual_database_display_filter_toolbar_widget.h" #include #include @@ -52,6 +47,21 @@ public: void sortCardList(const QStringList &properties, Qt::SortOrder order) const; void setDeckList(const DeckList &new_deck_list_model); + AbstractTabDeckEditor *getDeckEditor() + { + return deckEditor; + } + + CardDatabaseDisplayModel *getDatabaseDisplayModel() + { + return databaseDisplayModel; + } + + QTreeView *getDatabaseView() + { + return databaseView; + } + QWidget *searchContainer; QHBoxLayout *searchLayout; SearchLineEdit *searchEdit; @@ -60,7 +70,7 @@ public: VisualDatabaseDisplayColorFilterWidget *colorFilterWidget; public slots: - void searchModelChanged(); + void onSearchModelChanged(); signals: void cardClickedDatabaseDisplay(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance); @@ -80,23 +90,8 @@ protected slots: private: QLabel *databaseLoadIndicator; - QLabel *sortByLabel; - QComboBox *sortColumnCombo, *sortOrderCombo; - - QLabel *filterByLabel; QToolButton *clearFilterWidget; - QWidget *filterContainer; - QHBoxLayout *filterContainerLayout; - SettingsButtonWidget *quickFilterSaveLoadWidget; - VisualDatabaseDisplayFilterSaveLoadWidget *saveLoadWidget; - SettingsButtonWidget *quickFilterNameWidget; - VisualDatabaseDisplayNameFilterWidget *nameFilterWidget; - VisualDatabaseDisplayMainTypeFilterWidget *mainTypeFilterWidget; - VisualDatabaseDisplayFormatLegalityFilterWidget *formatLegalityWidget; - SettingsButtonWidget *quickFilterSubTypeWidget; - VisualDatabaseDisplaySubTypeFilterWidget *subTypeFilterWidget; - SettingsButtonWidget *quickFilterSetWidget; - VisualDatabaseDisplaySetFilterWidget *setFilterWidget; + VisualDatabaseDisplayFilterToolbarWidget *filterContainer; KeySignals searchKeySignals; AbstractTabDeckEditor *deckEditor; CardDatabaseModel *databaseModel;