mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-09-13 14:06:07 -04:00
Refactor Filter
Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
parent
79b7e277f1
commit
d41db5253e
@ -56,7 +56,6 @@ set(CORE_SOURCES
|
||||
|
||||
# String filters
|
||||
Filter.h
|
||||
Filter.cpp
|
||||
|
||||
# JSON parsing helpers
|
||||
Json.h
|
||||
|
@ -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);
|
||||
}
|
@ -3,59 +3,36 @@
|
||||
#include <QRegularExpression>
|
||||
#include <QString>
|
||||
|
||||
class Filter {
|
||||
public:
|
||||
virtual ~Filter() = default;
|
||||
virtual bool accepts(const QString& value) = 0;
|
||||
};
|
||||
using Filter = std::function<bool(const QString&)>;
|
||||
|
||||
class ContainsFilter : public Filter {
|
||||
public:
|
||||
ContainsFilter(const QString& pattern);
|
||||
virtual ~ContainsFilter() = default;
|
||||
bool accepts(const QString& value) override;
|
||||
namespace Filters {
|
||||
inline Filter inverse(Filter filter)
|
||||
{
|
||||
return [filter = std::move(filter)](const QString& src) { return !filter(src); };
|
||||
}
|
||||
|
||||
private:
|
||||
QString pattern;
|
||||
};
|
||||
inline Filter contains(QString pattern)
|
||||
{
|
||||
return [pattern = std::move(pattern)](const QString& src) { return src.contains(pattern); };
|
||||
}
|
||||
|
||||
class ExactFilter : public Filter {
|
||||
public:
|
||||
ExactFilter(const QString& pattern);
|
||||
virtual ~ExactFilter() = default;
|
||||
bool accepts(const QString& value) override;
|
||||
inline Filter equals(QString pattern)
|
||||
{
|
||||
return [pattern = std::move(pattern)](const QString& src) { return src == pattern; };
|
||||
}
|
||||
|
||||
private:
|
||||
QString pattern;
|
||||
};
|
||||
inline Filter equalsAny(QStringList patterns = {})
|
||||
{
|
||||
return [patterns = std::move(patterns)](const QString& src) { return patterns.isEmpty() || patterns.contains(src); };
|
||||
}
|
||||
|
||||
class ExactIfPresentFilter : public Filter {
|
||||
public:
|
||||
ExactIfPresentFilter(const QString& pattern);
|
||||
virtual ~ExactIfPresentFilter() override = default;
|
||||
bool accepts(const QString& value) override;
|
||||
inline Filter equalsOrEmpty(QString pattern)
|
||||
{
|
||||
return [pattern = std::move(pattern)](const QString& src) { return src.isEmpty() || src == pattern; };
|
||||
}
|
||||
|
||||
private:
|
||||
QString pattern;
|
||||
};
|
||||
|
||||
class RegexpFilter : public Filter {
|
||||
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;
|
||||
};
|
||||
inline Filter regexp(QRegularExpression pattern)
|
||||
{
|
||||
return [pattern = std::move(pattern)](const QString& src) { return pattern.match(src).hasMatch(); };
|
||||
}
|
||||
} // namespace Filters
|
||||
|
@ -51,7 +51,7 @@
|
||||
|
||||
namespace MMCZip {
|
||||
// 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());
|
||||
modZip.open(QuaZip::mdUnzip);
|
||||
|
@ -52,16 +52,16 @@
|
||||
#if defined(LAUNCHER_APPLICATION)
|
||||
#include "minecraft/mod/Mod.h"
|
||||
#endif
|
||||
#include "Filter.h"
|
||||
#include "tasks/Task.h"
|
||||
|
||||
namespace MMCZip {
|
||||
using FilterFunction = std::function<bool(const QString&)>;
|
||||
using FilterFileFunction = std::function<bool(const QFileInfo&)>;
|
||||
|
||||
/**
|
||||
* 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
|
||||
@ -178,7 +178,7 @@ class ExportToZipTask : public Task {
|
||||
QString destinationPrefix = "",
|
||||
bool followSymlinks = false,
|
||||
bool utf8Enabled = false)
|
||||
: ExportToZipTask(outputPath, QDir(dir), files, destinationPrefix, followSymlinks, utf8Enabled) {};
|
||||
: ExportToZipTask(outputPath, QDir(dir), files, destinationPrefix, followSymlinks, utf8Enabled){};
|
||||
|
||||
virtual ~ExportToZipTask() = default;
|
||||
|
||||
|
@ -63,7 +63,7 @@ class VersionFilterModel : public QSortFilterProxyModel {
|
||||
for (auto it = filters.begin(); it != filters.end(); ++it) {
|
||||
auto data = sourceModel()->data(idx, it.key());
|
||||
auto match = data.toString();
|
||||
if (!it.value()->accepts(match)) {
|
||||
if (!it.value()(match)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -380,9 +380,9 @@ void VersionProxyModel::clearFilters()
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -10,11 +10,11 @@ class VersionProxyModel : public QAbstractProxyModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
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:
|
||||
VersionProxyModel(QObject* parent = 0);
|
||||
virtual ~VersionProxyModel() {};
|
||||
virtual ~VersionProxyModel(){};
|
||||
|
||||
virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||
@ -28,7 +28,7 @@ class VersionProxyModel : public QAbstractProxyModel {
|
||||
|
||||
const FilterMap& filters() 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 clearFilters();
|
||||
QModelIndex getRecommended() const;
|
||||
|
@ -140,9 +140,9 @@ class InstallJavaPage : public QWidget, public BasePage {
|
||||
void recommendedFilterChanged()
|
||||
{
|
||||
if (m_recommend) {
|
||||
majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, new ExactListFilter(m_recommended_majors));
|
||||
majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, Filters::equalsAny(m_recommended_majors));
|
||||
} else {
|
||||
majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, new ExactListFilter());
|
||||
majorVersionSelect->setFilter(BaseVersionList::ModelRoles::JavaMajorRole, Filters::equalsAny());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,7 @@ void CustomPage::filterChanged()
|
||||
if (ui->experimentsFilter->isChecked())
|
||||
out << "(experiment)";
|
||||
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()
|
||||
|
@ -114,7 +114,7 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended)
|
||||
ui->setupUi(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);
|
||||
proxy->setSourceModel(m_versions_proxy);
|
||||
@ -152,9 +152,9 @@ ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended)
|
||||
connect(ui->liteLoader, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
|
||||
connect(ui->babric, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
|
||||
connect(ui->btaBabric, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
|
||||
|
||||
|
||||
connect(ui->showMoreButton, &QPushButton::clicked, this, &ModFilterWidget::onShowMoreClicked);
|
||||
|
||||
|
||||
if (!extended) {
|
||||
ui->showMoreButton->setVisible(false);
|
||||
ui->extendedModLoadersWidget->setVisible(false);
|
||||
@ -253,7 +253,7 @@ void ModFilterWidget::onShowAllVersionsChanged()
|
||||
if (ui->showAllVersions->isChecked())
|
||||
m_versions_proxy->clearFilters();
|
||||
else
|
||||
m_versions_proxy->setFilter(BaseVersionList::TypeRole, new ExactFilter("release"));
|
||||
m_versions_proxy->setFilter(BaseVersionList::TypeRole, Filters::equals("release"));
|
||||
}
|
||||
|
||||
void ModFilterWidget::onVersionFilterChanged(int)
|
||||
|
@ -224,20 +224,20 @@ BaseVersion::Ptr VersionSelectWidget::selectedVersion() const
|
||||
|
||||
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)
|
||||
{
|
||||
m_proxyModel->setFilter(role, new ExactFilter(filter));
|
||||
m_proxyModel->setFilter(role, Filters::equals(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);
|
||||
}
|
||||
|
@ -39,13 +39,13 @@
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QWidget>
|
||||
#include "BaseVersionList.h"
|
||||
#include "Filter.h"
|
||||
#include "VersionListView.h"
|
||||
|
||||
class VersionProxyModel;
|
||||
class VersionListView;
|
||||
class QVBoxLayout;
|
||||
class QProgressBar;
|
||||
class Filter;
|
||||
|
||||
class VersionSelectWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
@ -70,7 +70,7 @@ class VersionSelectWidget : public QWidget {
|
||||
void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter);
|
||||
void setExactFilter(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 setEmptyErrorString(QString emptyErrorString);
|
||||
void setEmptyMode(VersionListView::EmptyMode mode);
|
||||
|
Loading…
x
Reference in New Issue
Block a user