mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-09-15 06:55:02 -04:00
Refactor Filter API (#4039)
This commit is contained in:
commit
542ab62ab7
@ -46,8 +46,6 @@
|
||||
#include "DataMigrationTask.h"
|
||||
#include "java/JavaInstallList.h"
|
||||
#include "net/PasteUpload.h"
|
||||
#include "pathmatcher/MultiMatcher.h"
|
||||
#include "pathmatcher/SimplePrefixMatcher.h"
|
||||
#include "tasks/Task.h"
|
||||
#include "tools/GenericProfiler.h"
|
||||
#include "ui/InstanceWindow.h"
|
||||
@ -1985,22 +1983,23 @@ bool Application::handleDataMigration(const QString& currentData,
|
||||
|
||||
if (!currentExists) {
|
||||
// Migrate!
|
||||
auto matcher = std::make_shared<MultiMatcher>();
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>(configFile));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>(
|
||||
BuildConfig.LAUNCHER_CONFIGFILE)); // it's possible that we already used that directory before
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("logs/"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("accounts.json"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("accounts/"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("assets/"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("icons/"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("instances/"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("libraries/"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("mods/"));
|
||||
matcher->add(std::make_shared<SimplePrefixMatcher>("themes/"));
|
||||
using namespace Filters;
|
||||
|
||||
QList<Filter> filters;
|
||||
filters.append(equals(configFile));
|
||||
filters.append(equals(BuildConfig.LAUNCHER_CONFIGFILE)); // it's possible that we already used that directory before
|
||||
filters.append(startsWith("logs/"));
|
||||
filters.append(equals("accounts.json"));
|
||||
filters.append(startsWith("accounts/"));
|
||||
filters.append(startsWith("assets/"));
|
||||
filters.append(startsWith("icons/"));
|
||||
filters.append(startsWith("instances/"));
|
||||
filters.append(startsWith("libraries/"));
|
||||
filters.append(startsWith("mods/"));
|
||||
filters.append(startsWith("themes/"));
|
||||
|
||||
ProgressDialog diag;
|
||||
DataMigrationTask task(oldData, currentData, matcher);
|
||||
DataMigrationTask task(oldData, currentData, any(std::move(filters)));
|
||||
if (diag.execWithTask(&task)) {
|
||||
qDebug() << "<> Migration succeeded";
|
||||
setDoNotMigrate();
|
||||
|
@ -52,7 +52,6 @@
|
||||
#include "BaseVersionList.h"
|
||||
#include "MessageLevel.h"
|
||||
#include "minecraft/auth/MinecraftAccount.h"
|
||||
#include "pathmatcher/IPathMatcher.h"
|
||||
#include "settings/INIFile.h"
|
||||
|
||||
#include "net/Mode.h"
|
||||
|
@ -56,7 +56,6 @@ set(CORE_SOURCES
|
||||
|
||||
# String filters
|
||||
Filter.h
|
||||
Filter.cpp
|
||||
|
||||
# JSON parsing helpers
|
||||
Json.h
|
||||
@ -108,15 +107,6 @@ if (UNIX AND NOT CYGWIN AND NOT APPLE)
|
||||
)
|
||||
endif()
|
||||
|
||||
set(PATHMATCHER_SOURCES
|
||||
# Path matchers
|
||||
pathmatcher/FSTreeMatcher.h
|
||||
pathmatcher/IPathMatcher.h
|
||||
pathmatcher/MultiMatcher.h
|
||||
pathmatcher/RegexpMatcher.h
|
||||
pathmatcher/SimplePrefixMatcher.h
|
||||
)
|
||||
|
||||
set(NET_SOURCES
|
||||
# network stuffs
|
||||
net/ByteArraySink.h
|
||||
@ -760,7 +750,6 @@ endif()
|
||||
|
||||
set(LOGIC_SOURCES
|
||||
${CORE_SOURCES}
|
||||
${PATHMATCHER_SOURCES}
|
||||
${NET_SOURCES}
|
||||
${LAUNCH_SOURCES}
|
||||
${UPDATE_SOURCES}
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
#include <QtConcurrent>
|
||||
|
||||
DataMigrationTask::DataMigrationTask(const QString& sourcePath, const QString& targetPath, const IPathMatcher::Ptr pathMatcher)
|
||||
DataMigrationTask::DataMigrationTask(const QString& sourcePath, const QString& targetPath, Filter pathMatcher)
|
||||
: Task(), m_sourcePath(sourcePath), m_targetPath(targetPath), m_pathMatcher(pathMatcher), m_copy(sourcePath, targetPath)
|
||||
{
|
||||
m_copy.matcher(m_pathMatcher).whitelist(true);
|
||||
|
@ -5,7 +5,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "FileSystem.h"
|
||||
#include "pathmatcher/IPathMatcher.h"
|
||||
#include "Filter.h"
|
||||
#include "tasks/Task.h"
|
||||
|
||||
#include <QFuture>
|
||||
@ -18,7 +18,7 @@
|
||||
class DataMigrationTask : public Task {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DataMigrationTask(const QString& sourcePath, const QString& targetPath, IPathMatcher::Ptr pathmatcher);
|
||||
explicit DataMigrationTask(const QString& sourcePath, const QString& targetPath, Filter pathmatcher);
|
||||
~DataMigrationTask() override = default;
|
||||
|
||||
protected:
|
||||
@ -33,7 +33,7 @@ class DataMigrationTask : public Task {
|
||||
private:
|
||||
const QString& m_sourcePath;
|
||||
const QString& m_targetPath;
|
||||
const IPathMatcher::Ptr m_pathMatcher;
|
||||
const Filter m_pathMatcher;
|
||||
|
||||
FS::copy m_copy;
|
||||
int m_toCopy = 0;
|
||||
|
@ -331,7 +331,7 @@ bool copy::operator()(const QString& offset, bool dryRun)
|
||||
|
||||
// Function that'll do the actual copying
|
||||
auto copy_file = [this, dryRun, src, dst, opt, &err](QString src_path, QString relative_dst_path) {
|
||||
if (m_matcher && (m_matcher->matches(relative_dst_path) != m_whitelist))
|
||||
if (m_matcher && (m_matcher(relative_dst_path) != m_whitelist))
|
||||
return;
|
||||
|
||||
auto dst_path = PathCombine(dst, relative_dst_path);
|
||||
@ -418,7 +418,7 @@ void create_link::make_link_list(const QString& offset)
|
||||
|
||||
// Function that'll do the actual linking
|
||||
auto link_file = [this, dst](QString src_path, QString relative_dst_path) {
|
||||
if (m_matcher && (m_matcher->matches(relative_dst_path) != m_whitelist)) {
|
||||
if (m_matcher && (m_matcher(relative_dst_path) != m_whitelist)) {
|
||||
qDebug() << "path" << relative_dst_path << "in black list or not in whitelist";
|
||||
return;
|
||||
}
|
||||
@ -1277,7 +1277,7 @@ bool clone::operator()(const QString& offset, bool dryRun)
|
||||
|
||||
// Function that'll do the actual cloneing
|
||||
auto cloneFile = [this, dryRun, dst, &err](QString src_path, QString relative_dst_path) {
|
||||
if (m_matcher && (m_matcher->matches(relative_dst_path) != m_whitelist))
|
||||
if (m_matcher && (m_matcher(relative_dst_path) != m_whitelist))
|
||||
return;
|
||||
|
||||
auto dst_path = PathCombine(dst, relative_dst_path);
|
||||
|
@ -38,7 +38,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "Exception.h"
|
||||
#include "pathmatcher/IPathMatcher.h"
|
||||
#include "Filter.h"
|
||||
|
||||
#include <system_error>
|
||||
|
||||
@ -115,9 +115,9 @@ class copy : public QObject {
|
||||
m_followSymlinks = follow;
|
||||
return *this;
|
||||
}
|
||||
copy& matcher(IPathMatcher::Ptr filter)
|
||||
copy& matcher(Filter filter)
|
||||
{
|
||||
m_matcher = filter;
|
||||
m_matcher = std::move(filter);
|
||||
return *this;
|
||||
}
|
||||
copy& whitelist(bool whitelist)
|
||||
@ -147,7 +147,7 @@ class copy : public QObject {
|
||||
|
||||
private:
|
||||
bool m_followSymlinks = true;
|
||||
IPathMatcher::Ptr m_matcher = nullptr;
|
||||
Filter m_matcher = nullptr;
|
||||
bool m_whitelist = false;
|
||||
bool m_overwrite = false;
|
||||
QDir m_src;
|
||||
@ -209,9 +209,9 @@ class create_link : public QObject {
|
||||
m_useHardLinks = useHard;
|
||||
return *this;
|
||||
}
|
||||
create_link& matcher(IPathMatcher::Ptr filter)
|
||||
create_link& matcher(Filter filter)
|
||||
{
|
||||
m_matcher = filter;
|
||||
m_matcher = std::move(filter);
|
||||
return *this;
|
||||
}
|
||||
create_link& whitelist(bool whitelist)
|
||||
@ -260,7 +260,7 @@ class create_link : public QObject {
|
||||
|
||||
private:
|
||||
bool m_useHardLinks = false;
|
||||
IPathMatcher::Ptr m_matcher = nullptr;
|
||||
Filter m_matcher = nullptr;
|
||||
bool m_whitelist = false;
|
||||
bool m_recursive = true;
|
||||
|
||||
@ -492,9 +492,9 @@ class clone : public QObject {
|
||||
m_src.setPath(src);
|
||||
m_dst.setPath(dst);
|
||||
}
|
||||
clone& matcher(IPathMatcher::Ptr filter)
|
||||
clone& matcher(Filter filter)
|
||||
{
|
||||
m_matcher = filter;
|
||||
m_matcher = std::move(filter);
|
||||
return *this;
|
||||
}
|
||||
clone& whitelist(bool whitelist)
|
||||
@ -518,7 +518,7 @@ class clone : public QObject {
|
||||
bool operator()(const QString& offset, bool dryRun = false);
|
||||
|
||||
private:
|
||||
IPathMatcher::Ptr m_matcher = nullptr;
|
||||
Filter m_matcher = nullptr;
|
||||
bool m_whitelist = false;
|
||||
QDir m_src;
|
||||
QDir m_dst;
|
||||
|
@ -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,52 @@
|
||||
#include <QRegularExpression>
|
||||
#include <QString>
|
||||
|
||||
class Filter {
|
||||
public:
|
||||
virtual ~Filter() = default;
|
||||
virtual bool accepts(const QString& value) = 0;
|
||||
using Filter = std::function<bool(const QString&)>;
|
||||
|
||||
namespace Filters {
|
||||
inline Filter inverse(Filter filter)
|
||||
{
|
||||
return [filter = std::move(filter)](const QString& src) { return !filter(src); };
|
||||
}
|
||||
|
||||
inline Filter any(QList<Filter> filters)
|
||||
{
|
||||
return [filters = std::move(filters)](const QString& src) {
|
||||
for (auto& filter : filters)
|
||||
if (filter(src))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
class ContainsFilter : public Filter {
|
||||
public:
|
||||
ContainsFilter(const QString& pattern);
|
||||
virtual ~ContainsFilter() = 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 ExactFilter : public Filter {
|
||||
public:
|
||||
ExactFilter(const QString& pattern);
|
||||
virtual ~ExactFilter() = 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;
|
||||
};
|
||||
inline Filter contains(QString pattern)
|
||||
{
|
||||
return [pattern = std::move(pattern)](const QString& src) { return src.contains(pattern); };
|
||||
}
|
||||
|
||||
class ExactIfPresentFilter : public Filter {
|
||||
public:
|
||||
ExactIfPresentFilter(const QString& pattern);
|
||||
virtual ~ExactIfPresentFilter() override = default;
|
||||
bool accepts(const QString& value) override;
|
||||
inline Filter startsWith(QString pattern)
|
||||
{
|
||||
return [pattern = std::move(pattern)](const QString& src) { return src.startsWith(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
|
||||
|
@ -3,8 +3,8 @@
|
||||
#include <QtConcurrentRun>
|
||||
#include <memory>
|
||||
#include "FileSystem.h"
|
||||
#include "Filter.h"
|
||||
#include "NullInstance.h"
|
||||
#include "pathmatcher/RegexpMatcher.h"
|
||||
#include "settings/INISettingsObject.h"
|
||||
#include "tasks/Task.h"
|
||||
|
||||
@ -30,9 +30,8 @@ InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, const InstanceCopyP
|
||||
if (!filters.isEmpty()) {
|
||||
// Set regex filter:
|
||||
// FIXME: get this from the original instance type...
|
||||
auto matcherReal = new RegexpMatcher(filters);
|
||||
matcherReal->caseSensitive(false);
|
||||
m_matcher.reset(matcherReal);
|
||||
QRegularExpression regexp(filters, QRegularExpression::CaseInsensitiveOption);
|
||||
m_matcher = Filters::regexp(regexp);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <QUrl>
|
||||
#include "BaseInstance.h"
|
||||
#include "BaseVersion.h"
|
||||
#include "Filter.h"
|
||||
#include "InstanceCopyPrefs.h"
|
||||
#include "InstanceTask.h"
|
||||
#include "net/NetJob.h"
|
||||
@ -28,7 +29,7 @@ class InstanceCopyTask : public InstanceTask {
|
||||
InstancePtr m_origInstance;
|
||||
QFuture<bool> m_copyFuture;
|
||||
QFutureWatcher<bool> m_copyFutureWatcher;
|
||||
IPathMatcher::Ptr m_matcher;
|
||||
Filter m_matcher;
|
||||
bool m_keepPlaytime;
|
||||
bool m_useLinks = false;
|
||||
bool m_useHardLinks = false;
|
||||
|
@ -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
|
||||
|
@ -78,7 +78,7 @@ QStringList RecursiveFileSystemWatcher::scanRecursive(const QDir& directory)
|
||||
}
|
||||
for (const QString& file : directory.entryList(QDir::Files | QDir::Hidden)) {
|
||||
auto relPath = m_root.relativeFilePath(directory.absoluteFilePath(file));
|
||||
if (m_matcher->matches(relPath)) {
|
||||
if (m_matcher(relPath)) {
|
||||
ret.append(relPath);
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
#include <QDir>
|
||||
#include <QFileSystemWatcher>
|
||||
#include "pathmatcher/IPathMatcher.h"
|
||||
#include "Filter.h"
|
||||
|
||||
class RecursiveFileSystemWatcher : public QObject {
|
||||
Q_OBJECT
|
||||
@ -16,7 +16,7 @@ class RecursiveFileSystemWatcher : public QObject {
|
||||
void setWatchFiles(bool watchFiles);
|
||||
bool watchFiles() const { return m_watchFiles; }
|
||||
|
||||
void setMatcher(IPathMatcher::Ptr matcher) { m_matcher = matcher; }
|
||||
void setMatcher(Filter matcher) { m_matcher = std::move(matcher); }
|
||||
|
||||
QStringList files() const { return m_files; }
|
||||
|
||||
@ -32,7 +32,7 @@ class RecursiveFileSystemWatcher : public QObject {
|
||||
QDir m_root;
|
||||
bool m_watchFiles = false;
|
||||
bool m_isEnabled = false;
|
||||
IPathMatcher::Ptr m_matcher;
|
||||
Filter m_matcher;
|
||||
|
||||
QFileSystemWatcher* m_watcher;
|
||||
|
||||
|
@ -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,7 +10,7 @@ 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);
|
||||
@ -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;
|
||||
|
@ -53,7 +53,6 @@
|
||||
#include "FileSystem.h"
|
||||
#include "MMCTime.h"
|
||||
#include "java/JavaVersion.h"
|
||||
#include "pathmatcher/MultiMatcher.h"
|
||||
|
||||
#include "launch/LaunchTask.h"
|
||||
#include "launch/TaskStepWrapper.h"
|
||||
|
@ -1,14 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <SeparatorPrefixTree.h>
|
||||
#include "IPathMatcher.h"
|
||||
|
||||
class FSTreeMatcher : public IPathMatcher {
|
||||
public:
|
||||
virtual ~FSTreeMatcher() {};
|
||||
FSTreeMatcher(SeparatorPrefixTree<'/'>& tree) : m_fsTree(tree) {}
|
||||
|
||||
bool matches(const QString& string) const override { return m_fsTree.covers(string); }
|
||||
|
||||
SeparatorPrefixTree<'/'>& m_fsTree;
|
||||
};
|
@ -1,12 +0,0 @@
|
||||
#pragma once
|
||||
#include <QString>
|
||||
#include <memory>
|
||||
|
||||
class IPathMatcher {
|
||||
public:
|
||||
using Ptr = std::shared_ptr<IPathMatcher>;
|
||||
|
||||
public:
|
||||
virtual ~IPathMatcher() {}
|
||||
virtual bool matches(const QString& string) const = 0;
|
||||
};
|
@ -1,27 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <SeparatorPrefixTree.h>
|
||||
#include "IPathMatcher.h"
|
||||
|
||||
class MultiMatcher : public IPathMatcher {
|
||||
public:
|
||||
virtual ~MultiMatcher() {};
|
||||
MultiMatcher() {}
|
||||
MultiMatcher& add(Ptr add)
|
||||
{
|
||||
m_matchers.append(add);
|
||||
return *this;
|
||||
}
|
||||
|
||||
virtual bool matches(const QString& string) const override
|
||||
{
|
||||
for (auto iter : m_matchers) {
|
||||
if (iter->matches(string)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QList<Ptr> m_matchers;
|
||||
};
|
@ -1,40 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <QRegularExpression>
|
||||
#include "IPathMatcher.h"
|
||||
|
||||
class RegexpMatcher : public IPathMatcher {
|
||||
public:
|
||||
virtual ~RegexpMatcher() {}
|
||||
RegexpMatcher(const QString& regexp)
|
||||
{
|
||||
m_regexp.setPattern(regexp);
|
||||
m_onlyFilenamePart = !regexp.contains('/');
|
||||
}
|
||||
|
||||
RegexpMatcher(const QRegularExpression& regex) : m_regexp(regex) { m_onlyFilenamePart = !regex.pattern().contains('/'); }
|
||||
|
||||
RegexpMatcher& caseSensitive(bool cs = true)
|
||||
{
|
||||
if (cs) {
|
||||
m_regexp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
|
||||
} else {
|
||||
m_regexp.setPatternOptions(QRegularExpression::NoPatternOption);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
virtual bool matches(const QString& string) const override
|
||||
{
|
||||
if (m_onlyFilenamePart) {
|
||||
auto slash = string.lastIndexOf('/');
|
||||
if (slash != -1) {
|
||||
auto part = string.mid(slash + 1);
|
||||
return m_regexp.match(part).hasMatch();
|
||||
}
|
||||
}
|
||||
return m_regexp.match(string).hasMatch();
|
||||
}
|
||||
QRegularExpression m_regexp;
|
||||
bool m_onlyFilenamePart = false;
|
||||
};
|
@ -1,24 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022 Sefa Eyeoglu <contact@scrumplex.net>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
#include "IPathMatcher.h"
|
||||
|
||||
class SimplePrefixMatcher : public IPathMatcher {
|
||||
public:
|
||||
virtual ~SimplePrefixMatcher() {};
|
||||
SimplePrefixMatcher(const QString& prefix)
|
||||
{
|
||||
m_prefix = prefix;
|
||||
m_isPrefix = prefix.endsWith('/');
|
||||
}
|
||||
|
||||
virtual bool matches(const QString& string) const override
|
||||
{
|
||||
if (m_isPrefix)
|
||||
return string.startsWith(m_prefix);
|
||||
return string == m_prefix;
|
||||
}
|
||||
QString m_prefix;
|
||||
bool m_isPrefix = false;
|
||||
};
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,6 @@
|
||||
#include <QWidget>
|
||||
|
||||
#include <Application.h>
|
||||
#include <pathmatcher/IPathMatcher.h>
|
||||
#include <QFileSystemWatcher>
|
||||
#include "LogPage.h"
|
||||
#include "ui/pages/BasePage.h"
|
||||
|
@ -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);
|
||||
@ -256,7 +256,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);
|
||||
|
@ -12,8 +12,6 @@
|
||||
#include <filesystem>
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
#include <pathmatcher/RegexpMatcher.h>
|
||||
|
||||
class LinkTask : public Task {
|
||||
Q_OBJECT
|
||||
|
||||
@ -27,7 +25,7 @@ class LinkTask : public Task {
|
||||
|
||||
~LinkTask() { delete m_lnk; }
|
||||
|
||||
void matcher(IPathMatcher::Ptr filter) { m_lnk->matcher(filter); }
|
||||
void matcher(Filter filter) { m_lnk->matcher(filter); }
|
||||
|
||||
void linkRecursively(bool recursive)
|
||||
{
|
||||
@ -190,7 +188,7 @@ class FileSystemTest : public QObject {
|
||||
qDebug() << tempDir.path();
|
||||
qDebug() << target_dir.path();
|
||||
FS::copy c(folder, target_dir.path());
|
||||
RegexpMatcher::Ptr re = std::make_shared<RegexpMatcher>("[.]?mcmeta");
|
||||
auto re = Filters::regexp(QRegularExpression("[.]?mcmeta"));
|
||||
c.matcher(re);
|
||||
c();
|
||||
|
||||
@ -223,7 +221,7 @@ class FileSystemTest : public QObject {
|
||||
qDebug() << tempDir.path();
|
||||
qDebug() << target_dir.path();
|
||||
FS::copy c(folder, target_dir.path());
|
||||
RegexpMatcher::Ptr re = std::make_shared<RegexpMatcher>("[.]?mcmeta");
|
||||
auto re = Filters::regexp(QRegularExpression("[.]?mcmeta"));
|
||||
c.matcher(re);
|
||||
c.whitelist(true);
|
||||
c();
|
||||
@ -415,7 +413,7 @@ class FileSystemTest : public QObject {
|
||||
qDebug() << target_dir.path();
|
||||
|
||||
LinkTask lnk_tsk(folder, target_dir.path());
|
||||
RegexpMatcher::Ptr re = std::make_shared<RegexpMatcher>("[.]?mcmeta");
|
||||
auto re = Filters::regexp(QRegularExpression("[.]?mcmeta"));
|
||||
lnk_tsk.matcher(re);
|
||||
lnk_tsk.linkRecursively(true);
|
||||
connect(&lnk_tsk, &Task::finished,
|
||||
@ -461,7 +459,7 @@ class FileSystemTest : public QObject {
|
||||
qDebug() << target_dir.path();
|
||||
|
||||
LinkTask lnk_tsk(folder, target_dir.path());
|
||||
RegexpMatcher::Ptr re = std::make_shared<RegexpMatcher>("[.]?mcmeta");
|
||||
auto re = Filters::regexp(QRegularExpression("[.]?mcmeta"));
|
||||
lnk_tsk.matcher(re);
|
||||
lnk_tsk.linkRecursively(true);
|
||||
lnk_tsk.whitelist(true);
|
||||
|
Loading…
x
Reference in New Issue
Block a user