diff options
| author | Twinki <Twinki14@users.noreply.github.com> | 2024-06-15 12:51:47 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-15 18:51:47 +0200 |
| commit | d3b647ab2b19626b2f86b5c2af3946c1fcf22068 (patch) | |
| tree | 3dac9ed85783bdf1bb682cd4a436cfa9197ba382 | |
| parent | 6d08d434a8a5a4471a620974a52550ada05ab663 (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.cpp | 9 | ||||
| -rw-r--r-- | src/organizercore.h | 3 | ||||
| -rw-r--r-- | src/settings.cpp | 28 | ||||
| -rw-r--r-- | src/settings.h | 6 | ||||
| -rw-r--r-- | src/settingsdialog.ui | 85 | ||||
| -rw-r--r-- | src/settingsdialogworkarounds.cpp | 89 | ||||
| -rw-r--r-- | src/settingsdialogworkarounds.h | 16 | ||||
| -rw-r--r-- | src/settingsutilities.h | 6 | ||||
| -rw-r--r-- | src/usvfsconnector.cpp | 34 | ||||
| -rw-r--r-- | src/usvfsconnector.h | 3 |
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); |
