summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTwinki <Twinki14@users.noreply.github.com>2024-06-15 12:51:47 -0400
committerGitHub <noreply@github.com>2024-06-15 18:51:47 +0200
commitd3b647ab2b19626b2f86b5c2af3946c1fcf22068 (patch)
tree3dac9ed85783bdf1bb682cd4a436cfa9197ba382
parent6d08d434a8a5a4471a620974a52550ada05ab663 (diff)
Use new Skip File & Skip Directory in usvfs (#2033)
* Use new Skip File & Skip Directory in usvfs. # Motivations https://github.com/ModOrganizer2/usvfs/pull/61 Highlights some reasons why the ability to skip files & directories would be beneficial # Modifications - Add two new settings, `skip_file_suffixes` and `skip_directories` - Wire the two new settings up to usvfs - Add two new buttons to the `Workarounds` dialog, one to adjust Skip File Suffixes and another for Skip Directories, both buttons act nearly identical to the Executable Blacklist button - Add a new grouping in the `Workarounds` dialog box that contains the usvfs buttons to keep the dialog a tad organized
-rw-r--r--src/organizercore.cpp9
-rw-r--r--src/organizercore.h3
-rw-r--r--src/settings.cpp28
-rw-r--r--src/settings.h6
-rw-r--r--src/settingsdialog.ui85
-rw-r--r--src/settingsdialogworkarounds.cpp89
-rw-r--r--src/settingsdialogworkarounds.h16
-rw-r--r--src/settingsutilities.h6
-rw-r--r--src/usvfsconnector.cpp34
-rw-r--r--src/usvfsconnector.h3
10 files changed, 264 insertions, 15 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index df098205..f471ead1 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -469,12 +469,14 @@ void OrganizerCore::updateVFSParams(log::Levels logLevel,
env::CoreDumpTypes coreDumpType,
const QString& crashDumpsPath,
std::chrono::seconds spawnDelay,
- QString executableBlacklist)
+ QString executableBlacklist,
+ const QStringList& skipFileSuffixes,
+ const QStringList& skipDirectories)
{
setGlobalCoreDumpType(coreDumpType);
m_USVFS.updateParams(logLevel, coreDumpType, crashDumpsPath, spawnDelay,
- executableBlacklist);
+ executableBlacklist, skipFileSuffixes, skipDirectories);
}
void OrganizerCore::setLogLevel(log::Levels level)
@@ -484,7 +486,8 @@ void OrganizerCore::setLogLevel(log::Levels level)
updateVFSParams(
m_Settings.diagnostics().logLevel(), m_Settings.diagnostics().coreDumpType(),
QString::fromStdWString(getGlobalCoreDumpPath()),
- m_Settings.diagnostics().spawnDelay(), m_Settings.executablesBlacklist());
+ m_Settings.diagnostics().spawnDelay(), m_Settings.executablesBlacklist(),
+ m_Settings.skipFileSuffixes(), m_Settings.skipDirectories());
log::getDefault().setLevel(m_Settings.diagnostics().logLevel());
}
diff --git a/src/organizercore.h b/src/organizercore.h
index 726babfd..923adc12 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -339,7 +339,8 @@ public:
void updateVFSParams(MOBase::log::Levels logLevel, env::CoreDumpTypes coreDumpType,
const QString& coreDumpsPath, std::chrono::seconds spawnDelay,
- QString executableBlacklist);
+ QString executableBlacklist, const QStringList& skipFileSuffixes,
+ const QStringList& skipDirectories);
void setLogLevel(MOBase::log::Levels level);
diff --git a/src/settings.cpp b/src/settings.cpp
index 04a09467..8b95a1d0 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -316,6 +316,34 @@ void Settings::setExecutablesBlacklist(const QString& s)
set(m_Settings, "Settings", "executable_blacklist", s);
}
+QStringList Settings::skipFileSuffixes() const
+{
+ static const QStringList def = QStringList() << ".mohidden";
+
+ auto setting = get<QStringList>(m_Settings, "Settings", "skip_file_suffixes", def);
+
+ return setting;
+}
+
+void Settings::setSkipFileSuffixes(const QStringList& s)
+{
+ set(m_Settings, "Settings", "skip_file_suffixes", s);
+}
+
+QStringList Settings::skipDirectories() const
+{
+ static const QStringList def = QStringList() << ".git";
+
+ auto setting = get<QStringList>(m_Settings, "Settings", "skip_directories", def);
+
+ return setting;
+}
+
+void Settings::setSkipDirectories(const QStringList& s)
+{
+ set(m_Settings, "Settings", "skip_directories", s);
+}
+
void Settings::setMotdHash(uint hash)
{
set(m_Settings, "General", "motd_hash", hash);
diff --git a/src/settings.h b/src/settings.h
index 30254c06..613a63bb 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -795,6 +795,12 @@ public:
bool isExecutableBlacklisted(const QString& s) const;
void setExecutablesBlacklist(const QString& s);
+ QStringList skipFileSuffixes() const;
+ void setSkipFileSuffixes(const QStringList& s);
+
+ QStringList skipDirectories() const;
+ void setSkipDirectories(const QStringList& s);
+
// ? looks obsolete, only used by dead code
//
unsigned int motdHash() const;
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index 84b5c343..6011b158 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -2017,6 +2017,60 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
+ <widget class="QPushButton" name="bsaDateBtn">
+ <property name="toolTip">
+ <string>
+ For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles.
+ For the other games this is not a sufficient replacement for AI!
+ </string>
+ </property>
+ <property name="whatsThis">
+ <string>
+ For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles.
+ For the other games this is not a sufficient replacement for AI!
+ </string>
+ </property>
+ <property name="text">
+ <string>Back-date BSAs</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/MO/gui/resources/emblem-readonly.png</normaloff>:/MO/gui/resources/emblem-readonly.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Orientation::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_usvfs" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
<widget class="QPushButton" name="execBlacklistBtn">
<property name="toolTip">
<string>Add executables to the blacklist to prevent them from
@@ -2037,21 +2091,34 @@ programs you are intentionally running.</string>
</widget>
</item>
<item>
- <widget class="QPushButton" name="bsaDateBtn">
+ <widget class="QPushButton" name="skipFileSuffixBtn">
<property name="toolTip">
- <string>For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles.
-For the other games this is not a sufficient replacement for AI!</string>
+ <string>Files to skip or ignore from the virtual file system.</string>
</property>
<property name="whatsThis">
- <string>For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles.
-For the other games this is not a sufficient replacement for AI!</string>
+ <string>Files to skip or ignore from the virtual file system.</string>
</property>
<property name="text">
- <string>Back-date BSAs</string>
+ <string>Skip File Suffixes</string>
</property>
- <property name="icon">
- <iconset>
- <normaloff>:/MO/gui/resources/emblem-readonly.png</normaloff>:/MO/gui/resources/emblem-readonly.png</iconset>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="skipDirectoriesBtn">
+ <property name="toolTip">
+ <string>Directories to skip or ignore from the virtual file system.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Directories to skip or ignore from the virtual file system.</string>
+ </property>
+ <property name="text">
+ <string>Skip Directories</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
</property>
</widget>
</item>
diff --git a/src/settingsdialogworkarounds.cpp b/src/settingsdialogworkarounds.cpp
index 36e5dd44..849e2085 100644
--- a/src/settingsdialogworkarounds.cpp
+++ b/src/settingsdialogworkarounds.cpp
@@ -34,6 +34,8 @@ WorkaroundsSettingsTab::WorkaroundsSettingsTab(Settings& s, SettingsDialog& d)
// buttons
m_ExecutableBlacklist = settings().executablesBlacklist();
+ m_SkipFileSuffixes = settings().skipFileSuffixes();
+ m_SkipDirectories = settings().skipDirectories();
QObject::connect(ui->bsaDateBtn, &QPushButton::clicked, [&] {
on_bsaDateBtn_clicked();
@@ -41,6 +43,12 @@ WorkaroundsSettingsTab::WorkaroundsSettingsTab(Settings& s, SettingsDialog& d)
QObject::connect(ui->execBlacklistBtn, &QPushButton::clicked, [&] {
on_execBlacklistBtn_clicked();
});
+ QObject::connect(ui->skipFileSuffixBtn, &QPushButton::clicked, [&] {
+ on_skipFileSuffixBtn_clicked();
+ });
+ QObject::connect(ui->skipDirectoriesBtn, &QPushButton::clicked, [&] {
+ on_skipDirectoriesBtn_clicked();
+ });
QObject::connect(ui->resetGeometryBtn, &QPushButton::clicked, [&] {
on_resetGeometryBtn_clicked();
});
@@ -69,6 +77,8 @@ void WorkaroundsSettingsTab::update()
// buttons
settings().setExecutablesBlacklist(m_ExecutableBlacklist);
+ settings().setSkipFileSuffixes(m_SkipFileSuffixes);
+ settings().setSkipDirectories(m_SkipDirectories);
}
bool WorkaroundsSettingsTab::changeBlacklistNow(QWidget* parent, Settings& settings)
@@ -114,6 +124,71 @@ WorkaroundsSettingsTab::changeBlacklistLater(QWidget* parent, const QString& cur
return blacklist.join(";");
}
+std::optional<QStringList>
+WorkaroundsSettingsTab::changeSkipFileSuffixes(QWidget* parent,
+ const QStringList& current)
+{
+ bool ok = false;
+
+ QString result = QInputDialog::getMultiLineText(
+ parent, QObject::tr("Skip File Suffixes"),
+ QObject::tr(
+ "Enter one file suffix per line to be skipped / ignored from the virtual "
+ "file system.\n"
+ "Not to be confused with file extensions, file suffixes are simply how the "
+ "filename ends.\n\n"
+ "Example:\n"
+ " .txt - Would skip all files that end with .txt, <any text>.txt\n"
+ " some_file.txt - Would skip all files that end with some_file.txt, <any "
+ "text>some_file.txt"),
+ current.join("\n"), &ok);
+
+ if (!ok) {
+ return {};
+ }
+
+ QStringList fileSuffixes;
+ for (auto& suffix : result.split("\n")) {
+ auto trimmed = suffix.trimmed();
+ if (!trimmed.isEmpty()) {
+ fileSuffixes << trimmed;
+ }
+ }
+
+ return fileSuffixes;
+}
+
+std::optional<QStringList>
+WorkaroundsSettingsTab::changeSkipDirectories(QWidget* parent,
+ const QStringList& current)
+{
+ bool ok = false;
+
+ QString result = QInputDialog::getMultiLineText(
+ parent, QObject::tr("Skip Directories"),
+ QObject::tr(
+ "Enter one directory per line to be skipped / ignored from the virtual "
+ "file system.\n\n"
+ "Example:\n"
+ " .git\n"
+ " instructions"),
+ current.join("\n"), &ok);
+
+ if (!ok) {
+ return {};
+ }
+
+ QStringList directories;
+ for (auto& dir : result.split("\n")) {
+ auto trimmed = dir.trimmed();
+ if (!trimmed.isEmpty()) {
+ directories << trimmed;
+ }
+ }
+
+ return directories;
+}
+
void WorkaroundsSettingsTab::on_execBlacklistBtn_clicked()
{
if (auto s = changeBlacklistLater(parentWidget(), m_ExecutableBlacklist)) {
@@ -121,6 +196,20 @@ void WorkaroundsSettingsTab::on_execBlacklistBtn_clicked()
}
}
+void WorkaroundsSettingsTab::on_skipFileSuffixBtn_clicked()
+{
+ if (auto s = changeSkipFileSuffixes(parentWidget(), m_SkipFileSuffixes)) {
+ m_SkipFileSuffixes = *s;
+ }
+}
+
+void WorkaroundsSettingsTab::on_skipDirectoriesBtn_clicked()
+{
+ if (auto s = changeSkipDirectories(parentWidget(), m_SkipDirectories)) {
+ m_SkipDirectories = *s;
+ }
+}
+
void WorkaroundsSettingsTab::on_bsaDateBtn_clicked()
{
const auto* game = qApp->property("managed_game").value<MOBase::IPluginGame*>();
diff --git a/src/settingsdialogworkarounds.h b/src/settingsdialogworkarounds.h
index 8c86fd69..d31bb371 100644
--- a/src/settingsdialogworkarounds.h
+++ b/src/settingsdialogworkarounds.h
@@ -20,13 +20,29 @@ public:
static std::optional<QString> changeBlacklistLater(QWidget* parent,
const QString& current);
+ // shows the blacklist dialog from the given string and returns the new
+ // blacklist if the user accepted it
+ //
+ static std::optional<QStringList> changeSkipFileSuffixes(QWidget* parent,
+ const QStringList& current);
+
+ // shows the blacklist dialog from the given string and returns the new
+ // blacklist if the user accepted it
+ //
+ static std::optional<QStringList> changeSkipDirectories(QWidget* parent,
+ const QStringList& current);
+
void update();
private:
QString m_ExecutableBlacklist;
+ QStringList m_SkipFileSuffixes;
+ QStringList m_SkipDirectories;
void on_bsaDateBtn_clicked();
void on_execBlacklistBtn_clicked();
+ void on_skipFileSuffixBtn_clicked();
+ void on_skipDirectoriesBtn_clicked();
void on_resetGeometryBtn_clicked();
};
diff --git a/src/settingsutilities.h b/src/settingsutilities.h
index 11b2af1c..cd55464e 100644
--- a/src/settingsutilities.h
+++ b/src/settingsutilities.h
@@ -32,6 +32,12 @@ struct ValueConverter<QVariantList>
}
};
+template <>
+struct ValueConverter<QStringList>
+{
+ static QString convert(const QStringList& t) { return t.join(", "); }
+};
+
bool shouldLogSetting(const QString& displayName);
template <class T>
diff --git a/src/usvfsconnector.cpp b/src/usvfsconnector.cpp
index 4a54f9fd..7b75b870 100644
--- a/src/usvfsconnector.cpp
+++ b/src/usvfsconnector.cpp
@@ -160,6 +160,21 @@ UsvfsConnector::UsvfsConnector()
usvfsBlacklistExecutable(buf.data());
}
+ usvfsClearSkipFileSuffixes();
+ for (auto& suffix : s.skipFileSuffixes()) {
+ if (suffix.isEmpty()) {
+ continue;
+ }
+ std::wstring buf = suffix.toStdWString();
+ usvfsAddSkipFileSuffix(buf.data());
+ }
+
+ usvfsClearSkipDirectories();
+ for (auto& dir : s.skipDirectories()) {
+ std::wstring buf = dir.toStdWString();
+ usvfsAddSkipDirectory(buf.data());
+ }
+
usvfsClearLibraryForceLoads();
m_LogWorker.moveToThread(&m_WorkerThread);
@@ -228,7 +243,9 @@ void UsvfsConnector::updateParams(MOBase::log::Levels logLevel,
env::CoreDumpTypes coreDumpType,
const QString& crashDumpsPath,
std::chrono::seconds spawnDelay,
- QString executableBlacklist)
+ QString executableBlacklist,
+ const QStringList& skipFileSuffixes,
+ const QStringList& skipDirectories)
{
using namespace std::chrono;
@@ -248,6 +265,21 @@ void UsvfsConnector::updateParams(MOBase::log::Levels logLevel,
std::wstring buf = exec.toStdWString();
usvfsBlacklistExecutable(buf.data());
}
+
+ usvfsClearSkipFileSuffixes();
+ for (auto& suffix : skipFileSuffixes) {
+ if (suffix.isEmpty()) {
+ continue;
+ }
+ std::wstring buf = suffix.toStdWString();
+ usvfsAddSkipFileSuffix(buf.data());
+ }
+
+ usvfsClearSkipDirectories();
+ for (auto& dir : skipDirectories) {
+ std::wstring buf = dir.toStdWString();
+ usvfsAddSkipDirectory(buf.data());
+ }
}
void UsvfsConnector::updateForcedLibraries(
diff --git a/src/usvfsconnector.h b/src/usvfsconnector.h
index 798d5983..d578ddd4 100644
--- a/src/usvfsconnector.h
+++ b/src/usvfsconnector.h
@@ -84,7 +84,8 @@ public:
void updateParams(MOBase::log::Levels logLevel, env::CoreDumpTypes coreDumpType,
const QString& crashDumpsPath, std::chrono::seconds spawnDelay,
- QString executableBlacklist);
+ QString executableBlacklist, const QStringList& skipFileSuffixes,
+ const QStringList& skipDirectories);
void updateForcedLibraries(
const QList<MOBase::ExecutableForcedLoadSetting>& forcedLibraries);