diff options
Diffstat (limited to 'src/profile.cpp')
| -rw-r--r-- | src/profile.cpp | 86 |
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(); |
