Refactor Filter

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
TheKodeToad 2025-08-04 14:02:54 +01:00
parent 79b7e277f1
commit d41db5253e
No known key found for this signature in database
GPG Key ID: 5E39D70B4C93C38E
12 changed files with 50 additions and 111 deletions

View File

@ -56,7 +56,6 @@ set(CORE_SOURCES
# String filters # String filters
Filter.h Filter.h
Filter.cpp
# JSON parsing helpers # JSON parsing helpers
Json.h Json.h

View File

@ -1,37 +0,0 @@
#include "Filter.h"
ContainsFilter::ContainsFilter(const QString& pattern) : pattern(pattern) {}
bool ContainsFilter::accepts(const QString& value)
{
return value.contains(pattern);
}
ExactFilter::ExactFilter(const QString& pattern) : pattern(pattern) {}
bool ExactFilter::accepts(const QString& value)
{
return value == pattern;
}
ExactIfPresentFilter::ExactIfPresentFilter(const QString& pattern) : pattern(pattern) {}
bool ExactIfPresentFilter::accepts(const QString& value)
{
return value.isEmpty() || value == pattern;
}
RegexpFilter::RegexpFilter(const QString& regexp, bool invert) : invert(invert)
{
pattern.setPattern(regexp);
pattern.optimize();
}
bool RegexpFilter::accepts(const QString& value)
{
auto match = pattern.match(value);
bool matched = match.hasMatch();
return invert ? (!matched) : (matched);
}
ExactListFilter::ExactListFilter(const QStringList& pattern) : m_pattern(pattern) {}
bool ExactListFilter::accepts(const QString& value)
{
return m_pattern.isEmpty() || m_pattern.contains(value);
}

View File

@ -3,59 +3,36 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QString> #include <QString>
class Filter { using Filter = std::function<bool(const QString&)>;
public:
virtual ~Filter() = default;
virtual bool accepts(const QString& value) = 0;
};
class ContainsFilter : public Filter { namespace Filters {
public: inline Filter inverse(Filter filter)
ContainsFilter(const QString& pattern); {
virtual ~ContainsFilter() = default; return [filter = std::move(filter)](const QString& src) { return !filter(src); };
bool accepts(const QString& value) override; }
private: inline Filter contains(QString pattern)
QString pattern; {
}; return [pattern = std::move(pattern)](const QString& src) { return src.contains(pattern); };
}
class ExactFilter : public Filter { inline Filter equals(QString pattern)
public: {
ExactFilter(const QString& pattern); return [pattern = std::move(pattern)](const QString& src) { return src == pattern; };
virtual ~ExactFilter() = default; }
bool accepts(const QString& value) override;
private: inline Filter equalsAny(QStringList patterns = {})
QString pattern; {
}; return [patterns = std::move(patterns)](const QString& src) { return patterns.isEmpty() || patterns.contains(src); };
}
class ExactIfPresentFilter : public Filter { inline Filter equalsOrEmpty(QString pattern)
public: {
ExactIfPresentFilter(const QString& pattern); return [pattern = std::move(pattern)](const QString& src) { return src.isEmpty() || src == pattern; };
virtual ~ExactIfPresentFilter() override = default; }
bool accepts(const QString& value) override;
private: inline Filter regexp(QRegularExpression pattern)
QString pattern; {
}; return [pattern = std::move(pattern)](const QString& src) { return pattern.match(src).hasMatch(); };
}
class RegexpFilter : public Filter { } // namespace Filters
public:
RegexpFilter(const QString& regexp, bool invert);
virtual ~RegexpFilter() = default;
bool accepts(const QString& value) override;
private:
QRegularExpression pattern;
bool invert = false;
};
class ExactListFilter : public Filter {
public:
ExactListFilter(const QStringList& pattern = {});
virtual ~ExactListFilter() = default;
bool accepts(const QString& value) override;
private:
QStringList m_pattern;
};

View File

@ -51,7 +51,7 @@
namespace MMCZip { namespace MMCZip {
// ours // ours
bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet<QString>& contained, const FilterFunction& filter) bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet<QString>& contained, const Filter& filter)
{ {
QuaZip modZip(from.filePath()); QuaZip modZip(from.filePath());
modZip.open(QuaZip::mdUnzip); modZip.open(QuaZip::mdUnzip);

View File

@ -52,16 +52,16 @@
#if defined(LAUNCHER_APPLICATION) #if defined(LAUNCHER_APPLICATION)
#include "minecraft/mod/Mod.h" #include "minecraft/mod/Mod.h"
#endif #endif
#include "Filter.h"
#include "tasks/Task.h" #include "tasks/Task.h"
namespace MMCZip { namespace MMCZip {
using FilterFunction = std::function<bool(const QString&)>;
using FilterFileFunction = std::function<bool(const QFileInfo&)>; using FilterFileFunction = std::function<bool(const QFileInfo&)>;
/** /**
* Merge two zip files, using a filter function * Merge two zip files, using a filter function
*/ */
bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet<QString>& contained, const FilterFunction& filter = nullptr); bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet<QString>& contained, const Filter& filter = nullptr);
/** /**
* Compress directory, by providing a list of files to compress * Compress directory, by providing a list of files to compress

View File

@ -63,7 +63,7 @@ class VersionFilterModel : public QSortFilterProxyModel {
for (auto it = filters.begin(); it != filters.end(); ++it) { for (auto it = filters.begin(); it != filters.end(); ++it) {
auto data = sourceModel()->data(idx, it.key()); auto data = sourceModel()->data(idx, it.key());
auto match = data.toString(); auto match = data.toString();
if (!it.value()->accepts(match)) { if (!it.value()(match)) {
return false; return false;
} }
} }
@ -380,9 +380,9 @@ void VersionProxyModel::clearFilters()
filterModel->filterChanged(); filterModel->filterChanged();
} }
void VersionProxyModel::setFilter(const BaseVersionList::ModelRoles column, Filter* f) void VersionProxyModel::setFilter(const BaseVersionList::ModelRoles column, Filter f)
{ {
m_filters[column].reset(f); m_filters[column] = std::move(f);
filterModel->filterChanged(); filterModel->filterChanged();
} }

View File

@ -10,7 +10,7 @@ class VersionProxyModel : public QAbstractProxyModel {
Q_OBJECT Q_OBJECT
public: public:
enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName, JavaMajor }; enum Column { Name, ParentVersion, Branch, Type, CPUArchitecture, Path, Time, JavaName, JavaMajor };
using FilterMap = QHash<BaseVersionList::ModelRoles, std::shared_ptr<Filter>>; using FilterMap = QHash<BaseVersionList::ModelRoles, Filter>;
public: public:
VersionProxyModel(QObject* parent = 0); VersionProxyModel(QObject* parent = 0);
@ -28,7 +28,7 @@ class VersionProxyModel : public QAbstractProxyModel {
const FilterMap& filters() const; const FilterMap& filters() const;
const QString& search() const; const QString& search() const;
void setFilter(BaseVersionList::ModelRoles column, Filter* filter); void setFilter(BaseVersionList::ModelRoles column, Filter filter);
void setSearch(const QString& search); void setSearch(const QString& search);
void clearFilters(); void clearFilters();
QModelIndex getRecommended() const; QModelIndex getRecommended() const;

View File

@ -140,9 +140,9 @@ class InstallJavaPage : public QWidget, public BasePage {
void recommendedFilterChanged() void recommendedFilterChanged()
{ {
if (m_recommend) { if (m_recommend) {
majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, new ExactListFilter(m_recommended_majors)); majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, Filters::equalsAny(m_recommended_majors));
} else { } else {
majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, new ExactListFilter()); majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, Filters::equalsAny());
} }
} }

View File

@ -104,7 +104,7 @@ void CustomPage::filterChanged()
if (ui->experimentsFilter->isChecked()) if (ui->experimentsFilter->isChecked())
out << "(experiment)"; out << "(experiment)";
auto regexp = out.join('|'); auto regexp = out.join('|');
ui->versionList->setFilter(BaseVersionList::TypeRole, new RegexpFilter(regexp, false)); ui->versionList->setFilter(BaseVersionList::TypeRole, Filters::regexp(QRegularExpression(regexp)));
} }
void CustomPage::loaderFilterChanged() void CustomPage::loaderFilterChanged()

View File

@ -114,7 +114,7 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended)
ui->setupUi(this); ui->setupUi(this);
m_versions_proxy = new VersionProxyModel(this); m_versions_proxy = new VersionProxyModel(this);
m_versions_proxy->setFilter(BaseVersionList::TypeRole, new ExactFilter("release")); m_versions_proxy->setFilter(BaseVersionList::TypeRole, Filters::equals("release"));
QAbstractProxyModel* proxy = new VersionBasicModel(this); QAbstractProxyModel* proxy = new VersionBasicModel(this);
proxy->setSourceModel(m_versions_proxy); proxy->setSourceModel(m_versions_proxy);
@ -253,7 +253,7 @@ void ModFilterWidget::onShowAllVersionsChanged()
if (ui->showAllVersions->isChecked()) if (ui->showAllVersions->isChecked())
m_versions_proxy->clearFilters(); m_versions_proxy->clearFilters();
else else
m_versions_proxy->setFilter(BaseVersionList::TypeRole, new ExactFilter("release")); m_versions_proxy->setFilter(BaseVersionList::TypeRole, Filters::equals("release"));
} }
void ModFilterWidget::onVersionFilterChanged(int) void ModFilterWidget::onVersionFilterChanged(int)

View File

@ -224,20 +224,20 @@ BaseVersion::Ptr VersionSelectWidget::selectedVersion() const
void VersionSelectWidget::setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter) void VersionSelectWidget::setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter)
{ {
m_proxyModel->setFilter(role, new ContainsFilter(filter)); m_proxyModel->setFilter(role, Filters::contains(filter));
} }
void VersionSelectWidget::setExactFilter(BaseVersionList::ModelRoles role, QString filter) void VersionSelectWidget::setExactFilter(BaseVersionList::ModelRoles role, QString filter)
{ {
m_proxyModel->setFilter(role, new ExactFilter(filter)); m_proxyModel->setFilter(role, Filters::equals(filter));
} }
void VersionSelectWidget::setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter) void VersionSelectWidget::setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter)
{ {
m_proxyModel->setFilter(role, new ExactIfPresentFilter(filter)); m_proxyModel->setFilter(role, Filters::equalsOrEmpty(filter));
} }
void VersionSelectWidget::setFilter(BaseVersionList::ModelRoles role, Filter* filter) void VersionSelectWidget::setFilter(BaseVersionList::ModelRoles role, Filter filter)
{ {
m_proxyModel->setFilter(role, filter); m_proxyModel->setFilter(role, filter);
} }

View File

@ -39,13 +39,13 @@
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QWidget> #include <QWidget>
#include "BaseVersionList.h" #include "BaseVersionList.h"
#include "Filter.h"
#include "VersionListView.h" #include "VersionListView.h"
class VersionProxyModel; class VersionProxyModel;
class VersionListView; class VersionListView;
class QVBoxLayout; class QVBoxLayout;
class QProgressBar; class QProgressBar;
class Filter;
class VersionSelectWidget : public QWidget { class VersionSelectWidget : public QWidget {
Q_OBJECT Q_OBJECT
@ -70,7 +70,7 @@ class VersionSelectWidget : public QWidget {
void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter); void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter);
void setExactFilter(BaseVersionList::ModelRoles role, QString filter); void setExactFilter(BaseVersionList::ModelRoles role, QString filter);
void setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter); void setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter);
void setFilter(BaseVersionList::ModelRoles role, Filter* filter); void setFilter(BaseVersionList::ModelRoles role, Filter filter);
void setEmptyString(QString emptyString); void setEmptyString(QString emptyString);
void setEmptyErrorString(QString emptyErrorString); void setEmptyErrorString(QString emptyErrorString);
void setEmptyMode(VersionListView::EmptyMode mode); void setEmptyMode(VersionListView::EmptyMode mode);