diff options
Diffstat (limited to 'src/organizercore.cpp')
| -rw-r--r-- | src/organizercore.cpp | 127 |
1 files changed, 79 insertions, 48 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 30d38be3..38b01563 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -7,7 +7,6 @@ #include "filedialogmemory.h"
#include "lockeddialog.h"
#include "modinfodialog.h"
-#include "report.h"
#include "spawn.h"
#include "safewritefile.h"
#include "syncoverwritedialog.h"
@@ -18,6 +17,7 @@ #include <scopeguard.h>
#include <utility.h>
#include <appconfig.h>
+#include <report.h>
#include <questionboxmemory.h>
#include <QNetworkInterface>
#include <QMessageBox>
@@ -188,63 +188,81 @@ OrganizerCore::~OrganizerCore() delete m_DirectoryStructure;
}
-void OrganizerCore::storeSettings()
+QString OrganizerCore::commitSettings(const QString &iniFile)
{
- QString iniFile = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::iniFileName());
- shellCopy(iniFile, iniFile + ".new", true, qApp->activeWindow());
-
- QSettings::Status result = QSettings::NoError;
- {
- QSettings settings(iniFile + ".new", QSettings::IniFormat);
- if (m_UserInterface != nullptr) {
- m_UserInterface->storeSettings(settings);
- }
- if (m_CurrentProfile != nullptr) {
- settings.setValue("selected_profile", m_CurrentProfile->name().toUtf8().constData());
+ if (!shellRename(iniFile + ".new", iniFile, true, qApp->activeWindow())) {
+ DWORD err = ::GetLastError();
+ // make a second attempt using qt functions but if that fails print the error from the first attempt
+ if (!renameFile(iniFile + ".new", iniFile)) {
+ return windowsErrorString(err);
}
- settings.setValue("ask_for_nexuspw", m_AskForNexusPW);
+ }
+ return QString();
+}
- settings.remove("customExecutables");
- settings.beginWriteArray("customExecutables");
- std::vector<Executable>::const_iterator current, end;
- m_ExecutablesList.getExecutables(current, end);
- int count = 0;
- for (; current != end; ++current) {
- const Executable &item = *current;
- settings.setArrayIndex(count++);
- settings.setValue("title", item.m_Title);
- settings.setValue("custom", item.m_Custom);
- settings.setValue("toolbar", item.m_Toolbar);
- if (item.m_Custom) {
- settings.setValue("binary", item.m_BinaryInfo.absoluteFilePath());
- settings.setValue("arguments", item.m_Arguments);
- settings.setValue("workingDirectory", item.m_WorkingDirectory);
- settings.setValue("closeOnStart", item.m_CloseMO == ExecutableInfo::CloseMOStyle::DEFAULT_CLOSE);
- settings.setValue("steamAppID", item.m_SteamAppID);
- }
+QSettings::Status OrganizerCore::storeSettings(const QString &fileName)
+{
+ QSettings settings(fileName, QSettings::IniFormat);
+ if (m_UserInterface != nullptr) {
+ m_UserInterface->storeSettings(settings);
+ }
+ if (m_CurrentProfile != nullptr) {
+ settings.setValue("selected_profile", m_CurrentProfile->name().toUtf8().constData());
+ }
+ settings.setValue("ask_for_nexuspw", m_AskForNexusPW);
+
+ settings.remove("customExecutables");
+ settings.beginWriteArray("customExecutables");
+ std::vector<Executable>::const_iterator current, end;
+ m_ExecutablesList.getExecutables(current, end);
+ int count = 0;
+ for (; current != end; ++current) {
+ const Executable &item = *current;
+ settings.setArrayIndex(count++);
+ settings.setValue("title", item.m_Title);
+ settings.setValue("custom", item.m_Custom);
+ settings.setValue("toolbar", item.m_Toolbar);
+ if (item.m_Custom) {
+ settings.setValue("binary", item.m_BinaryInfo.absoluteFilePath());
+ settings.setValue("arguments", item.m_Arguments);
+ settings.setValue("workingDirectory", item.m_WorkingDirectory);
+ settings.setValue("closeOnStart", item.m_CloseMO == ExecutableInfo::CloseMOStyle::DEFAULT_CLOSE);
+ settings.setValue("steamAppID", item.m_SteamAppID);
}
- settings.endArray();
+ }
+ settings.endArray();
- FileDialogMemory::save(settings);
+ FileDialogMemory::save(settings);
- settings.sync();
- result = settings.status();
+ settings.sync();
+ return settings.status();
+}
+
+void OrganizerCore::storeSettings()
+{
+ QString iniFile = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::iniFileName());
+ if (!shellCopy(iniFile, iniFile + ".new", true, qApp->activeWindow())) {
+ QMessageBox::critical(qApp->activeWindow(), tr("Failed to write settings"),
+ tr("An error occured trying to update MO settings to %1: %2").arg(
+ iniFile, windowsErrorString(::GetLastError())));
+ return;
}
+
+ QSettings::Status result = storeSettings(iniFile + ".new");
+
if (result == QSettings::NoError) {
- if (!shellRename(iniFile + ".new", iniFile, true, qApp->activeWindow())) {
- DWORD err = ::GetLastError();
- // make a second attempt using qt functions but if that fails print the error from the first attempt
- if (!renameFile(iniFile + ".new", iniFile)) {
- QMessageBox::critical(qApp->activeWindow(), tr("Failed to write settings"),
- tr("An error occured trying to write back MO settings: %1").arg(windowsErrorString(err)));
- }
+ QString errMsg = commitSettings(iniFile);
+ if (!errMsg.isEmpty()) {
+ qWarning("settings file not writable, may be locked by another application, trying direct write");
+ result = storeSettings(iniFile);
}
- } else {
+ }
+ if (result != QSettings::NoError) {
QString reason = result == QSettings::AccessError ? tr("File is write protected")
: result == QSettings::FormatError ? tr("Invalid file format (probably a bug)")
: tr("Unknown error %1").arg(result);
QMessageBox::critical(qApp->activeWindow(), tr("Failed to write settings"),
- tr("An error occured trying to write back MO settings: %1").arg(reason));
+ tr("An error occured trying to write back MO settings to %1: %2").arg(iniFile + ".new", reason));
}
}
@@ -333,7 +351,6 @@ void OrganizerCore::setUserInterface(IUserInterface *userInterface, QWidget *wid m_UserInterface = userInterface;
if (widget != nullptr) {
-// connect(&m_ModList, SIGNAL(modlist_changed(QModelIndex, int)), widget, SLOT(modorder_changed()));
connect(&m_ModList, SIGNAL(modlist_changed(QModelIndex, int)), widget, SLOT(modlistChanged(QModelIndex, int)));
connect(&m_ModList, SIGNAL(showMessage(QString)), widget, SLOT(showMessage(QString)));
connect(&m_ModList, SIGNAL(modRenamed(QString,QString)), widget, SLOT(modRenamed(QString,QString)));
@@ -379,11 +396,12 @@ void OrganizerCore::disconnectPlugins() m_PluginContainer = nullptr;
}
-void OrganizerCore::setManagedGame(const QString &gameName)
+void OrganizerCore::setManagedGame(const QString &gameName, const QString &gamePath)
{
m_GameName = gameName;
if (m_PluginContainer != nullptr) {
m_GamePlugin = m_PluginContainer->managedGame(m_GameName);
+ m_GamePlugin->setGamePath(gamePath);
qApp->setProperty("managed_game", QVariant::fromValue(m_GamePlugin));
emit managedGameChanged(m_GamePlugin);
}
@@ -885,8 +903,13 @@ void OrganizerCore::spawnBinary(const QFileInfo &binary, const QString &argument // need to remove our stored load order because it may be outdated if a foreign tool changed the
// file time. After removing that file, refreshESPList will use the file time as the order
if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) {
+ qDebug("removing loadorder.txt");
QFile::remove(m_CurrentProfile->getLoadOrderFileName());
- refreshESPList();
+ }
+ refreshESPList();
+ if (GameInfo::instance().getLoadOrderMechanism() == GameInfo::TYPE_FILETIME) {
+ // the load order should have been retrieved from file time, now save it to our own format
+ savePluginList();
}
m_FinishedRun(binary.absoluteFilePath(), processExitCode);
@@ -1304,6 +1327,9 @@ void OrganizerCore::directory_refreshed() ModInfo::Ptr modInfo = ModInfo::getByIndex(i);
modInfo->clearCaches();
}
+ for (auto task : m_PostRefreshTasks) {
+ task();
+ }
}
void OrganizerCore::profileRefresh()
@@ -1472,6 +1498,11 @@ bool OrganizerCore::saveCurrentLists() void OrganizerCore::savePluginList()
{
+ if (m_DirectoryUpdate) {
+ // delay save till after directory update
+ m_PostRefreshTasks.append([&] () { this->savePluginList(); });
+ return;
+ }
m_PluginList.saveTo(m_CurrentProfile->getPluginsFileName(),
m_CurrentProfile->getLoadOrderFileName(),
m_CurrentProfile->getLockedOrderFileName(),
|
