mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-09-14 14:36:11 -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
|
# String filters
|
||||||
Filter.h
|
Filter.h
|
||||||
Filter.cpp
|
|
||||||
|
|
||||||
# JSON parsing helpers
|
# JSON parsing helpers
|
||||||
Json.h
|
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 <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;
|
|
||||||
};
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user