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 82c3f5801..dba081de9 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 @@ -254,7 +254,8 @@ QList VisualDatabaseDisplayColorFilterWidget::getActiveColors() void VisualDatabaseDisplayColorFilterWidget::syncWithFilterModel() { // Determine the correct currentMode from the filter model by finding which modes - // are not possible due to the model containing filters that that mode cannot add. + // are not possible due to the model containing (a combination of) filters that + // that mode cannot add. constexpr int modeCount = static_cast(FilterMode::End); bool modeImpossible[modeCount] = {}; @@ -262,23 +263,29 @@ void VisualDatabaseDisplayColorFilterWidget::syncWithFilterModel() 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::Type::TypeEnd && - modeInfo.excludeType != CardFilter::Type::TypeEnd) { - modeImpossible[i] = true; - } - } - } else { + for (int i = 0; i < modeCount; ++i) { + FilterModeInfo modeInfo = getFilterModeInfo(static_cast(i)); + // Remove the modes that cannot create one of the filters. for (const CardFilter *filter : filters) { - for (int i = 0; i < modeCount; ++i) { - FilterModeInfo modeInfo = getFilterModeInfo(static_cast(i)); - if (filter->attr() != modeInfo.attr || - (filter->type() != modeInfo.includeType && filter->type() != modeInfo.excludeType)) { + if (filter->attr() != modeInfo.attr || + (filter->type() != modeInfo.includeType && filter->type() != modeInfo.excludeType)) { + modeImpossible[i] = true; + break; + } + } + + // Modes that have both an include and exclude filter should always have a filter for each color. + if (modeInfo.includeType != CardFilter::Type::TypeEnd && modeInfo.excludeType != CardFilter::Type::TypeEnd && + !modeImpossible[i]) { + for (const QChar &color : QString("WUBRG")) { + int count = 0; + for (const CardFilter *filter : filters) { + count += filter->term() == color; + } + if (count != 1) { modeImpossible[i] = true; + break; } } }