summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainwindow.ui2
-rw-r--r--src/modinfo.cpp2
-rw-r--r--src/modinfo.h6
-rw-r--r--src/pluginlist.cpp15
-rw-r--r--src/profile.cpp86
-rw-r--r--src/version.rc4
6 files changed, 72 insertions, 43 deletions
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 54611235..923df17c 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -786,7 +786,7 @@ BSAs checked here are loaded in such a way that your installation order is obeye
<item>
<widget class="QLabel" name="bsaWarning">
<property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Marked Archives (&lt;img src=&quot;:/MO/gui/resources/dialog-warning_16.png&quot;/&gt;) are still loaded on Skyrim but the &lt;a href=&quot;http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;regular file override&lt;/span&gt;&lt;/a&gt; mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Marked Archives (&lt;img src=&quot;:/MO/gui/warning_16&quot;/&gt;) are still loaded on Skyrim but the &lt;a href=&quot;http://forums.bethsoft.com/topic/1354395-update-bsas-and-you/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;regular file override&lt;/span&gt;&lt;/a&gt; mechanism will apply: Loose files override BSAs, no matter the mod/plugin priority.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index 8372af55..166c815b 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -792,9 +792,9 @@ ModInfoBackup::ModInfoBackup(const QDir &path, DirectoryEntry **directoryStructu
ModInfoOverwrite::ModInfoOverwrite()
+ : m_StartupTime(QDateTime::currentDateTime())
{
testValid();
-
}
diff --git a/src/modinfo.h b/src/modinfo.h
index df948a76..7e217de7 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -811,7 +811,7 @@ public:
virtual void endorse(bool) {}
virtual QString name() const { return "Overwrite"; }
virtual QString notes() const { return ""; }
- virtual QDateTime creationTime() const { return QDateTime::currentDateTime(); }
+ virtual QDateTime creationTime() const { return m_StartupTime; }
virtual QString absolutePath() const;
virtual MOBase::VersionInfo getNewestVersion() const { return ""; }
virtual QString getInstallationFile() const { return ""; }
@@ -828,6 +828,10 @@ private:
ModInfoOverwrite();
+private:
+
+ QDateTime m_StartupTime;
+
};
#endif // MODINFO_H
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp
index f73805fd..ea23fcdd 100644
--- a/src/pluginlist.cpp
+++ b/src/pluginlist.cpp
@@ -594,6 +594,8 @@ int PluginList::columnCount(const QModelIndex &) const
void PluginList::testMasters()
{
+// emit layoutAboutToBeChanged();
+
std::set<QString> enabledMasters;
for (auto iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) {
if (iter->m_Enabled) {
@@ -613,7 +615,8 @@ void PluginList::testMasters()
}
}
- emit layoutChanged();
+#pragma message("emitting this seems to cause a crash!")
+// emit layoutChanged();
}
@@ -738,18 +741,18 @@ void PluginList::setPluginPriority(int row, int &newPriority)
if (!m_ESPs[row].m_IsMaster) {
// don't allow esps to be moved above esms
while ((newPriorityTemp < static_cast<int>(m_ESPsByPriority.size() - 1)) &&
- m_ESPs[m_ESPsByPriority[newPriorityTemp]].m_IsMaster) {
+ m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster) {
++newPriorityTemp;
}
} else {
// don't allow esms to be moved below esps
while ((newPriorityTemp > 0) &&
- !m_ESPs[m_ESPsByPriority[newPriorityTemp]].m_IsMaster) {
+ !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster) {
--newPriorityTemp;
}
// also don't allow "regular" esms to be moved above primary plugins
while ((newPriorityTemp < static_cast<int>(m_ESPsByPriority.size() - 1)) &&
- (m_ESPs[m_ESPsByPriority[newPriorityTemp]].m_ForceEnabled)) {
+ (m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_ForceEnabled)) {
++newPriorityTemp;
}
}
@@ -806,9 +809,9 @@ void PluginList::changePluginPriority(std::vector<int> rows, int newPriority)
}
refreshLoadOrder();
- startSaveTime();
-
emit layoutChanged();
+
+ startSaveTime();
}
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();
diff --git a/src/version.rc b/src/version.rc
index fb8dcf7c..7e988897 100644
--- a/src/version.rc
+++ b/src/version.rc
@@ -1,7 +1,7 @@
#include "Winver.h"
-#define VER_FILEVERSION 0,99,7,0
-#define VER_FILEVERSION_STR "0,99,7,0\0"
+#define VER_FILEVERSION 1,0,0,1
+#define VER_FILEVERSION_STR "1,0,0,1\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION