From b086230831d5b58fa3ffccd54e74c40bdad88597 Mon Sep 17 00:00:00 2001 From: Jurriaan van den Berg Date: Mon, 2 Nov 2026 15:18:18 +0100 Subject: [PATCH] Added filter mode reconstructing, FilterMode::Custom, setFilterMode, and refactor --- ...l_database_display_color_filter_widget.cpp | 73 ++++++++++++------- ...ual_database_display_color_filter_widget.h | 1 + 2 files changed, 46 insertions(+), 28 deletions(-) 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 2fb328bf0..581b31ea0 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 @@ -15,42 +15,58 @@ #include #include +namespace +{ /** - * @brief Information about the filter mode. + * @brief Information about the behaviour of a filter mode. */ struct FilterModeInfo { + // When a color symbol is enabled, add filters of this type. Skipped if equal to CardFilter::Type::TypeEnd. CardFilter::Type includeType; + + // When a color symbol is disabled, add filters of this type. Skipped if equal to CardFilter::Type::TypeEnd. CardFilter::Type excludeType; + + // The attribute to filter for when adding the filters. CardFilter::Attr attr; }; -/** - * @brief Return information about the filter mode. - */ +/** @brief Return information about the given filter mode. */ static FilterModeInfo getFilterModeInfo(FilterMode filterMode) { switch (filterMode) { case FilterMode::Includes: - return {CardFilter::TypeOr, CardFilter::TypeEnd, CardFilter::AttrColor}; + return {CardFilter::Type::TypeOr, CardFilter::Type::TypeEnd, CardFilter::Attr::AttrColor}; case FilterMode::Excludes: - return {CardFilter::TypeAndNot, CardFilter::TypeEnd, CardFilter::AttrColor}; + return {CardFilter::Type::TypeAndNot, CardFilter::Type::TypeEnd, CardFilter::Attr::AttrColor}; case FilterMode::IncludeExclude: - return {CardFilter::TypeOr, CardFilter::TypeAndNot, CardFilter::AttrColor}; + return {CardFilter::Type::TypeOr, CardFilter::Type::TypeAndNot, CardFilter::Attr::AttrColor}; case FilterMode::ExactMatch: - return {CardFilter::TypeAnd, CardFilter::TypeAndNot, CardFilter::AttrColor}; + return {CardFilter::Type::TypeAnd, CardFilter::Type::TypeAndNot, CardFilter::Attr::AttrColor}; case FilterMode::ColorIdentity: - return {CardFilter::TypeEnd, CardFilter::TypeAndNot, CardFilter::AttrColorIdentity}; + return {CardFilter::Type::TypeEnd, CardFilter::Type::TypeAndNot, CardFilter::Attr::AttrColorIdentity}; case FilterMode::Custom: case FilterMode::End: break; } - return {CardFilter::TypeEnd, CardFilter::TypeEnd, CardFilter::AttrEnd}; + return {CardFilter::Type::TypeEnd, CardFilter::Type::TypeEnd, CardFilter::Attr::AttrEnd}; } +/** @brief Remove the filters that apply to the given color and attribute from the given model. */ +static void removeFilters(FilterTreeModel *filterModel, QChar color, CardFilter::Attr attr) +{ + for (const CardFilter *filter : filterModel->getFiltersOfType(attr)) { + if (filter->term() == color) { + filterModel->removeFilter(filter); + } + } +} +} // namespace + /** - * This widget provides a graphical control element for the CardFilter::Attr::AttrColor filters applied to the filter - * model. + * This widget provides a graphical control element for the CardFilter::Attr::AttrColor and + * CardFilter::Attr::AttrColorIdentity filters applied to the filter model. * @param parent The Qt Widget that this widget will parent to * @param _filterModel The filter model that this widget will manipulate */ @@ -106,6 +122,7 @@ void VisualDatabaseDisplayColorFilterWidget::retranslateUi() modeComboBox->setItemData(4, tr("Cards whose color identity fits within the selected colors"), Qt::ToolTipRole); modeComboBox->setToolTip(tr("How selected and unselected colors are combined in the filter")); + modeComboBox->setAccessibleName(tr("Color Filter Mode")); // Restore current mode const int index = modeComboBox->findData(QVariant::fromValue(currentMode)); @@ -116,6 +133,14 @@ void VisualDatabaseDisplayColorFilterWidget::retranslateUi() modeComboBox->blockSignals(false); } +void VisualDatabaseDisplayColorFilterWidget::setFilterMode(FilterMode filterMode) +{ + const int index = modeComboBox->findData(QVariant::fromValue(filterMode)); + if (index >= 0) { + modeComboBox->setCurrentIndex(index); + } +} + void VisualDatabaseDisplayColorFilterWidget::handleColorToggled(QChar color, bool active) { if (active) { @@ -125,23 +150,13 @@ void VisualDatabaseDisplayColorFilterWidget::handleColorToggled(QChar color, boo } } -/** @brief TODO */ -static void removeFilters(FilterTreeModel *filterModel, QChar color, CardFilter::Attr attr) -{ - for (const CardFilter *filter : filterModel->getFiltersOfType(attr)) { - if (filter->term() == color) { - filterModel->removeFilter(filter); - } - } -} - void VisualDatabaseDisplayColorFilterWidget::addFilter(QChar color) { FilterModeInfo info = getFilterModeInfo(currentMode); removeFilters(filterModel, color, info.attr); - if (info.includeType != CardFilter::TypeEnd) { + if (info.includeType != CardFilter::Type::TypeEnd) { filterModel->addFilter(new CardFilter(color, info.includeType, info.attr)); } } @@ -153,7 +168,7 @@ void VisualDatabaseDisplayColorFilterWidget::removeFilter(QChar color) removeFilters(filterModel, color, info.attr); // Add exclusion filters if the mode demands it. - if (info.excludeType != CardFilter::TypeEnd) { + if (info.excludeType != CardFilter::Type::TypeEnd) { filterModel->addFilter(new CardFilter(color, info.excludeType, info.attr)); } } @@ -220,14 +235,15 @@ void VisualDatabaseDisplayColorFilterWidget::syncWithFilterModel() bool modeImpossible[modeCount] = {}; QList filters; - filters.append(filterModel->getFiltersOfType(CardFilter::AttrColor)); - filters.append(filterModel->getFiltersOfType(CardFilter::AttrColorIdentity)); + filters.append(filterModel->getFiltersOfType(CardFilter::Attr::AttrColor)); + filters.append(filterModel->getFiltersOfType(CardFilter::Attr::AttrColorIdentity)); if (filters.empty()) { // Remove the modes that should always contain filters. for (int i = 0; i < modeCount; ++i) { FilterModeInfo modeInfo = getFilterModeInfo(static_cast(i)); - if (modeInfo.includeType != CardFilter::TypeEnd && modeInfo.excludeType != CardFilter::TypeEnd) { + if (modeInfo.includeType != CardFilter::Type::TypeEnd && + modeInfo.excludeType != CardFilter::Type::TypeEnd) { modeImpossible[i] = true; } } @@ -280,7 +296,8 @@ void VisualDatabaseDisplayColorFilterWidget::syncWithFilterModel() // Update the mana symbol widgets by looking for the current mode's include or exclude filters. const FilterModeInfo modeInfo = getFilterModeInfo(currentMode); - const bool useExclude = modeInfo.includeType == CardFilter::TypeEnd && modeInfo.excludeType != CardFilter::TypeEnd; + const bool useExclude = + modeInfo.includeType == CardFilter::Type::TypeEnd && modeInfo.excludeType != CardFilter::Type::TypeEnd; const CardFilter::Type filterType = useExclude ? modeInfo.excludeType : modeInfo.includeType; filters = filterModel->getFiltersOfType(modeInfo.attr); 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 68012d6e8..d65e5373d 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 @@ -59,6 +59,7 @@ class VisualDatabaseDisplayColorFilterWidget : public QWidget public: explicit VisualDatabaseDisplayColorFilterWidget(QWidget *parent, FilterTreeModel *filterModel); void retranslateUi(); + void setFilterMode(FilterMode filterMode); signals: void filterModeChanged(FilterMode filterMode);