Added filter mode reconstructing, FilterMode::Custom, setFilterMode, and refactor

This commit is contained in:
Jurriaan van den Berg 2026-11-02 15:18:18 +01:00
parent f2e4aa3c34
commit b086230831
2 changed files with 46 additions and 28 deletions

View file

@ -15,42 +15,58 @@
#include <QtGlobal> #include <QtGlobal>
#include <libcockatrice/filters/filter_tree.h> #include <libcockatrice/filters/filter_tree.h>
namespace
{
/** /**
* @brief Information about the filter mode. * @brief Information about the behaviour of a filter mode.
*/ */
struct FilterModeInfo struct FilterModeInfo
{ {
// When a color symbol is enabled, add filters of this type. Skipped if equal to CardFilter::Type::TypeEnd.
CardFilter::Type includeType; CardFilter::Type includeType;
// When a color symbol is disabled, add filters of this type. Skipped if equal to CardFilter::Type::TypeEnd.
CardFilter::Type excludeType; CardFilter::Type excludeType;
// The attribute to filter for when adding the filters.
CardFilter::Attr attr; CardFilter::Attr attr;
}; };
/** /** @brief Return information about the given filter mode. */
* @brief Return information about the filter mode.
*/
static FilterModeInfo getFilterModeInfo(FilterMode filterMode) static FilterModeInfo getFilterModeInfo(FilterMode filterMode)
{ {
switch (filterMode) { switch (filterMode) {
case FilterMode::Includes: case FilterMode::Includes:
return {CardFilter::TypeOr, CardFilter::TypeEnd, CardFilter::AttrColor}; return {CardFilter::Type::TypeOr, CardFilter::Type::TypeEnd, CardFilter::Attr::AttrColor};
case FilterMode::Excludes: case FilterMode::Excludes:
return {CardFilter::TypeAndNot, CardFilter::TypeEnd, CardFilter::AttrColor}; return {CardFilter::Type::TypeAndNot, CardFilter::Type::TypeEnd, CardFilter::Attr::AttrColor};
case FilterMode::IncludeExclude: case FilterMode::IncludeExclude:
return {CardFilter::TypeOr, CardFilter::TypeAndNot, CardFilter::AttrColor}; return {CardFilter::Type::TypeOr, CardFilter::Type::TypeAndNot, CardFilter::Attr::AttrColor};
case FilterMode::ExactMatch: case FilterMode::ExactMatch:
return {CardFilter::TypeAnd, CardFilter::TypeAndNot, CardFilter::AttrColor}; return {CardFilter::Type::TypeAnd, CardFilter::Type::TypeAndNot, CardFilter::Attr::AttrColor};
case FilterMode::ColorIdentity: 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::Custom:
case FilterMode::End: case FilterMode::End:
break; 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 * This widget provides a graphical control element for the CardFilter::Attr::AttrColor and
* model. * CardFilter::Attr::AttrColorIdentity filters applied to the filter model.
* @param parent The Qt Widget that this widget will parent to * @param parent The Qt Widget that this widget will parent to
* @param _filterModel The filter model that this widget will manipulate * @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->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->setToolTip(tr("How selected and unselected colors are combined in the filter"));
modeComboBox->setAccessibleName(tr("Color Filter Mode"));
// Restore current mode // Restore current mode
const int index = modeComboBox->findData(QVariant::fromValue(currentMode)); const int index = modeComboBox->findData(QVariant::fromValue(currentMode));
@ -116,6 +133,14 @@ void VisualDatabaseDisplayColorFilterWidget::retranslateUi()
modeComboBox->blockSignals(false); 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) void VisualDatabaseDisplayColorFilterWidget::handleColorToggled(QChar color, bool active)
{ {
if (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) void VisualDatabaseDisplayColorFilterWidget::addFilter(QChar color)
{ {
FilterModeInfo info = getFilterModeInfo(currentMode); FilterModeInfo info = getFilterModeInfo(currentMode);
removeFilters(filterModel, color, info.attr); 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)); filterModel->addFilter(new CardFilter(color, info.includeType, info.attr));
} }
} }
@ -153,7 +168,7 @@ void VisualDatabaseDisplayColorFilterWidget::removeFilter(QChar color)
removeFilters(filterModel, color, info.attr); removeFilters(filterModel, color, info.attr);
// Add exclusion filters if the mode demands it. // 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)); filterModel->addFilter(new CardFilter(color, info.excludeType, info.attr));
} }
} }
@ -220,14 +235,15 @@ void VisualDatabaseDisplayColorFilterWidget::syncWithFilterModel()
bool modeImpossible[modeCount] = {}; bool modeImpossible[modeCount] = {};
QList<const CardFilter *> filters; QList<const CardFilter *> filters;
filters.append(filterModel->getFiltersOfType(CardFilter::AttrColor)); filters.append(filterModel->getFiltersOfType(CardFilter::Attr::AttrColor));
filters.append(filterModel->getFiltersOfType(CardFilter::AttrColorIdentity)); filters.append(filterModel->getFiltersOfType(CardFilter::Attr::AttrColorIdentity));
if (filters.empty()) { if (filters.empty()) {
// Remove the modes that should always contain filters. // Remove the modes that should always contain filters.
for (int i = 0; i < modeCount; ++i) { for (int i = 0; i < modeCount; ++i) {
FilterModeInfo modeInfo = getFilterModeInfo(static_cast<FilterMode>(i)); FilterModeInfo modeInfo = getFilterModeInfo(static_cast<FilterMode>(i));
if (modeInfo.includeType != CardFilter::TypeEnd && modeInfo.excludeType != CardFilter::TypeEnd) { if (modeInfo.includeType != CardFilter::Type::TypeEnd &&
modeInfo.excludeType != CardFilter::Type::TypeEnd) {
modeImpossible[i] = true; 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. // Update the mana symbol widgets by looking for the current mode's include or exclude filters.
const FilterModeInfo modeInfo = getFilterModeInfo(currentMode); 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; const CardFilter::Type filterType = useExclude ? modeInfo.excludeType : modeInfo.includeType;
filters = filterModel->getFiltersOfType(modeInfo.attr); filters = filterModel->getFiltersOfType(modeInfo.attr);

View file

@ -59,6 +59,7 @@ class VisualDatabaseDisplayColorFilterWidget : public QWidget
public: public:
explicit VisualDatabaseDisplayColorFilterWidget(QWidget *parent, FilterTreeModel *filterModel); explicit VisualDatabaseDisplayColorFilterWidget(QWidget *parent, FilterTreeModel *filterModel);
void retranslateUi(); void retranslateUi();
void setFilterMode(FilterMode filterMode);
signals: signals:
void filterModeChanged(FilterMode filterMode); void filterModeChanged(FilterMode filterMode);