From 347ac2b8b5f34a2583ae7844e0dfd79773657270 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 11 Jan 2019 01:39:05 -0600 Subject: Support for force loading libraries --- src/editexecutablesdialog.cpp | 47 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index be2ee127..212993f1 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -25,7 +25,8 @@ along with Mod Organizer. If not, see . #include #include #include - +#include "forcedloaddialog.h" +#include using namespace MOBase; using namespace MOShared; @@ -44,6 +45,8 @@ EditExecutablesDialog::EditExecutablesDialog( refreshExecutablesWidget(); ui->newFilesModBox->addItems(modList.allMods()); + + m_ForcedLibraries = m_Profile->determineForcedLibraries(ui->titleEdit->text()); } EditExecutablesDialog::~EditExecutablesDialog() @@ -93,6 +96,7 @@ void EditExecutablesDialog::resetInput() ui->overwriteAppIDBox->setChecked(false); ui->useAppIconCheckBox->setChecked(false); ui->newFilesModCheckBox->setChecked(false); + ui->forceLoadCheckBox->setChecked(false); m_CurrentItem = nullptr; } @@ -118,6 +122,9 @@ void EditExecutablesDialog::saveExecutable() else { m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text()); } + + m_Profile->saveForcedLibraries(ui->titleEdit->text(), m_ForcedLibraries); + m_Profile->setForcedLibrariesEnabled(ui->titleEdit->text(), ui->forceLoadCheckBox->isChecked()); } @@ -130,6 +137,21 @@ void EditExecutablesDialog::delayedRefresh() } +void EditExecutablesDialog::on_forceLoadButton_clicked() +{ + ForcedLoadDialog dialog(this); + dialog.setValues(m_ForcedLibraries); + if (dialog.exec() == QDialog::Accepted) { + m_ForcedLibraries = dialog.values(); + } +} + +void EditExecutablesDialog::on_forceLoadCheckBox_toggled() +{ + ui->forceLoadButton->setEnabled(ui->forceLoadCheckBox->isChecked()); +} + + void EditExecutablesDialog::on_addButton_clicked() { if (executableChanged()) { @@ -231,6 +253,20 @@ bool EditExecutablesDialog::executableChanged() QString storedCustomOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.m_Title).toString(); + bool forcedLibrariesDirty = false; + auto forcedLibaries = m_Profile->determineForcedLibraries(selectedExecutable.m_Title); + forcedLibrariesDirty |= !std::equal(forcedLibaries.begin(), forcedLibaries.end(), + m_ForcedLibraries.begin(), m_ForcedLibraries.end(), + [](const ExecutableForcedLoadSetting &lhs, const ExecutableForcedLoadSetting &rhs) + { + return lhs.enabled() == rhs.enabled() && + lhs.forced() == rhs.forced() && + lhs.library() == rhs.library() && + lhs.process() == rhs.process(); + }); + forcedLibrariesDirty |= m_Profile->setting("forced_libraries", ui->titleEdit->text() + "/enabled", false).toBool() != + ui->forceLoadCheckBox->isChecked(); + return selectedExecutable.m_Title != ui->titleEdit->text() || selectedExecutable.m_Arguments != ui->argumentsEdit->text() || selectedExecutable.m_SteamAppID != ui->appIDOverwriteEdit->text() @@ -238,7 +274,9 @@ bool EditExecutablesDialog::executableChanged() || !storedCustomOverwrite.isEmpty() && (storedCustomOverwrite != ui->newFilesModBox->currentText()) || selectedExecutable.m_WorkingDirectory != QDir::fromNativeSeparators(ui->workingDirEdit->text()) || selectedExecutable.m_BinaryInfo.absoluteFilePath() != QDir::fromNativeSeparators(ui->binaryEdit->text()) - || selectedExecutable.usesOwnIcon() != ui->useAppIconCheckBox->isChecked(); + || selectedExecutable.usesOwnIcon() != ui->useAppIconCheckBox->isChecked() + || forcedLibrariesDirty + ; } else { QFileInfo fileInfo(ui->binaryEdit->text()); return !ui->binaryEdit->text().isEmpty() @@ -331,6 +369,11 @@ void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex &cur if (index != -1) { ui->newFilesModBox->setCurrentIndex(index); } + + m_ForcedLibraries = m_Profile->determineForcedLibraries(ui->titleEdit->text()); + bool forcedLibraries = m_Profile->forcedLibrariesEnabled(ui->titleEdit->text()); + ui->forceLoadButton->setEnabled(forcedLibraries); + ui->forceLoadCheckBox->setChecked(forcedLibraries); } } -- cgit v1.3.1 From 96b6677ed9d3b647e30bb40d7bb820f1894edbca Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 11 Jan 2019 03:14:41 -0600 Subject: Fixes to library load widget --- src/editexecutablesdialog.cpp | 5 +++-- src/editexecutablesdialog.h | 4 ++++ src/forcedloaddialog.cpp | 9 +++++---- src/forcedloaddialog.h | 4 +++- src/forcedloaddialogwidget.cpp | 33 +++++++++++++++++++++++++++------ src/forcedloaddialogwidget.h | 5 ++++- src/forcedloaddialogwidget.ui | 12 ++++++++++++ src/mainwindow.cpp | 3 ++- 8 files changed, 60 insertions(+), 15 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 212993f1..4b1cdb5d 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -33,12 +33,13 @@ using namespace MOShared; EditExecutablesDialog::EditExecutablesDialog( const ExecutablesList &executablesList, const ModList &modList, - Profile *profile, QWidget *parent) + Profile *profile, const IPluginGame *game, QWidget *parent) : TutorableDialog("EditExecutables", parent) , ui(new Ui::EditExecutablesDialog) , m_CurrentItem(nullptr) , m_ExecutablesList(executablesList) , m_Profile(profile) + , m_GamePlugin(game) { ui->setupUi(this); @@ -139,7 +140,7 @@ void EditExecutablesDialog::delayedRefresh() void EditExecutablesDialog::on_forceLoadButton_clicked() { - ForcedLoadDialog dialog(this); + ForcedLoadDialog dialog(m_GamePlugin, this); dialog.setValues(m_ForcedLibraries); if (dialog.exec() == QDialog::Accepted) { m_ForcedLibraries = dialog.values(); diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h index 82e63e15..0169b8ca 100644 --- a/src/editexecutablesdialog.h +++ b/src/editexecutablesdialog.h @@ -25,6 +25,7 @@ along with Mod Organizer. If not, see . #include #include "executableslist.h" #include "profile.h" +#include "iplugingame.h" namespace Ui { class EditExecutablesDialog; @@ -52,6 +53,7 @@ public: explicit EditExecutablesDialog(const ExecutablesList &executablesList, const ModList &modList, Profile *profile, + const MOBase::IPluginGame *game, QWidget *parent = 0); ~EditExecutablesDialog(); @@ -114,6 +116,8 @@ private: Profile *m_Profile; QList m_ForcedLibraries; + + const MOBase::IPluginGame *m_GamePlugin; }; #endif // EDITEXECUTABLESDIALOG_H diff --git a/src/forcedloaddialog.cpp b/src/forcedloaddialog.cpp index ad30a58c..ab0bd583 100644 --- a/src/forcedloaddialog.cpp +++ b/src/forcedloaddialog.cpp @@ -8,9 +8,10 @@ using namespace MOBase; -ForcedLoadDialog::ForcedLoadDialog(QWidget *parent) : +ForcedLoadDialog::ForcedLoadDialog(const IPluginGame *game, QWidget *parent) : QDialog(parent), - ui(new Ui::ForcedLoadDialog) + ui(new Ui::ForcedLoadDialog), + m_GamePlugin(game) { ui->setupUi(this); } @@ -25,7 +26,7 @@ void ForcedLoadDialog::setValues(QList &val ui->tableWidget->clearContents(); for (int i = 0; i < values.count(); i++) { - ForcedLoadDialogWidget *item = new ForcedLoadDialogWidget(this); + ForcedLoadDialogWidget *item = new ForcedLoadDialogWidget(m_GamePlugin, this); item->setEnabled(values[i].enabled()); item->setProcess(values[i].process()); item->setLibraryPath(values[i].library()); @@ -59,7 +60,7 @@ void ForcedLoadDialog::on_addRowButton_clicked() { int row = ui->tableWidget->rowCount(); ui->tableWidget->insertRow(row); - ForcedLoadDialogWidget *item = new ForcedLoadDialogWidget(this); + ForcedLoadDialogWidget *item = new ForcedLoadDialogWidget(m_GamePlugin, this); ui->tableWidget->setCellWidget(row, 0, item); ui->tableWidget->resizeRowsToContents(); } diff --git a/src/forcedloaddialog.h b/src/forcedloaddialog.h index 68460d91..6a88bccf 100644 --- a/src/forcedloaddialog.h +++ b/src/forcedloaddialog.h @@ -5,6 +5,7 @@ #include #include "executableinfo.h" +#include "iplugingame.h" namespace Ui { class ForcedLoadDialog; @@ -15,7 +16,7 @@ class ForcedLoadDialog : public QDialog Q_OBJECT public: - explicit ForcedLoadDialog(QWidget *parent = nullptr); + explicit ForcedLoadDialog(const MOBase::IPluginGame *game, QWidget *parent = nullptr); ~ForcedLoadDialog(); void setValues(QList &values); @@ -27,6 +28,7 @@ private slots: private: Ui::ForcedLoadDialog *ui; + const MOBase::IPluginGame *m_GamePlugin; }; #endif // FORCEDLOADDIALOG_H diff --git a/src/forcedloaddialogwidget.cpp b/src/forcedloaddialogwidget.cpp index 61805068..10069c35 100644 --- a/src/forcedloaddialogwidget.cpp +++ b/src/forcedloaddialogwidget.cpp @@ -5,9 +5,12 @@ #include "executableinfo.h" -ForcedLoadDialogWidget::ForcedLoadDialogWidget(QWidget *parent) : +using namespace MOBase; + +ForcedLoadDialogWidget::ForcedLoadDialogWidget(const IPluginGame *game, QWidget *parent) : QWidget(parent), - ui(new Ui::ForcedLoadDialogWidget) + ui(new Ui::ForcedLoadDialogWidget), + m_GamePlugin(game) { ui->setupUi(this); } @@ -68,20 +71,38 @@ void ForcedLoadDialogWidget::on_enabledBox_toggled() void ForcedLoadDialogWidget::on_libraryPathBrowseButton_clicked() { - QDir gameDir("D:/Games/Steam Library/steamapps/common/Fallout 4"); + QDir gameDir(m_GamePlugin->gameDirectory()); QString startPath = gameDir.absolutePath(); QString result = QFileDialog::getOpenFileName(nullptr, "Select a library...", startPath, "Dynamic link library (*.dll)", nullptr, QFileDialog::ReadOnly); if (!result.isEmpty()) { - ui->libraryPathEdit->setText(result); + QFileInfo fileInfo(result); + QString relativePath = gameDir.relativeFilePath(fileInfo.filePath()); + QString filePath = fileInfo.filePath(); + if (!relativePath.startsWith("..")) { + filePath = relativePath; + } + + if (fileInfo.exists()) { + ui->libraryPathEdit->setText(filePath); + } else { + qCritical("%ls does not exist", filePath.toStdWString().c_str()); + } } } void ForcedLoadDialogWidget::on_processBrowseButton_clicked() { - QDir gameDir("D:/Games/Steam Library/steamapps/common/Fallout 4"); + QDir gameDir(m_GamePlugin->gameDirectory()); QString startPath = gameDir.absolutePath(); QString result = QFileDialog::getOpenFileName(nullptr, "Select a process...", startPath, "Executable (*.exe)", nullptr, QFileDialog::ReadOnly); if (!result.isEmpty()) { - ui->processEdit->setText(QFile(result).fileName()); + QFileInfo fileInfo(result); + QString fileName = fileInfo.fileName(); + + if (fileInfo.exists()) { + ui->processEdit->setText(fileName); + } else { + qCritical("%ls does not exist", fileInfo.filePath().toStdWString().c_str()); + } } } diff --git a/src/forcedloaddialogwidget.h b/src/forcedloaddialogwidget.h index 06ad0009..eb7c3f4d 100644 --- a/src/forcedloaddialogwidget.h +++ b/src/forcedloaddialogwidget.h @@ -2,6 +2,7 @@ #define FORCEDLOADDIALOGWIDGET_H #include +#include "iplugingame.h" namespace Ui { class ForcedLoadDialogWidget; @@ -12,7 +13,7 @@ class ForcedLoadDialogWidget : public QWidget Q_OBJECT public: - explicit ForcedLoadDialogWidget(QWidget *parent = nullptr); + explicit ForcedLoadDialogWidget(const MOBase::IPluginGame *game, QWidget *parent = nullptr); ~ForcedLoadDialogWidget(); bool getEnabled(); @@ -33,6 +34,8 @@ private slots: private: Ui::ForcedLoadDialogWidget *ui; bool m_Forced; + const MOBase::IPluginGame *m_GamePlugin; + }; #endif // FORCEDLOADDIALOGWIDGET_H diff --git a/src/forcedloaddialogwidget.ui b/src/forcedloaddialogwidget.ui index 4df78beb..d4766489 100644 --- a/src/forcedloaddialogwidget.ui +++ b/src/forcedloaddialogwidget.ui @@ -22,6 +22,12 @@ + + If checked, the specified library will be force loaded for the specified process. + + + If checked, the specified library will be force loaded for the specified process. + @@ -73,6 +79,12 @@ + + The path to the library to be loaded. This may be a path relative to the managed game's directory or may be an absolute path to somewhere else. + + + The path to the library to be loaded. This may be a path relative to the managed game's directory or may be an absolute path to somewhere else. + Library to load diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 0ebad6ae..144d2371 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2069,7 +2069,8 @@ bool MainWindow::modifyExecutablesDialog() try { EditExecutablesDialog dialog(*m_OrganizerCore.executablesList(), *m_OrganizerCore.modList(), - m_OrganizerCore.currentProfile()); + m_OrganizerCore.currentProfile(), + m_OrganizerCore.managedGame()); QSettings &settings = m_OrganizerCore.settings().directInterface(); QString key = QString("geometry/%1").arg(dialog.objectName()); if (settings.contains(key)) { -- cgit v1.3.1 From 64a242d9220868a5b564c32f75f191efb01ad18e Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 11 Jan 2019 16:21:43 -0600 Subject: Remove profile-specific executable settings when removing the executable --- src/editexecutablesdialog.cpp | 4 +++- src/profile.cpp | 7 ++++++- src/profile.h | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 4b1cdb5d..bea497ef 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -124,7 +124,7 @@ void EditExecutablesDialog::saveExecutable() m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text()); } - m_Profile->saveForcedLibraries(ui->titleEdit->text(), m_ForcedLibraries); + m_Profile->storeForcedLibraries(ui->titleEdit->text(), m_ForcedLibraries); m_Profile->setForcedLibrariesEnabled(ui->titleEdit->text(), ui->forceLoadCheckBox->isChecked()); } @@ -218,6 +218,8 @@ void EditExecutablesDialog::on_removeButton_clicked() { if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->titleEdit->text()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text()); + m_Profile->removeForcedLibraries(ui->titleEdit->text()); m_ExecutablesList.remove(ui->titleEdit->text()); } diff --git a/src/profile.cpp b/src/profile.cpp index 02257de9..afe6fdc7 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -1014,7 +1014,7 @@ QList Profile::determineForcedLibraries(const QStri return results; } -void Profile::saveForcedLibraries(const QString &executable, const QList &values) +void Profile::storeForcedLibraries(const QString &executable, const QList &values) { QList rawSettings; for (auto setting : values) { @@ -1026,3 +1026,8 @@ void Profile::saveForcedLibraries(const QString &executable, const QListremove("forced_libraries/" + executable); +} diff --git a/src/profile.h b/src/profile.h index d7fb7785..dea933ad 100644 --- a/src/profile.h +++ b/src/profile.h @@ -323,7 +323,8 @@ public: bool forcedLibrariesEnabled(const QString &executable); void setForcedLibrariesEnabled(const QString &executable, bool enabled); QList determineForcedLibraries(const QString &executable); - void saveForcedLibraries(const QString &executable, const QList &values); + void storeForcedLibraries(const QString &executable, const QList &values); + void removeForcedLibraries(const QString &executable); signals: -- cgit v1.3.1 From d24519501fdba4fb5418da3f99e2b36ccef07826 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 11 Jan 2019 17:51:09 -0600 Subject: Delete the settings array before writing a new one --- src/editexecutablesdialog.cpp | 1 + src/modinfodialog.cpp | 1 + src/modinforegular.cpp | 1 + src/organizercore.cpp | 1 + src/settings.cpp | 1 + 5 files changed, 5 insertions(+) (limited to 'src/editexecutablesdialog.cpp') diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index bea497ef..78e1accb 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -124,6 +124,7 @@ void EditExecutablesDialog::saveExecutable() m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text()); } + m_Profile->removeForcedLibraries(ui->titleEdit->text()); m_Profile->storeForcedLibraries(ui->titleEdit->text(), m_ForcedLibraries); m_Profile->setForcedLibrariesEnabled(ui->titleEdit->text(), ui->forceLoadCheckBox->isChecked()); } diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index ed77f596..40fae0e4 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -562,6 +562,7 @@ void ModInfoDialog::openIniFile(const QString &fileName) void ModInfoDialog::saveIniTweaks() { + m_Settings->remove("INI Tweaks"); m_Settings->beginWriteArray("INI Tweaks"); int countEnabled = 0; diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 45c3985b..185f0495 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -162,6 +162,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("endorsed", m_EndorsedState); } + metaFile.remove("installedFiles"); metaFile.beginWriteArray("installedFiles"); int idx = 0; for (auto iter = m_InstalledFileIDs.begin(); iter != m_InstalledFileIDs.end(); ++iter) { diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 4e399ac7..e72b9a50 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -907,6 +907,7 @@ MOBase::IModInterface *OrganizerCore::createMod(GuessedValue &name) settingsFile.setValue("category", 0); settingsFile.setValue("installationFile", ""); + settingsFile.remove("installedFiles"); settingsFile.beginWriteArray("installedFiles", 0); settingsFile.endArray(); } diff --git a/src/settings.cpp b/src/settings.cpp index 9267cccf..c4228f65 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -592,6 +592,7 @@ void Settings::addBlacklistPlugin(const QString &fileName) void Settings::writePluginBlacklist() { + m_Settings.remove("pluginBlacklist"); m_Settings.beginWriteArray("pluginBlacklist"); int idx = 0; for (const QString &plugin : m_PluginBlacklist) { -- cgit v1.3.1