Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into settings
This commit is contained in:
commit
cf2393a509
@ -40,6 +40,7 @@
|
|||||||
#include <QFileSystemModel>
|
#include <QFileSystemModel>
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
#include <QStack>
|
#include <QStack>
|
||||||
|
#include <algorithm>
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
#include "SeparatorPrefixTree.h"
|
#include "SeparatorPrefixTree.h"
|
||||||
#include "StringUtils.h"
|
#include "StringUtils.h"
|
||||||
@ -254,3 +255,25 @@ bool FileIgnoreProxy::filterAcceptsColumn(int source_column, const QModelIndex&
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FileIgnoreProxy::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const
|
||||||
|
{
|
||||||
|
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
|
||||||
|
QFileSystemModel* fsm = qobject_cast<QFileSystemModel*>(sourceModel());
|
||||||
|
|
||||||
|
auto fileInfo = fsm->fileInfo(index);
|
||||||
|
return !ignoreFile(fileInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FileIgnoreProxy::ignoreFile(QFileInfo fileInfo) const
|
||||||
|
{
|
||||||
|
auto fileName = fileInfo.fileName();
|
||||||
|
auto path = relPath(fileInfo.absoluteFilePath());
|
||||||
|
return std::any_of(m_ignoreFiles.cbegin(), m_ignoreFiles.cend(), [fileName](auto iFileName) { return fileName == iFileName; }) ||
|
||||||
|
m_ignoreFilePaths.covers(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FileIgnoreProxy::filterFile(const QString& fileName) const
|
||||||
|
{
|
||||||
|
return blocked.covers(fileName) || ignoreFile(QFileInfo(QDir(root), fileName));
|
||||||
|
}
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <QFileInfo>
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
#include "SeparatorPrefixTree.h"
|
#include "SeparatorPrefixTree.h"
|
||||||
|
|
||||||
@ -63,10 +64,22 @@ class FileIgnoreProxy : public QSortFilterProxyModel {
|
|||||||
inline const SeparatorPrefixTree<'/'>& blockedPaths() const { return blocked; }
|
inline const SeparatorPrefixTree<'/'>& blockedPaths() const { return blocked; }
|
||||||
inline SeparatorPrefixTree<'/'>& blockedPaths() { return blocked; }
|
inline SeparatorPrefixTree<'/'>& blockedPaths() { return blocked; }
|
||||||
|
|
||||||
|
// list of file names that need to be removed completely from model
|
||||||
|
inline QStringList& ignoreFilesWithName() { return m_ignoreFiles; }
|
||||||
|
// list of relative paths that need to be removed completely from model
|
||||||
|
inline SeparatorPrefixTree<'/'>& ignoreFilesWithPath() { return m_ignoreFilePaths; }
|
||||||
|
|
||||||
|
bool filterFile(const QString& fileName) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const;
|
bool filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const;
|
||||||
|
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
|
||||||
|
|
||||||
|
bool ignoreFile(QFileInfo file) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QString root;
|
const QString root;
|
||||||
SeparatorPrefixTree<'/'> blocked;
|
SeparatorPrefixTree<'/'> blocked;
|
||||||
|
QStringList m_ignoreFiles;
|
||||||
|
SeparatorPrefixTree<'/'> m_ignoreFilePaths;
|
||||||
};
|
};
|
||||||
|
@ -102,7 +102,7 @@ namespace fs = ghc::filesystem;
|
|||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#elif defined(Q_OS_MACOS) || defined(Q_OS_OPENBSD)
|
#elif defined(Q_OS_MACOS)
|
||||||
#include <sys/attr.h>
|
#include <sys/attr.h>
|
||||||
#include <sys/clonefile.h>
|
#include <sys/clonefile.h>
|
||||||
#elif defined(Q_OS_WIN)
|
#elif defined(Q_OS_WIN)
|
||||||
@ -1156,7 +1156,7 @@ bool clone_file(const QString& src, const QString& dst, std::error_code& ec)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(Q_OS_MACOS) || defined(Q_OS_OPENBSD)
|
#elif defined(Q_OS_MACOS)
|
||||||
|
|
||||||
if (!macos_bsd_clonefile(src_path, dst_path, ec)) {
|
if (!macos_bsd_clonefile(src_path, dst_path, ec)) {
|
||||||
qDebug() << "failed macos_bsd_clonefile:";
|
qDebug() << "failed macos_bsd_clonefile:";
|
||||||
@ -1385,7 +1385,7 @@ bool linux_ficlone(const std::string& src_path, const std::string& dst_path, std
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(Q_OS_MACOS) || defined(Q_OS_OPENBSD)
|
#elif defined(Q_OS_MACOS)
|
||||||
|
|
||||||
bool macos_bsd_clonefile(const std::string& src_path, const std::string& dst_path, std::error_code& ec)
|
bool macos_bsd_clonefile(const std::string& src_path, const std::string& dst_path, std::error_code& ec)
|
||||||
{
|
{
|
||||||
|
@ -35,24 +35,26 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ExportInstanceDialog.h"
|
#include "ExportInstanceDialog.h"
|
||||||
#include "ui_ExportInstanceDialog.h"
|
|
||||||
#include <BaseInstance.h>
|
#include <BaseInstance.h>
|
||||||
#include <MMCZip.h>
|
#include <MMCZip.h>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QFileSystemModel>
|
#include <QFileSystemModel>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include "FileIgnoreProxy.h"
|
||||||
|
#include "ui_ExportInstanceDialog.h"
|
||||||
|
|
||||||
#include <QSortFilterProxyModel>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QSaveFile>
|
|
||||||
#include <QStack>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include "SeparatorPrefixTree.h"
|
|
||||||
#include "Application.h"
|
|
||||||
#include <icons/IconList.h>
|
|
||||||
#include <FileSystem.h>
|
#include <FileSystem.h>
|
||||||
|
#include <icons/IconList.h>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QSaveFile>
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
#include <QStack>
|
||||||
|
#include <functional>
|
||||||
|
#include "Application.h"
|
||||||
|
#include "SeparatorPrefixTree.h"
|
||||||
|
|
||||||
ExportInstanceDialog::ExportInstanceDialog(InstancePtr instance, QWidget *parent)
|
ExportInstanceDialog::ExportInstanceDialog(InstancePtr instance, QWidget* parent)
|
||||||
: QDialog(parent), ui(new Ui::ExportInstanceDialog), m_instance(instance)
|
: QDialog(parent), ui(new Ui::ExportInstanceDialog), m_instance(instance)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
@ -60,8 +62,12 @@ ExportInstanceDialog::ExportInstanceDialog(InstancePtr instance, QWidget *parent
|
|||||||
model->setIconProvider(&icons);
|
model->setIconProvider(&icons);
|
||||||
auto root = instance->instanceRoot();
|
auto root = instance->instanceRoot();
|
||||||
proxyModel = new FileIgnoreProxy(root, this);
|
proxyModel = new FileIgnoreProxy(root, this);
|
||||||
loadPackIgnore();
|
|
||||||
proxyModel->setSourceModel(model);
|
proxyModel->setSourceModel(model);
|
||||||
|
auto prefix = QDir(instance->instanceRoot()).relativeFilePath(instance->gameRoot());
|
||||||
|
proxyModel->ignoreFilesWithPath().insert({ FS::PathCombine(prefix, "logs"), FS::PathCombine(prefix, "crash-reports") });
|
||||||
|
proxyModel->ignoreFilesWithName().append({ ".DS_Store", "thumbs.db", "Thumbs.db" });
|
||||||
|
loadPackIgnore();
|
||||||
|
|
||||||
ui->treeView->setModel(proxyModel);
|
ui->treeView->setModel(proxyModel);
|
||||||
ui->treeView->setRootIndex(proxyModel->mapFromSource(model->index(root)));
|
ui->treeView->setRootIndex(proxyModel->mapFromSource(model->index(root)));
|
||||||
ui->treeView->sortByColumn(0, Qt::AscendingOrder);
|
ui->treeView->sortByColumn(0, Qt::AscendingOrder);
|
||||||
@ -133,11 +139,9 @@ bool ExportInstanceDialog::doExport()
|
|||||||
|
|
||||||
SaveIcon(m_instance);
|
SaveIcon(m_instance);
|
||||||
|
|
||||||
auto & blocked = proxyModel->blockedPaths();
|
|
||||||
using std::placeholders::_1;
|
|
||||||
auto files = QFileInfoList();
|
auto files = QFileInfoList();
|
||||||
if (!MMCZip::collectFileListRecursively(m_instance->instanceRoot(), nullptr, &files,
|
if (!MMCZip::collectFileListRecursively(m_instance->instanceRoot(), nullptr, &files,
|
||||||
std::bind(&SeparatorPrefixTree<'/'>::covers, blocked, _1))) {
|
std::bind(&FileIgnoreProxy::filterFile, proxyModel, std::placeholders::_1))) {
|
||||||
QMessageBox::warning(this, tr("Error"), tr("Unable to export instance"));
|
QMessageBox::warning(this, tr("Error"), tr("Unable to export instance"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -52,8 +52,9 @@ ExportMrPackDialog::ExportMrPackDialog(InstancePtr instance, QWidget* parent)
|
|||||||
// use the game root - everything outside cannot be exported
|
// use the game root - everything outside cannot be exported
|
||||||
const QDir root(instance->gameRoot());
|
const QDir root(instance->gameRoot());
|
||||||
proxy = new FileIgnoreProxy(instance->gameRoot(), this);
|
proxy = new FileIgnoreProxy(instance->gameRoot(), this);
|
||||||
|
proxy->ignoreFilesWithPath().insert({ "logs", "crash-reports" });
|
||||||
|
proxy->ignoreFilesWithName().append({ ".DS_Store", "thumbs.db", "Thumbs.db" });
|
||||||
proxy->setSourceModel(model);
|
proxy->setSourceModel(model);
|
||||||
proxy->setFilterRegularExpression("^(?!(\\.DS_Store)|([tT]humbs\\.db)).+$");
|
|
||||||
|
|
||||||
const QDir::Filters filter(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden);
|
const QDir::Filters filter(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden);
|
||||||
|
|
||||||
@ -99,7 +100,7 @@ void ExportMrPackDialog::done(int result)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
ModrinthPackExportTask task(ui->name->text(), ui->version->text(), ui->summary->text(), instance, output,
|
ModrinthPackExportTask task(ui->name->text(), ui->version->text(), ui->summary->text(), instance, output,
|
||||||
[this](const QString& path) { return proxy->blockedPaths().covers(path); });
|
std::bind(&FileIgnoreProxy::filterFile, proxy, std::placeholders::_1));
|
||||||
|
|
||||||
connect(&task, &Task::failed,
|
connect(&task, &Task::failed,
|
||||||
[this](const QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); });
|
[this](const QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); });
|
||||||
|
Loading…
Reference in New Issue
Block a user