summaryrefslogtreecommitdiff
path: root/src/profile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/profile.cpp')
-rw-r--r--src/profile.cpp86
1 files changed, 54 insertions, 32 deletions
diff --git a/src/profile.cpp b/src/profile.cpp
index a6d8f49d..330bfa09 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -30,6 +30,8 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QMessageBox>
#include <QApplication>
#include <QSettings>
+#include <QTemporaryFile>
+
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shlobj.h>
@@ -146,38 +148,56 @@ void Profile::writeModlistNow(bool onlyOnTimer) const
if (!m_Directory.exists()) return;
#pragma message("right now, this is doing unnecessary saves. Need a flag that says that mod priority, enabled-state or name of a mod has changed")
- QString fileName = getModlistFileName();
- QFile file(fileName);
- if (!file.open(QIODevice::WriteOnly)) {
- reportError(tr("failed to open \"%1\" for writing").arg(fileName));
- return;
- }
+ try {
+ QTemporaryFile file;
- file.resize(0);
- file.write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8());
- if (m_ModStatus.empty()) {
- return;
- }
+ if (!file.open()) {
+ reportError(tr("failed to open temporary file"));
+ return;
+ }
- for (int i = m_ModStatus.size() - 1; i >= 0; --i) {
- // the priority order was inverted on load so it has to be inverted again
- unsigned int index = m_ModIndexByPriority[i];
- if (index != UINT_MAX) {
- ModInfo::Ptr modInfo = ModInfo::getByIndex(index);
- if (modInfo->getFixedPriority() == INT_MIN) {
- if (m_ModStatus[index].m_Enabled) {
- file.write("+");
- } else {
- file.write("-");
+ file.resize(0);
+ file.write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8());
+ if (m_ModStatus.empty()) {
+ return;
+ }
+
+ for (int i = m_ModStatus.size() - 1; i >= 0; --i) {
+ // the priority order was inverted on load so it has to be inverted again
+ unsigned int index = m_ModIndexByPriority[i];
+ if (index != UINT_MAX) {
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(index);
+ if (modInfo->getFixedPriority() == INT_MIN) {
+ if (m_ModStatus[index].m_Enabled) {
+ file.write("+");
+ } else {
+ file.write("-");
+ }
+ file.write(modInfo->name().toUtf8());
+ file.write("\r\n");
}
- file.write(modInfo->name().toUtf8());
- file.write("\r\n");
}
}
- }
- file.close();
- qDebug("%s saved", QDir::toNativeSeparators(fileName).toUtf8().constData());
+ file.close();
+
+
+ QString fileName = getModlistFileName();
+
+ if (QFile::exists(fileName)) {
+ shellDelete(QStringList(fileName));
+ }
+
+ if (!file.copy(fileName)) {
+ reportError(tr("failed to open \"%1\" for writing").arg(fileName));
+ return;
+ }
+
+ qDebug("%s saved", QDir::toNativeSeparators(fileName).toUtf8().constData());
+ } catch (const std::exception &e) {
+ reportError(tr("failed to write mod list: %1").arg(e.what()));
+ return;
+ }
}
@@ -331,6 +351,7 @@ void Profile::updateIndices()
for (unsigned int i = 0; i < m_ModStatus.size(); ++i) {
int priority = m_ModStatus[i].m_Priority;
if (priority < 0) {
+ // don't assign this to mapping at all, it's probably the overwrite mod
continue;
} else if (priority >= static_cast<int>(m_ModIndexByPriority.size())) {
qCritical("invalid priority %d for mod", priority);
@@ -418,7 +439,7 @@ int Profile::getModPriority(unsigned int index) const
void Profile::setModPriority(unsigned int index, int &newPriority)
{
- if (m_ModStatus[index].m_Overwrite) {
+ if (m_ModStatus.at(index).m_Overwrite) {
// can't change priority of the overwrite
return;
}
@@ -426,24 +447,25 @@ void Profile::setModPriority(unsigned int index, int &newPriority)
int newPriorityTemp = (std::max)(0, (std::min<int>)(m_ModStatus.size() - 1, newPriority));
// don't try to place below overwrite
- while (m_ModStatus[m_ModIndexByPriority[newPriorityTemp]].m_Overwrite) {
+ while ((m_ModIndexByPriority.at(newPriorityTemp) >= m_ModStatus.size()) ||
+ m_ModStatus.at(m_ModIndexByPriority.at(newPriorityTemp)).m_Overwrite) {
--newPriorityTemp;
}
- int oldPriority = m_ModStatus[index].m_Priority;
+ int oldPriority = m_ModStatus.at(index).m_Priority;
if (newPriorityTemp > oldPriority) {
// priority is higher than the old, so the gap we left is in lower priorities
for (int i = oldPriority + 1; i <= newPriorityTemp; ++i) {
- --m_ModStatus[m_ModIndexByPriority[i]].m_Priority;
+ --m_ModStatus.at(m_ModIndexByPriority.at(i)).m_Priority;
}
} else {
for (int i = newPriorityTemp; i < oldPriority; ++i) {
- ++m_ModStatus[m_ModIndexByPriority[i]].m_Priority;
+ ++m_ModStatus.at(m_ModIndexByPriority.at(i)).m_Priority;
}
++newPriority;
}
- m_ModStatus[index].m_Priority = newPriorityTemp;
+ m_ModStatus.at(index).m_Priority = newPriorityTemp;
updateIndices();
writeModlist();