summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLostDragonist <lost.dragonist@gmail.com>2019-01-25 10:19:44 -0600
committerLostDragonist <lost.dragonist@gmail.com>2019-01-25 10:19:44 -0600
commita68a027febe6e094218654a24d4b5f9bdc31391a (patch)
treea259919f61020f9f74553c63d3a5e6f8b023f7b7 /src
parent63511cd390e1c1b7d6b28edcd691c1f72a81ca48 (diff)
parent0ab87850c4cb405b93c592e455a9d052ec84f66f (diff)
Merge remote-tracking branch 'remotes/origin/archive_conflicts_2' into Develop
Diffstat (limited to 'src')
-rw-r--r--src/directoryrefresher.cpp26
-rw-r--r--src/directoryrefresher.h1
-rw-r--r--src/mainwindow.cpp100
-rw-r--r--src/mainwindow.h3
-rw-r--r--src/mainwindow.ui57
-rw-r--r--src/modflagicondelegate.cpp54
-rw-r--r--src/modflagicondelegate.h2
-rw-r--r--src/modinfo.h26
-rw-r--r--src/modinfodialog.cpp23
-rw-r--r--src/modinfodialog.h3
-rw-r--r--src/modinfowithconflictinfo.cpp118
-rw-r--r--src/modinfowithconflictinfo.h28
-rw-r--r--src/modlist.cpp53
-rw-r--r--src/modlist.h7
-rw-r--r--src/modlistsortproxy.cpp11
-rw-r--r--src/organizer_en.ts1471
-rw-r--r--src/organizercore.cpp24
-rw-r--r--src/organizercore.h3
-rw-r--r--src/pluginlist.cpp4
-rw-r--r--src/resources.qrc7
-rw-r--r--src/resources/conflict-mixed-blue.pngbin0 -> 692 bytes
-rw-r--r--src/resources/conflict-overwrite-blue.pngbin0 -> 964 bytes
-rw-r--r--src/resources/conflict-overwritten-blue.pngbin0 -> 577 bytes
-rw-r--r--src/resources/red-archive-conflict-loser.pngbin0 -> 746 bytes
-rw-r--r--src/settings.cpp26
-rw-r--r--src/settings.h12
-rw-r--r--src/settingsdialog.cpp26
-rw-r--r--src/settingsdialog.h10
-rw-r--r--src/settingsdialog.ui112
-rw-r--r--src/shared/directoryentry.cpp141
-rw-r--r--src/shared/directoryentry.h26
-rw-r--r--src/syncoverwritedialog.cpp4
-rw-r--r--src/version.rc74
33 files changed, 1544 insertions, 908 deletions
diff --git a/src/directoryrefresher.cpp b/src/directoryrefresher.cpp
index cc745cc8..c48b77d9 100644
--- a/src/directoryrefresher.cpp
+++ b/src/directoryrefresher.cpp
@@ -27,6 +27,8 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QApplication>
#include <QDir>
#include <QString>
+#include <QTextCodec>
+#include <gameplugins.h>
using namespace MOBase;
@@ -83,13 +85,29 @@ void DirectoryRefresher::addModBSAToStructure(DirectoryEntry *directoryStructure
int priority, const QString &directory, const QStringList &archives)
{
std::wstring directoryW = ToWString(QDir::toNativeSeparators(directory));
+ IPluginGame *game = qApp->property("managed_game").value<IPluginGame*>();
+
+ GamePlugins *gamePlugins = game->feature<GamePlugins>();
+ QStringList loadOrder = QStringList();
+ gamePlugins->getLoadOrder(loadOrder);
for (const QString &archive : archives) {
QFileInfo fileInfo(archive);
if (m_EnabledArchives.find(fileInfo.fileName()) != m_EnabledArchives.end()) {
+
+ int order = -1;
+
+ for (auto plugin : loadOrder)
+ {
+ QString name = plugin.left(plugin.size() - 4);
+ if (fileInfo.fileName().startsWith(name + " - ", Qt::CaseInsensitive) || fileInfo.fileName().startsWith(name + ".", Qt::CaseInsensitive)) {
+ order = loadOrder.indexOf(plugin);
+ }
+ }
+
try {
- //directoryStructure->addFromBSA(ToWString(modName), directoryW,
- // ToWString(QDir::toNativeSeparators(fileInfo.absoluteFilePath())), priority);
+ IPluginGame *game = qApp->property("managed_game").value<IPluginGame*>();
+ directoryStructure->addFromBSA(ToWString(modName), directoryW, ToWString(QDir::toNativeSeparators(fileInfo.absoluteFilePath())), priority, order);
} catch (const std::exception &e) {
throw MyException(tr("failed to parse bsa %1: %2").arg(archive, e.what()));
}
@@ -115,7 +133,7 @@ void DirectoryRefresher::addModFilesToStructure(DirectoryEntry *directoryStructu
file->removeOrigin(0);
}
origin.addFile(file->getIndex());
- file->addOrigin(origin.getID(), file->getFileTime(), L"");
+ file->addOrigin(origin.getID(), file->getFileTime(), L"", -1);
} else {
qWarning("%s not found", qUtf8Printable(fileInfo.fileName()));
}
@@ -162,6 +180,8 @@ void DirectoryRefresher::refresh()
emit progress((i * 100) / static_cast<int>(m_Mods.size()) + 1);
}
+ m_DirectoryStructure->getFileRegister()->sortOrigins();
+
emit progress(100);
cleanStructure(m_DirectoryStructure);
diff --git a/src/directoryrefresher.h b/src/directoryrefresher.h
index 53709e1e..a4fc5dbc 100644
--- a/src/directoryrefresher.h
+++ b/src/directoryrefresher.h
@@ -27,6 +27,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <vector>
#include <set>
#include <tuple>
+#include "profile.h"
/**
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 5109c425..0af1be98 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -317,7 +317,7 @@ MainWindow::MainWindow(QSettings &initSettings
ui->espList->setItemDelegateForColumn(PluginList::COL_FLAGS, new GenericIconDelegate(ui->espList));
ui->espList->installEventFilter(m_OrganizerCore.pluginList());
- //ui->bsaList->setLocalMoveOnly(true);
+ ui->bsaList->setLocalMoveOnly(true);
initDownloadView();
bool pluginListAdjusted = registerWidgetState(ui->espList->objectName(), ui->espList->header(), "plugin_list_state");
@@ -452,6 +452,19 @@ MainWindow::MainWindow(QSettings &initSettings
ui->profileBox->setCurrentText(m_OrganizerCore.currentProfile()->name());
+ if (m_OrganizerCore.getArchiveParsing())
+ {
+ ui->showArchiveDataCheckBox->setCheckState(Qt::Checked);
+ ui->showArchiveDataCheckBox->setEnabled(true);
+ m_showArchiveData = true;
+ }
+ else
+ {
+ ui->showArchiveDataCheckBox->setCheckState(Qt::Unchecked);
+ ui->showArchiveDataCheckBox->setEnabled(false);
+ m_showArchiveData = false;
+ }
+
refreshExecutablesList();
updateToolBar();
@@ -1271,7 +1284,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director
directoryChild->setData(0, Qt::DecorationRole, *folderIcon);
directoryChild->setData(0, Qt::UserRole + 3, isDirectory);
- if (conflictsOnly) {
+ if (conflictsOnly || !m_showArchiveData) {
updateTo(directoryChild, temp.str(), **current, conflictsOnly, fileIcon, folderIcon);
if (directoryChild->childCount() != 0) {
subTree->addChild(directoryChild);
@@ -1306,10 +1319,14 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director
continue;
}
- QString fileName = ToQString(current->getName());
- QStringList columns(fileName);
bool isArchive = false;
int originID = current->getOrigin(isArchive);
+ if (!m_showArchiveData && isArchive) {
+ continue;
+ }
+
+ QString fileName = ToQString(current->getName());
+ QStringList columns(fileName);
FilesOrigin origin = m_OrganizerCore.directoryStructure()->getOriginByID(originID);
QString source("data");
unsigned int modIndex = ModInfo::getIndex(ToQString(origin.getName()));
@@ -1318,9 +1335,9 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director
source = modInfo->name();
}
- std::wstring archive = current->getArchive();
- if (archive.length() != 0) {
- source.append(" (").append(ToQString(archive)).append(")");
+ std::pair<std::wstring, int> archive = current->getArchive();
+ if (archive.first.length() != 0) {
+ source.append(" (").append(ToQString(archive.first)).append(")");
}
columns.append(source);
QTreeWidgetItem *fileChild = new QTreeWidgetItem(columns);
@@ -1342,12 +1359,12 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director
fileChild->setData(1, Qt::UserRole, source);
fileChild->setData(1, Qt::UserRole + 1, originID);
- std::vector<std::pair<int, std::wstring>> alternatives = current->getAlternatives();
+ std::vector<std::pair<int, std::pair<std::wstring, int>>> alternatives = current->getAlternatives();
if (!alternatives.empty()) {
std::wostringstream altString;
altString << ToWString(tr("Also in: <br>"));
- for (std::vector<std::pair<int, std::wstring>>::iterator altIter = alternatives.begin();
+ for (std::vector<std::pair<int, std::pair<std::wstring, int>>>::iterator altIter = alternatives.begin();
altIter != alternatives.end(); ++altIter) {
if (altIter != alternatives.begin()) {
altString << " , ";
@@ -2275,9 +2292,23 @@ void MainWindow::modorder_changed()
for (int i : modInfo->getModOverwritten()) {
ModInfo::getByIndex(i)->clearCaches();
}
+ for (int i : modInfo->getModArchiveOverwrite()) {
+ ModInfo::getByIndex(i)->clearCaches();
+ }
+ for (int i : modInfo->getModArchiveOverwritten()) {
+ ModInfo::getByIndex(i)->clearCaches();
+ }
+ for (int i : modInfo->getModArchiveLooseOverwrite()) {
+ ModInfo::getByIndex(i)->clearCaches();
+ }
+ for (int i : modInfo->getModArchiveLooseOverwritten()) {
+ ModInfo::getByIndex(i)->clearCaches();
+ }
// update conflict check on the moved mod
modInfo->doConflictCheck();
m_OrganizerCore.modList()->setOverwriteMarkers(modInfo->getModOverwrite(), modInfo->getModOverwritten());
+ m_OrganizerCore.modList()->setArchiveOverwriteMarkers(modInfo->getModArchiveOverwrite(), modInfo->getModArchiveOverwritten());
+ m_OrganizerCore.modList()->setArchiveLooseOverwriteMarkers(modInfo->getModArchiveLooseOverwrite(), modInfo->getModArchiveLooseOverwritten());
if (m_ModListSortProxy != nullptr) {
m_ModListSortProxy->invalidate();
}
@@ -2351,10 +2382,10 @@ void MainWindow::fileMoved(const QString &filePath, const QString &oldOriginName
QString fullNewPath = ToQString(newOrigin.getPath()) + "\\" + filePath;
WIN32_FIND_DATAW findData;
- HANDLE hFind;
- hFind = ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData);
- filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L"");
- FindClose(hFind);
+ HANDLE hFind;
+ hFind = ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData);
+ filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L"", -1);
+ FindClose(hFind);
}
if (m_OrganizerCore.directoryStructure()->originExists(ToWString(oldOriginName))) {
FilesOrigin &oldOrigin = m_OrganizerCore.directoryStructure()->getOriginByName(ToWString(oldOriginName));
@@ -2520,8 +2551,12 @@ void MainWindow::modlistSelectionChanged(const QModelIndex &current, const QMode
if (current.isValid()) {
ModInfo::Ptr selectedMod = ModInfo::getByIndex(current.data(Qt::UserRole + 1).toInt());
m_OrganizerCore.modList()->setOverwriteMarkers(selectedMod->getModOverwrite(), selectedMod->getModOverwritten());
+ m_OrganizerCore.modList()->setArchiveOverwriteMarkers(selectedMod->getModArchiveOverwrite(), selectedMod->getModArchiveOverwritten());
+ m_OrganizerCore.modList()->setArchiveLooseOverwriteMarkers(selectedMod->getModArchiveLooseOverwrite(), selectedMod->getModArchiveLooseOverwritten());
} else {
m_OrganizerCore.modList()->setOverwriteMarkers(std::set<unsigned int>(), std::set<unsigned int>());
+ m_OrganizerCore.modList()->setArchiveOverwriteMarkers(std::set<unsigned int>(), std::set<unsigned int>());
+ m_OrganizerCore.modList()->setArchiveLooseOverwriteMarkers(std::set<unsigned int>(), std::set<unsigned int>());
}
/* if ((m_ModListSortProxy != nullptr)
&& !m_ModListSortProxy->beingInvalidated()) {
@@ -2814,7 +2849,7 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index,
}
} else {
modInfo->saveMeta();
- ModInfoDialog dialog(modInfo, m_OrganizerCore.directoryStructure(), modInfo->hasFlag(ModInfo::FLAG_FOREIGN), &m_OrganizerCore, &m_PluginContainer,this);
+ ModInfoDialog dialog(modInfo, m_OrganizerCore.directoryStructure(), modInfo->hasFlag(ModInfo::FLAG_FOREIGN), &m_OrganizerCore, &m_PluginContainer, this);
connect(&dialog, SIGNAL(linkActivated(QString)), this, SLOT(linkClicked(QString)));
connect(&dialog, SIGNAL(downloadRequest(QString)), &m_OrganizerCore, SLOT(downloadRequestedNXM(QString)));
connect(&dialog, SIGNAL(modOpen(QString, int)), this, SLOT(displayModInformation(QString, int)), Qt::QueuedConnection);
@@ -2849,7 +2884,6 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index,
m_OrganizerCore.settings().directInterface().setValue("mod_info_tabs", dialog.saveTabState());
settings.setValue(key, dialog.saveGeometry());
-
modInfo->saveMeta();
emit modInfoDisplayed();
m_OrganizerCore.modList()->modInfoChanged(modInfo);
@@ -2871,6 +2905,7 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index,
, modInfo->stealFiles()
, modInfo->archives());
DirectoryRefresher::cleanStructure(m_OrganizerCore.directoryStructure());
+ m_OrganizerCore.directoryStructure()->getFileRegister()->sortOrigins();
m_OrganizerCore.refreshLists();
}
}
@@ -4791,6 +4826,27 @@ void MainWindow::on_actionSettings_triggered()
m_OrganizerCore.profileRefresh();
}
+ const auto state = settings.archiveParsing();
+ if (state != m_OrganizerCore.getArchiveParsing())
+ {
+ m_OrganizerCore.setArchiveParsing(state);
+ if (!state)
+ {
+ ui->showArchiveDataCheckBox->setCheckState(Qt::Unchecked);
+ ui->showArchiveDataCheckBox->setEnabled(false);
+ m_showArchiveData = false;
+ }
+ else
+ {
+ ui->showArchiveDataCheckBox->setCheckState(Qt::Checked);
+ ui->showArchiveDataCheckBox->setEnabled(true);
+ m_showArchiveData = true;
+ }
+ m_OrganizerCore.refreshModList();
+ m_OrganizerCore.refreshDirectoryStructure();
+ m_OrganizerCore.refreshLists();
+ }
+
if (settings.getCacheDirectory() != oldCacheDirectory) {
NexusInterface::instance(&m_PluginContainer)->setCacheDirectory(settings.getCacheDirectory());
}
@@ -6455,3 +6511,17 @@ void MainWindow::sendSelectedModsToSeparator_clicked()
}
settings.setValue(key, dialog.saveGeometry());
}
+
+void MainWindow::on_showArchiveDataCheckBox_toggled(const bool checked)
+{
+ if (m_OrganizerCore.getArchiveParsing() && checked)
+ {
+ m_showArchiveData = checked;
+ }
+ else
+ {
+ m_showArchiveData = false;
+ }
+ refreshDataTree();
+}
+
diff --git a/src/mainwindow.h b/src/mainwindow.h
index f2b9bc88..a8601bee 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -376,6 +376,8 @@ private:
bool m_closing{ false };
+ bool m_showArchiveData{ true };
+
std::vector<std::pair<QString, QHeaderView*>> m_PersistedGeometry;
MOBase::DelayedFileWriter m_ArchiveListWriter;
@@ -620,6 +622,7 @@ private slots: // ui slots
void on_btnRefreshDownloads_clicked();
void on_categoriesList_customContextMenuRequested(const QPoint &pos);
void on_conflictsCheckBox_toggled(bool checked);
+ void on_showArchiveDataCheckBox_toggled(bool checked);
void on_dataTree_customContextMenuRequested(const QPoint &pos);
void on_executablesListBox_currentIndexChanged(int index);
void on_modList_customContextMenuRequested(const QPoint &pos);
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 83b99486..e30466ac 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -860,6 +860,9 @@ p, li { white-space: pre-wrap; }
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QPushButton" name="bossButton">
+ <property name="visible">
+ <bool>true</bool>
+ </property>
<property name="text">
<string>Sort</string>
</property>
@@ -1103,7 +1106,7 @@ p, li { white-space: pre-wrap; }
</layout>
</item>
<item>
- <widget class="QTreeWidget" name="bsaList">
+ <widget class="MOBase::SortableTreeWidget" name="bsaList">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
@@ -1119,19 +1122,19 @@ p, li { white-space: pre-wrap; }
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
- <property name="dragEnabled">
+ <property name="dragEnabled" stdset="0">
<bool>false</bool>
</property>
- <property name="dragDropOverwriteMode">
+ <property name="dragDropOverwriteMode" stdset="0">
<bool>false</bool>
</property>
- <property name="indentation">
+ <property name="indentation" stdset="0">
<number>20</number>
</property>
- <property name="itemsExpandable">
+ <property name="itemsExpandable" stdset="0">
<bool>true</bool>
</property>
- <property name="columnCount">
+ <property name="columnCount" stdset="0">
<number>1</number>
</property>
<column>
@@ -1211,17 +1214,37 @@ p, li { white-space: pre-wrap; }
</layout>
</item>
<item>
- <widget class="QCheckBox" name="conflictsCheckBox">
- <property name="toolTip">
- <string>Filter the above list so that only conflicts are displayed.</string>
- </property>
- <property name="whatsThis">
- <string>Filter the above list so that only conflicts are displayed.</string>
- </property>
- <property name="text">
- <string>Show only conflicts</string>
- </property>
- </widget>
+ <layout class="QHBoxLayout" name="horizontalLayout_12">
+ <item>
+ <widget class="QCheckBox" name="conflictsCheckBox">
+ <property name="toolTip">
+ <string>Filters the above list so that only conflicts are displayed.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Filters the above list so that only conflicts are displayed.</string>
+ </property>
+ <property name="text">
+ <string>Show only conflicts</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="showArchiveDataCheckBox">
+ <property name="toolTip">
+ <string>Filters the above list so that files from archives are not shown</string>
+ </property>
+ <property name="statusTip">
+ <string/>
+ </property>
+ <property name="whatsThis">
+ <string>Filters the above list so that files from archives are not shown</string>
+ </property>
+ <property name="text">
+ <string>Show files from Archives</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</widget>
diff --git a/src/modflagicondelegate.cpp b/src/modflagicondelegate.cpp
index 1995964b..eb6945c4 100644
--- a/src/modflagicondelegate.cpp
+++ b/src/modflagicondelegate.cpp
@@ -1,4 +1,4 @@
- #include "modflagicondelegate.h"
+#include "modflagicondelegate.h"
#include <QList>
@@ -7,6 +7,13 @@ ModInfo::EFlag ModFlagIconDelegate::m_ConflictFlags[4] = { ModInfo::FLAG_CONFLIC
, ModInfo::FLAG_CONFLICT_OVERWRITTEN
, ModInfo::FLAG_CONFLICT_REDUNDANT };
+ModInfo::EFlag ModFlagIconDelegate::m_ArchiveLooseConflictFlags[2] = { ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE
+ , ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN };
+
+ModInfo::EFlag ModFlagIconDelegate::m_ArchiveConflictFlags[3] = { ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED
+ , ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITE
+ , ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN };
+
ModFlagIconDelegate::ModFlagIconDelegate(QObject *parent)
: IconDelegate(parent)
{
@@ -19,7 +26,8 @@ QList<QString> ModFlagIconDelegate::getIcons(const QModelIndex &index) const {
ModInfo::Ptr info = ModInfo::getByIndex(modid.toInt());
std::vector<ModInfo::EFlag> flags = info->getFlags();
- { // insert conflict icon first to provide nicer alignment
+ // insert conflict icons to provide nicer alignment
+ { // insert loose file conflicts first
auto iter = std::find_first_of(flags.begin(), flags.end(),
m_ConflictFlags, m_ConflictFlags + 4);
if (iter != flags.end()) {
@@ -30,6 +38,41 @@ QList<QString> ModFlagIconDelegate::getIcons(const QModelIndex &index) const {
}
}
+ { // insert loose vs archive overwrite second
+ auto iter = std::find(flags.begin(), flags.end(),
+ ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
+ if (iter != flags.end()) {
+ result.append(getFlagIcon(*iter));
+ flags.erase(iter);
+ }
+ else {
+ result.append(QString());
+ }
+ }
+
+ { // insert loose vs archive overwritten third
+ auto iter = std::find_first_of(flags.begin(), flags.end(),
+ m_ArchiveLooseConflictFlags + 1, m_ArchiveLooseConflictFlags + 2);
+ if (iter != flags.end()) {
+ result.append(getFlagIcon(*iter));
+ flags.erase(iter);
+ }
+ else {
+ result.append(QString());
+ }
+ }
+
+ { // insert archive conflicts last
+ auto iter = std::find_first_of(flags.begin(), flags.end(),
+ m_ArchiveConflictFlags, m_ArchiveConflictFlags + 3);
+ if (iter != flags.end()) {
+ result.append(getFlagIcon(*iter));
+ flags.erase(iter);
+ } else {
+ result.append(QString());
+ }
+ }
+
for (auto iter = flags.begin(); iter != flags.end(); ++iter) {
result.append(getFlagIcon(*iter));
}
@@ -44,10 +87,15 @@ QString ModFlagIconDelegate::getFlagIcon(ModInfo::EFlag flag) const
case ModInfo::FLAG_INVALID: return ":/MO/gui/problem";
case ModInfo::FLAG_NOTENDORSED: return ":/MO/gui/emblem_notendorsed";
case ModInfo::FLAG_NOTES: return ":/MO/gui/emblem_notes";
+ case ModInfo::FLAG_CONFLICT_MIXED: return ":/MO/gui/emblem_conflict_mixed";
case ModInfo::FLAG_CONFLICT_OVERWRITE: return ":/MO/gui/emblem_conflict_overwrite";
case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return ":/MO/gui/emblem_conflict_overwritten";
- case ModInfo::FLAG_CONFLICT_MIXED: return ":/MO/gui/emblem_conflict_mixed";
case ModInfo::FLAG_CONFLICT_REDUNDANT: return ":MO/gui/emblem_conflict_redundant";
+ case ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE: return ":/MO/gui/archive_loose_conflict_overwrite";
+ case ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN: return ":/MO/gui/archive_loose_conflict_overwritten";
+ case ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED: return ":/MO/gui/archive_conflict_mixed";
+ case ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITE: return ":/MO/gui/archive_conflict_winner";
+ case ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN: return ":/MO/gui/archive_conflict_loser";
case ModInfo::FLAG_ALTERNATE_GAME: return ":MO/gui/alternate_game";
default: return QString();
}
diff --git a/src/modflagicondelegate.h b/src/modflagicondelegate.h
index b31a250b..0f257c7d 100644
--- a/src/modflagicondelegate.h
+++ b/src/modflagicondelegate.h
@@ -15,6 +15,8 @@ private:
QString getFlagIcon(ModInfo::EFlag flag) const;
private:
static ModInfo::EFlag m_ConflictFlags[4];
+ static ModInfo::EFlag m_ArchiveLooseConflictFlags[2];
+ static ModInfo::EFlag m_ArchiveConflictFlags[3];
};
#endif // MODFLAGICONDELEGATE_H
diff --git a/src/modinfo.h b/src/modinfo.h
index b6d7209c..6b7c714e 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -72,6 +72,11 @@ public:
FLAG_CONFLICT_OVERWRITTEN,
FLAG_CONFLICT_MIXED,
FLAG_CONFLICT_REDUNDANT,
+ FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE,
+ FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN,
+ FLAG_ARCHIVE_CONFLICT_OVERWRITE,
+ FLAG_ARCHIVE_CONFLICT_OVERWRITTEN,
+ FLAG_ARCHIVE_CONFLICT_MIXED,
FLAG_PLUGIN_SELECTED,
FLAG_ALTERNATE_GAME
};
@@ -90,7 +95,6 @@ public:
CONTENT_MCM,
CONTENT_INI,
CONTENT_MODGROUP
-
};
static const int NUM_CONTENT_TYPES = CONTENT_MODGROUP + 1;
@@ -626,6 +630,26 @@ public:
virtual std::set<unsigned int> getModOverwritten() { return std::set<unsigned int>(); }
/**
+ * @return retrieve list of mods (as mod index) with archives that are overwritten by this one. Updates may be delayed
+ */
+ virtual std::set<unsigned int> getModArchiveOverwrite() { return std::set<unsigned int>(); }
+
+ /**
+ * @return list of mods (as mod index) with archives that overwrite this one. Updates may be delayed
+ */
+ virtual std::set<unsigned int> getModArchiveOverwritten() { return std::set<unsigned int>(); }
+
+ /**
+ * @return retrieve list of mods (as mod index) with archives that are overwritten by thos mod's loose files. Updates may be delayed
+ */
+ virtual std::set<unsigned int> getModArchiveLooseOverwrite() { return std::set<unsigned int>(); }
+
+ /**
+ * @return list of mods (as mod index) with loose files that overwrite this one's archive files. Updates may be delayed
+ */
+ virtual std::set<unsigned int> getModArchiveLooseOverwritten() { return std::set<unsigned int>(); }
+
+ /**
* @brief update conflict information
*/
virtual void doConflictCheck() const {}
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 40fae0e4..d2e5e84f 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -318,10 +318,10 @@ void ModInfoDialog::refreshLists()
QString fileName = relativeName.mid(0).prepend(m_RootPath);
bool archive;
if ((*iter)->getOrigin(archive) == m_Origin->getID()) {
- std::vector<std::pair<int, std::wstring>> alternatives = (*iter)->getAlternatives();
+ std::vector<std::pair<int, std::pair<std::wstring, int>>> alternatives = (*iter)->getAlternatives();
if (!alternatives.empty()) {
std::wostringstream altString;
- for (std::vector<std::pair<int, std::wstring>>::iterator altIter = alternatives.begin();
+ for (std::vector<std::pair<int, std::pair<std::wstring, int>>>::iterator altIter = alternatives.begin();
altIter != alternatives.end(); ++altIter) {
if (altIter != alternatives.begin()) {
altString << ", ";
@@ -330,11 +330,18 @@ void ModInfoDialog::refreshLists()
}
QStringList fields(relativeName.prepend("..."));
fields.append(ToQString(altString.str()));
- QTreeWidgetItem *item = new QTreeWidgetItem(fields);
+
+ QTreeWidgetItem *item = new QTreeWidgetItem(fields);
item->setData(0, Qt::UserRole, fileName);
- item->setData(1, Qt::UserRole, ToQString(m_Directory->getOriginByID(alternatives.begin()->first).getName()));
- item->setData(1, Qt::UserRole + 1, alternatives.begin()->first);
+ item->setData(1, Qt::UserRole, ToQString(m_Directory->getOriginByID(alternatives.back().first).getName()));
+ item->setData(1, Qt::UserRole + 1, alternatives.back().first);
item->setData(1, Qt::UserRole + 2, archive);
+ if (archive) {
+ QFont font = item->font(0);
+ font.setItalic(true);
+ item->setFont(0, font);
+ item->setFont(1, font);
+ }
ui->overwriteTree->addTopLevelItem(item);
++numOverwrite;
} else {// otherwise don't display the file
@@ -348,6 +355,12 @@ void ModInfoDialog::refreshLists()
item->setData(0, Qt::UserRole, fileName);
item->setData(1, Qt::UserRole, ToQString(realOrigin.getName()));
item->setData(1, Qt::UserRole + 2, archive);
+ if (archive) {
+ QFont font = item->font(0);
+ font.setItalic(true);
+ item->setFont(0, font);
+ item->setFont(1, font);
+ }
ui->overwrittenTree->addTopLevelItem(item);
++numOverwritten;
}
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 61517100..4c731c00 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -78,7 +78,8 @@ public:
* @param modInfo info structure about the mod to display
* @param parent parend widget
**/
- explicit ModInfoDialog(ModInfo::Ptr modInfo, const MOShared::DirectoryEntry *directory, bool unmanaged, OrganizerCore *organizerCore, PluginContainer *pluginContainer,QWidget *parent = 0);
+ explicit ModInfoDialog(ModInfo::Ptr modInfo, const MOShared::DirectoryEntry *directory, bool unmanaged, OrganizerCore *organizerCore, PluginContainer *pluginContainer, QWidget *parent = 0);
+
~ModInfoDialog();
/**
diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp
index e88ba29d..12cbf416 100644
--- a/src/modinfowithconflictinfo.cpp
+++ b/src/modinfowithconflictinfo.cpp
@@ -7,7 +7,7 @@ using namespace MOBase;
using namespace MOShared;
ModInfoWithConflictInfo::ModInfoWithConflictInfo(PluginContainer *pluginContainer, DirectoryEntry **directoryStructure)
- : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure) {}
+ : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false) {}
void ModInfoWithConflictInfo::clearCaches()
{
@@ -32,6 +32,31 @@ std::vector<ModInfo::EFlag> ModInfoWithConflictInfo::getFlags() const
} break;
default: { /* NOP */ }
}
+ switch (isLooseArchiveConflicted()) {
+ case CONFLICT_MIXED: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN);
+ } break;
+ case CONFLICT_OVERWRITE: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
+ } break;
+ case CONFLICT_OVERWRITTEN: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN);
+ } break;
+ default: { /* NOP */ }
+ }
+ switch (isArchiveConflicted()) {
+ case CONFLICT_MIXED: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED);
+ } break;
+ case CONFLICT_OVERWRITE: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITE);
+ } break;
+ case CONFLICT_OVERWRITTEN: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN);
+ } break;
+ default: { /* NOP */ }
+ }
return result;
}
@@ -40,6 +65,10 @@ void ModInfoWithConflictInfo::doConflictCheck() const
{
m_OverwriteList.clear();
m_OverwrittenList.clear();
+ m_ArchiveOverwriteList.clear();
+ m_ArchiveOverwrittenList.clear();
+ m_ArchiveLooseOverwriteList.clear();
+ m_ArchiveLooseOverwrittenList.clear();
bool providesAnything = false;
@@ -51,34 +80,73 @@ void ModInfoWithConflictInfo::doConflictCheck() const
std::wstring name = ToWString(this->name());
m_CurrentConflictState = CONFLICT_NONE;
+ m_ArchiveConflictState = CONFLICT_NONE;
+ m_ArchiveConflictLooseState = CONFLICT_NONE;
if ((*m_DirectoryStructure)->originExists(name)) {
FilesOrigin &origin = (*m_DirectoryStructure)->getOriginByName(name);
std::vector<FileEntry::Ptr> files = origin.getFiles();
// for all files in this origin
for (FileEntry::Ptr file : files) {
- const std::vector<std::pair<int, std::wstring>> &alternatives = file->getAlternatives();
- if ((alternatives.size() == 0) || (alternatives.begin()->first == dataID)) {
+ auto alternatives = file->getAlternatives();
+ if ((alternatives.size() == 0) || (alternatives.back().first == dataID)) {
// no alternatives -> no conflict
providesAnything = true;
} else {
+ // Get the archive data for the current mod
+ bool found = file->getOrigin() == origin.getID();
+ std::pair<std::wstring, int> archiveData;
+ if (found)
+ archiveData = file->getArchive();
+ else {
+ for (auto alts : alternatives) {
+ if (alts.first == origin.getID()) {
+ archiveData = alts.second;
+ break;
+ }
+ }
+ }
+
+ // If this is not the origin then determine the correct overwrite
if (file->getOrigin() != origin.getID()) {
FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(file->getOrigin());
unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
- m_OverwrittenList.insert(altIndex);
+ if (file->getArchive().first.size() == 0)
+ if (archiveData.first.size() == 0)
+ m_OverwrittenList.insert(altIndex);
+ else
+ m_ArchiveLooseOverwrittenList.insert(altIndex);
+ else
+ m_ArchiveOverwrittenList.insert(altIndex);
} else {
providesAnything = true;
}
- // for all non-providing alternative origins
+ // Sort out the alternatives
for (auto altInfo : alternatives) {
if ((altInfo.first != dataID) && (altInfo.first != origin.getID())) {
FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(altInfo.first);
unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
- if (origin.getPriority() > altOrigin.getPriority()) {
- m_OverwriteList.insert(altIndex);
+ if (altInfo.second.first.size() == 0) {
+ if (archiveData.first.size() == 0) {
+ if (origin.getPriority() > altOrigin.getPriority()) {
+ m_OverwriteList.insert(altIndex);
+ } else {
+ m_OverwrittenList.insert(altIndex);
+ }
+ } else {
+ m_ArchiveLooseOverwrittenList.insert(altIndex);
+ }
} else {
- m_OverwrittenList.insert(altIndex);
+ if (archiveData.first.size() == 0) {
+ m_ArchiveLooseOverwriteList.insert(altIndex);
+ } else {
+ if (archiveData.second > altInfo.second.second) {
+ m_ArchiveOverwriteList.insert(altIndex);
+ } else if (archiveData.second < altInfo.second.second) {
+ m_ArchiveOverwrittenList.insert(altIndex);
+ }
+ }
}
}
}
@@ -95,6 +163,20 @@ void ModInfoWithConflictInfo::doConflictCheck() const
m_CurrentConflictState = CONFLICT_OVERWRITE;
else if (!m_OverwrittenList.empty())
m_CurrentConflictState = CONFLICT_OVERWRITTEN;
+
+ if (!m_ArchiveOverwriteList.empty() && !m_ArchiveOverwrittenList.empty())
+ m_ArchiveConflictState = CONFLICT_MIXED;
+ else if (!m_ArchiveOverwriteList.empty())
+ m_ArchiveConflictState = CONFLICT_OVERWRITE;
+ else if (!m_ArchiveOverwrittenList.empty())
+ m_ArchiveConflictState = CONFLICT_OVERWRITTEN;
+
+ if (!m_ArchiveLooseOverwrittenList.empty() && !m_ArchiveLooseOverwriteList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_MIXED;
+ else if (!m_ArchiveLooseOverwrittenList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_OVERWRITTEN;
+ else if (!m_ArchiveLooseOverwriteList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_OVERWRITE;
}
}
}
@@ -110,6 +192,26 @@ ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isConflicted() c
return m_CurrentConflictState;
}
+ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isArchiveConflicted() const
+{
+ QTime now = QTime::currentTime();
+ if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) {
+ doConflictCheck();
+ }
+
+ return m_ArchiveConflictState;
+}
+
+ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isLooseArchiveConflicted() const
+{
+ QTime now = QTime::currentTime();
+ if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) {
+ doConflictCheck();
+ }
+
+ return m_ArchiveConflictLooseState;
+}
+
bool ModInfoWithConflictInfo::isRedundant() const
{
diff --git a/src/modinfowithconflictinfo.h b/src/modinfowithconflictinfo.h
index 6c1591c5..13d87d25 100644
--- a/src/modinfowithconflictinfo.h
+++ b/src/modinfowithconflictinfo.h
@@ -23,6 +23,14 @@ public:
virtual std::set<unsigned int> getModOverwritten() { return m_OverwrittenList; }
+ virtual std::set<unsigned int> getModArchiveOverwrite() { return m_ArchiveOverwriteList; }
+
+ virtual std::set<unsigned int> getModArchiveOverwritten() { return m_ArchiveOverwrittenList; }
+
+ virtual std::set<unsigned int> getModArchiveLooseOverwrite() { return m_ArchiveLooseOverwriteList; }
+
+ virtual std::set<unsigned int> getModArchiveLooseOverwritten() { return m_ArchiveLooseOverwrittenList; }
+
virtual void doConflictCheck() const;
private:
@@ -32,7 +40,8 @@ private:
CONFLICT_OVERWRITE,
CONFLICT_OVERWRITTEN,
CONFLICT_MIXED,
- CONFLICT_REDUNDANT
+ CONFLICT_REDUNDANT,
+ CONFLICT_CROSS
};
private:
@@ -43,6 +52,16 @@ private:
EConflictType isConflicted() const;
/**
+ * @return true if there are archive conflicts for files in this mod
+ */
+ EConflictType isArchiveConflicted() const;
+
+ /**
+ * @return true if there are archive conflicts with loose files in this mod
+ */
+ EConflictType isLooseArchiveConflicted() const;
+
+ /**
* @return true if this mod is completely replaced by others
*/
bool isRedundant() const;
@@ -52,10 +71,17 @@ private:
MOShared::DirectoryEntry **m_DirectoryStructure;
mutable EConflictType m_CurrentConflictState;
+ mutable EConflictType m_ArchiveConflictState;
+ mutable EConflictType m_ArchiveConflictLooseState;
+ mutable bool m_HasLooseOverwrite;
mutable QTime m_LastConflictCheck;
mutable std::set<unsigned int> m_OverwriteList; // indices of mods overritten by this mod
mutable std::set<unsigned int> m_OverwrittenList; // indices of mods overwriting this mod
+ mutable std::set<unsigned int> m_ArchiveOverwriteList; // indices of mods with archive files overritten by this mod
+ mutable std::set<unsigned int> m_ArchiveOverwrittenList; // indices of mods with archive files overwriting this mod
+ mutable std::set<unsigned int> m_ArchiveLooseOverwriteList; // indices of mods with archives being overwritten by this mod's loose files
+ mutable std::set<unsigned int> m_ArchiveLooseOverwrittenList; // indices of mods with loose files overwriting this mod's archive files
};
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 17bc46fd..224818c8 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -158,10 +158,15 @@ QString ModList::getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const
output << QString("<i>%1</i>").arg(modInfo->notes());
return output.join("");
}
- case ModInfo::FLAG_CONFLICT_OVERWRITE: return tr("Overwrites files");
- case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return tr("Overwritten files");
- case ModInfo::FLAG_CONFLICT_MIXED: return tr("Overwrites & Overwritten");
+ case ModInfo::FLAG_CONFLICT_OVERWRITE: return tr("Overwrites loose files");
+ case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return tr("Overwritten loose files");
+ case ModInfo::FLAG_CONFLICT_MIXED: return tr("Loose files Overwrites & Overwritten");
case ModInfo::FLAG_CONFLICT_REDUNDANT: return tr("Redundant");
+ case ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE: return tr("Overwrites an archive with loose files");
+ case ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN: return tr("Archive is overwritten by loose files");
+ case ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITE: return tr("Overwrites another archive file");
+ case ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN: return tr("Overwritten by another archive file");
+ case ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED: return tr("Archive files overwrites & overwritten");
case ModInfo::FLAG_ALTERNATE_GAME: return tr("<br>This mod is for a different game, "
"make sure it's compatible or it could cause crashes.");
default: return "";
@@ -400,13 +405,22 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
return QVariant();
} else if ((role == Qt::BackgroundRole)
|| (role == ViewMarkingScrollBar::DEFAULT_ROLE)) {
+ bool overwrite = m_Overwrite.find(modIndex) != m_Overwrite.end();
+ bool archiveOverwrite = m_ArchiveOverwrite.find(modIndex) != m_ArchiveOverwrite.end();
+ bool archiveLooseOverwrite = m_ArchiveLooseOverwrite.find(modIndex) != m_ArchiveLooseOverwrite.end();
+ bool overwritten = m_Overwritten.find(modIndex) != m_Overwritten.end();
+ bool archiveOverwritten = m_ArchiveOverwritten.find(modIndex) != m_ArchiveOverwritten.end();
+ bool archiveLooseOverwritten = m_ArchiveLooseOverwritten.find(modIndex) != m_ArchiveLooseOverwritten.end();
if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_PLUGIN) {
return Settings::instance().modlistContainsPluginColor();
- } else if (m_Overwrite.find(modIndex) != m_Overwrite.end()) {
- return Settings::instance().modlistOverwrittenLooseColor();
- }
- else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) {
+ } else if (overwritten || archiveLooseOverwritten) {
return Settings::instance().modlistOverwritingLooseColor();
+ } else if (overwrite || archiveLooseOverwrite) {
+ return Settings::instance().modlistOverwrittenLooseColor();
+ } else if (archiveOverwritten) {
+ return Settings::instance().modlistOverwritingArchiveColor();
+ } else if (archiveOverwrite) {
+ return Settings::instance().modlistOverwrittenArchiveColor();
} else if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR)
&& modInfo->getColor().isValid()
&& ((role != ViewMarkingScrollBar::DEFAULT_ROLE)
@@ -517,7 +531,6 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
ModInfo::Ptr info = ModInfo::getByIndex(modID);
IModList::ModStates oldState = state(modID);
-
bool result = false;
emit aboutToChangeData();
@@ -755,6 +768,20 @@ void ModList::setOverwriteMarkers(const std::set<unsigned int> &overwrite, const
notifyChange(0, rowCount() - 1);
}
+void ModList::setArchiveOverwriteMarkers(const std::set<unsigned int> &overwrite, const std::set<unsigned int> &overwritten)
+{
+ m_ArchiveOverwrite = overwrite;
+ m_ArchiveOverwritten = overwritten;
+ notifyChange(0, rowCount() - 1);
+}
+
+void ModList::setArchiveLooseOverwriteMarkers(const std::set<unsigned int> &overwrite, const std::set<unsigned int> &overwritten)
+{
+ m_ArchiveLooseOverwrite = overwrite;
+ m_ArchiveLooseOverwritten = overwritten;
+ notifyChange(0, rowCount() - 1);
+}
+
void ModList::setPluginContainer(PluginContainer *pluginContianer)
{
m_PluginContainer = pluginContianer;
@@ -811,10 +838,10 @@ void ModList::highlightMods(const QItemSelectionModel *selection, const MOShared
const MOShared::FileEntry::Ptr fileEntry = directoryEntry.findFile(modName.toStdWString());
if (fileEntry.get() != nullptr) {
bool archive = false;
- std::vector<std::pair<int, std::wstring>> origins;
+ std::vector<std::pair<int, std::pair<std::wstring, int>>> origins;
{
- std::vector<std::pair<int, std::wstring>> alternatives = fileEntry->getAlternatives();
- origins.insert(origins.end(), std::pair<int, std::wstring>(fileEntry->getOrigin(archive), fileEntry->getArchive()));
+ std::vector<std::pair<int, std::pair<std::wstring, int>>> alternatives = fileEntry->getAlternatives();
+ origins.insert(origins.end(), std::pair<int, std::pair<std::wstring, int>>(fileEntry->getOrigin(archive), fileEntry->getArchive()));
}
for (auto originInfo : origins) {
MOShared::FilesOrigin &origin = directoryEntry.getOriginByID(originInfo.first);
@@ -1126,6 +1153,10 @@ void ModList::notifyChange(int rowStart, int rowEnd)
if (rowStart < 0) {
m_Overwrite.clear();
m_Overwritten.clear();
+ m_ArchiveOverwrite.clear();
+ m_ArchiveOverwritten.clear();
+ m_ArchiveLooseOverwrite.clear();
+ m_ArchiveLooseOverwritten.clear();
beginResetModel();
endResetModel();
} else {
diff --git a/src/modlist.h b/src/modlist.h
index 443d583b..402d662f 100644
--- a/src/modlist.h
+++ b/src/modlist.h
@@ -112,6 +112,9 @@ public:
void setOverwriteMarkers(const std::set<unsigned int> &overwrite, const std::set<unsigned int> &overwritten);
void setPluginContainer(PluginContainer *pluginContainer);
+ void setArchiveOverwriteMarkers(const std::set<unsigned int> &overwrite, const std::set<unsigned int> &overwritten);
+ void setArchiveLooseOverwriteMarkers(const std::set<unsigned int> &overwrite, const std::set<unsigned int> &overwritten);
+
bool modInfoAboutToChange(ModInfo::Ptr info);
void modInfoChanged(ModInfo::Ptr info);
@@ -340,6 +343,10 @@ private:
std::set<unsigned int> m_Overwrite;
std::set<unsigned int> m_Overwritten;
+ std::set<unsigned int> m_ArchiveOverwrite;
+ std::set<unsigned int> m_ArchiveOverwritten;
+ std::set<unsigned int> m_ArchiveLooseOverwrite;
+ std::set<unsigned int> m_ArchiveLooseOverwritten;
TModInfoChange m_ChangeInfo;
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp
index 5afcc26a..99f0efef 100644
--- a/src/modlistsortproxy.cpp
+++ b/src/modlistsortproxy.cpp
@@ -259,9 +259,14 @@ bool ModListSortProxy::hasConflictFlag(const std::vector<ModInfo::EFlag> &flags)
{
for (ModInfo::EFlag flag : flags) {
if ((flag == ModInfo::FLAG_CONFLICT_MIXED) ||
- (flag == ModInfo::FLAG_CONFLICT_OVERWRITE) ||
- (flag == ModInfo::FLAG_CONFLICT_OVERWRITTEN) ||
- (flag == ModInfo::FLAG_CONFLICT_REDUNDANT)) {
+ (flag == ModInfo::FLAG_CONFLICT_OVERWRITE) ||
+ (flag == ModInfo::FLAG_CONFLICT_OVERWRITTEN) ||
+ (flag == ModInfo::FLAG_CONFLICT_REDUNDANT) ||
+ (flag == ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITE) ||
+ (flag == ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN) ||
+ (flag == ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED) ||
+ (flag == ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE) ||
+ (flag == ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN)) {
return true;
}
}
diff --git a/src/organizer_en.ts b/src/organizer_en.ts
index 91faa4d0..f394b189 100644
--- a/src/organizer_en.ts
+++ b/src/organizer_en.ts
@@ -304,12 +304,12 @@ p, li { white-space: pre-wrap; }
<context>
<name>DirectoryRefresher</name>
<message>
- <location filename="directoryrefresher.cpp" line="94"/>
+ <location filename="directoryrefresher.cpp" line="112"/>
<source>failed to parse bsa %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="directoryrefresher.cpp" line="160"/>
+ <location filename="directoryrefresher.cpp" line="178"/>
<source>failed to read mod (%1): %2</source>
<translation type="unfinished"></translation>
</message>
@@ -1016,7 +1016,7 @@ Right now the only case I know of where this needs to be overwritten is for the
</message>
<message>
<location filename="editexecutablesdialog.ui" line="256"/>
- <location filename="editexecutablesdialog.cpp" line="240"/>
+ <location filename="editexecutablesdialog.cpp" line="243"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
@@ -1037,54 +1037,54 @@ Right now the only case I know of where this needs to be overwritten is for the
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="169"/>
+ <location filename="editexecutablesdialog.cpp" line="170"/>
<source>Select a binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="170"/>
+ <location filename="editexecutablesdialog.cpp" line="171"/>
<source>Executable (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="195"/>
+ <location filename="editexecutablesdialog.cpp" line="196"/>
<source>Java (32-bit) required</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="196"/>
+ <location filename="editexecutablesdialog.cpp" line="197"/>
<source>MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="212"/>
+ <location filename="editexecutablesdialog.cpp" line="213"/>
<source>Select a directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="219"/>
+ <location filename="editexecutablesdialog.cpp" line="220"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="219"/>
+ <location filename="editexecutablesdialog.cpp" line="220"/>
<source>Really remove &quot;%1&quot; from executables?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="244"/>
+ <location filename="editexecutablesdialog.cpp" line="247"/>
<source>Modify</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="306"/>
- <location filename="editexecutablesdialog.cpp" line="326"/>
+ <location filename="editexecutablesdialog.cpp" line="309"/>
+ <location filename="editexecutablesdialog.cpp" line="329"/>
<source>Save Changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="307"/>
- <location filename="editexecutablesdialog.cpp" line="327"/>
+ <location filename="editexecutablesdialog.cpp" line="310"/>
+ <location filename="editexecutablesdialog.cpp" line="330"/>
<source>You made changes to the current executable, do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
@@ -1321,58 +1321,58 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="709"/>
+ <location filename="installationmanager.cpp" line="710"/>
<source>File format &quot;%1&quot; not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="871"/>
+ <location filename="installationmanager.cpp" line="872"/>
<source>None of the available installer plugins were able to handle that archive.
This is likely due to a corrupted or incompatible download or unrecognized archive format.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="882"/>
+ <location filename="installationmanager.cpp" line="883"/>
<source>no error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="885"/>
+ <location filename="installationmanager.cpp" line="886"/>
<source>7z.dll not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="888"/>
+ <location filename="installationmanager.cpp" line="889"/>
<source>7z.dll isn&apos;t valid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="891"/>
+ <location filename="installationmanager.cpp" line="892"/>
<source>archive not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="894"/>
+ <location filename="installationmanager.cpp" line="895"/>
<source>failed to open archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="897"/>
+ <location filename="installationmanager.cpp" line="898"/>
<source>unsupported archive type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="900"/>
+ <location filename="installationmanager.cpp" line="901"/>
<source>internal library error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="903"/>
+ <location filename="installationmanager.cpp" line="904"/>
<source>archive invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="907"/>
+ <location filename="installationmanager.cpp" line="908"/>
<source>unknown archive error</source>
<translation type="unfinished"></translation>
</message>
@@ -1548,20 +1548,20 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="mainwindow.ui" line="273"/>
- <location filename="mainwindow.ui" line="888"/>
+ <location filename="mainwindow.ui" line="891"/>
<source>Restore Backup...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="287"/>
- <location filename="mainwindow.ui" line="908"/>
- <location filename="mainwindow.cpp" line="4403"/>
+ <location filename="mainwindow.ui" line="911"/>
+ <location filename="mainwindow.cpp" line="4454"/>
<source>Create Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="301"/>
- <location filename="mainwindow.ui" line="922"/>
+ <location filename="mainwindow.ui" line="925"/>
<source>Active:</source>
<translation type="unfinished"></translation>
</message>
@@ -1583,8 +1583,8 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="mainwindow.ui" line="523"/>
<location filename="mainwindow.ui" line="644"/>
- <location filename="mainwindow.ui" line="1060"/>
- <location filename="mainwindow.ui" line="1375"/>
+ <location filename="mainwindow.ui" line="1063"/>
+ <location filename="mainwindow.ui" line="1404"/>
<source>Filter</source>
<translation type="unfinished"></translation>
</message>
@@ -1662,22 +1662,22 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="864"/>
+ <location filename="mainwindow.ui" line="867"/>
<source>Sort</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="935"/>
+ <location filename="mainwindow.ui" line="938"/>
<source>This provides statistics about the plugin list. The total number of active plugins is normally displayed. Other statistics may be accessed with the tooltip of this counter.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="999"/>
+ <location filename="mainwindow.ui" line="1002"/>
<source>List of available esp/esm files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1002"/>
+ <location filename="mainwindow.ui" line="1005"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -1686,27 +1686,27 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1073"/>
+ <location filename="mainwindow.ui" line="1076"/>
<source>Archives</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1093"/>
+ <location filename="mainwindow.ui" line="1096"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;BSAs / BA2s are bundles of game assets (textures, scripts, etc.). By default, the engine loads these bundles in a separate step from loose files. &lt;p&gt;Their load order is specified by the priority of the corresponding plugin (right pane, plugins tab).&lt;/p&gt;&lt;p&gt;If there is a matching plugin, the game will load them no matter what.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1096"/>
+ <location filename="mainwindow.ui" line="1099"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Currently detected archives. (&lt;a href=&quot;#&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;What is an archive?&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1111"/>
+ <location filename="mainwindow.ui" line="1114"/>
<source>List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1114"/>
+ <location filename="mainwindow.ui" line="1117"/>
<source>BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they &quot;compete&quot; with loose files in your data directory over which is loaded.
By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored!
@@ -1714,61 +1714,72 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1148"/>
+ <location filename="mainwindow.ui" line="1151"/>
<source>Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1166"/>
+ <location filename="mainwindow.ui" line="1169"/>
<source>refresh data-directory overview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1169"/>
+ <location filename="mainwindow.ui" line="1172"/>
<source>Refresh the overview. This may take a moment.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1172"/>
- <location filename="mainwindow.ui" line="1295"/>
- <location filename="mainwindow.cpp" line="4278"/>
- <location filename="mainwindow.cpp" line="5185"/>
+ <location filename="mainwindow.ui" line="1175"/>
+ <location filename="mainwindow.ui" line="1318"/>
+ <location filename="mainwindow.cpp" line="4329"/>
+ <location filename="mainwindow.cpp" line="5263"/>
<source>Refresh</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1188"/>
+ <location filename="mainwindow.ui" line="1191"/>
<source>This is an overview of your data directory as visible to the game (and tools). </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1201"/>
+ <location filename="mainwindow.ui" line="1204"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1206"/>
+ <location filename="mainwindow.ui" line="1209"/>
<source>Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1216"/>
- <location filename="mainwindow.ui" line="1219"/>
- <source>Filter the above list so that only conflicts are displayed.</source>
+ <location filename="mainwindow.ui" line="1221"/>
+ <location filename="mainwindow.ui" line="1224"/>
+ <source>Filters the above list so that only conflicts are displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1222"/>
+ <location filename="mainwindow.ui" line="1227"/>
<source>Show only conflicts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1230"/>
+ <location filename="mainwindow.ui" line="1234"/>
+ <location filename="mainwindow.ui" line="1240"/>
+ <source>Filters the above list so that files from archives are not shown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1243"/>
+ <source>Show files from Archives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1253"/>
<source>Saves</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1254"/>
+ <location filename="mainwindow.ui" line="1277"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -1779,160 +1790,160 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1274"/>
+ <location filename="mainwindow.ui" line="1297"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1292"/>
+ <location filename="mainwindow.ui" line="1315"/>
<source>Refresh downloads view</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1323"/>
+ <location filename="mainwindow.ui" line="1346"/>
<source>This is a list of mods you downloaded from Nexus. Double click one to install it. You can also drag an archive into here.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1355"/>
+ <location filename="mainwindow.ui" line="1384"/>
<source>Show Hidden</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1420"/>
+ <location filename="mainwindow.ui" line="1449"/>
<source>Tool Bar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1463"/>
+ <location filename="mainwindow.ui" line="1492"/>
<source>Install Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1466"/>
+ <location filename="mainwindow.ui" line="1495"/>
<source>Install &amp;Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1469"/>
+ <location filename="mainwindow.ui" line="1498"/>
<source>Install a new mod from an archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1472"/>
+ <location filename="mainwindow.ui" line="1501"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1481"/>
+ <location filename="mainwindow.ui" line="1510"/>
<source>Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1484"/>
+ <location filename="mainwindow.ui" line="1513"/>
<source>&amp;Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1487"/>
+ <location filename="mainwindow.ui" line="1516"/>
<source>Configure Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1490"/>
+ <location filename="mainwindow.ui" line="1519"/>
<source>Ctrl+P</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1499"/>
+ <location filename="mainwindow.ui" line="1528"/>
<source>Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1502"/>
+ <location filename="mainwindow.ui" line="1531"/>
<source>&amp;Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1505"/>
+ <location filename="mainwindow.ui" line="1534"/>
<source>Configure the executables that can be started through Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1508"/>
+ <location filename="mainwindow.ui" line="1537"/>
<source>Ctrl+E</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1517"/>
- <location filename="mainwindow.ui" line="1523"/>
+ <location filename="mainwindow.ui" line="1546"/>
+ <location filename="mainwindow.ui" line="1552"/>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1520"/>
+ <location filename="mainwindow.ui" line="1549"/>
<source>&amp;Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1526"/>
+ <location filename="mainwindow.ui" line="1555"/>
<source>Ctrl+I</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1535"/>
+ <location filename="mainwindow.ui" line="1564"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1538"/>
+ <location filename="mainwindow.ui" line="1567"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1541"/>
+ <location filename="mainwindow.ui" line="1570"/>
<source>Configure settings and workarounds</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1544"/>
+ <location filename="mainwindow.ui" line="1573"/>
<source>Ctrl+S</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1553"/>
+ <location filename="mainwindow.ui" line="1582"/>
<source>Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1556"/>
+ <location filename="mainwindow.ui" line="1585"/>
<source>Search nexus network for more mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1559"/>
+ <location filename="mainwindow.ui" line="1588"/>
<source>Ctrl+N</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1571"/>
- <location filename="mainwindow.cpp" line="5116"/>
+ <location filename="mainwindow.ui" line="1600"/>
+ <location filename="mainwindow.cpp" line="5194"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1574"/>
+ <location filename="mainwindow.ui" line="1603"/>
<source>Mod Organizer is up-to-date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1586"/>
- <location filename="mainwindow.cpp" line="661"/>
+ <location filename="mainwindow.ui" line="1615"/>
+ <location filename="mainwindow.cpp" line="674"/>
<source>No Problems</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1589"/>
+ <location filename="mainwindow.ui" line="1618"/>
<source>This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them.
!Work in progress!
@@ -1940,39 +1951,39 @@ Right now this has very limited functionality</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1601"/>
- <location filename="mainwindow.ui" line="1604"/>
+ <location filename="mainwindow.ui" line="1630"/>
+ <location filename="mainwindow.ui" line="1633"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1607"/>
+ <location filename="mainwindow.ui" line="1636"/>
<source>Ctrl+H</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1616"/>
+ <location filename="mainwindow.ui" line="1645"/>
<source>Endorse MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1619"/>
- <location filename="mainwindow.cpp" line="5208"/>
+ <location filename="mainwindow.ui" line="1648"/>
+ <location filename="mainwindow.cpp" line="5286"/>
<source>Endorse Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1624"/>
+ <location filename="mainwindow.ui" line="1653"/>
<source>Copy Log to Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1633"/>
+ <location filename="mainwindow.ui" line="1662"/>
<source>Change Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1636"/>
+ <location filename="mainwindow.ui" line="1665"/>
<source>Open the Instance selection dialog to manage a different Game</source>
<translation type="unfinished"></translation>
</message>
@@ -1997,845 +2008,850 @@ Right now this has very limited functionality</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="481"/>
+ <location filename="mainwindow.cpp" line="494"/>
<source>Crash on exit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="482"/>
+ <location filename="mainwindow.cpp" line="495"/>
<source>MO crashed while exiting. Some settings may not be saved.
Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="649"/>
+ <location filename="mainwindow.cpp" line="662"/>
<source>Problems</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="650"/>
+ <location filename="mainwindow.cpp" line="663"/>
<source>There are potential problems with your setup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="662"/>
+ <location filename="mainwindow.cpp" line="675"/>
<source>Everything seems to be in order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="724"/>
- <location filename="mainwindow.cpp" line="4413"/>
- <location filename="mainwindow.cpp" line="4417"/>
+ <location filename="mainwindow.cpp" line="737"/>
+ <location filename="mainwindow.cpp" line="4464"/>
+ <location filename="mainwindow.cpp" line="4468"/>
<source>Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="728"/>
+ <location filename="mainwindow.cpp" line="741"/>
<source>Won&apos;t Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="743"/>
+ <location filename="mainwindow.cpp" line="756"/>
<source>Help on UI</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="747"/>
- <source>Documentation Wiki</source>
+ <location filename="mainwindow.cpp" line="760"/>
+ <source>Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="751"/>
+ <location filename="mainwindow.cpp" line="764"/>
+ <source>Chat on Discord</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="768"/>
<source>Report Issue</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="755"/>
+ <location filename="mainwindow.cpp" line="772"/>
<source>Tutorials</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="794"/>
+ <location filename="mainwindow.cpp" line="811"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="795"/>
+ <location filename="mainwindow.cpp" line="812"/>
<source>About Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="854"/>
+ <location filename="mainwindow.cpp" line="871"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="855"/>
+ <location filename="mainwindow.cpp" line="872"/>
<source>Please enter a name for the new profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="863"/>
+ <location filename="mainwindow.cpp" line="880"/>
<source>failed to create profile: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="907"/>
+ <location filename="mainwindow.cpp" line="924"/>
<source>Show tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="908"/>
+ <location filename="mainwindow.cpp" line="925"/>
<source>You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the &quot;Help&quot;-menu.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="944"/>
+ <location filename="mainwindow.cpp" line="961"/>
<source>Downloads in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="945"/>
+ <location filename="mainwindow.cpp" line="962"/>
<source>There are still downloads in progress, do you really want to quit?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1062"/>
+ <location filename="mainwindow.cpp" line="1079"/>
<source>Plugin &quot;%1&quot; failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1064"/>
+ <location filename="mainwindow.cpp" line="1081"/>
<source>Plugin &quot;%1&quot; failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1142"/>
+ <location filename="mainwindow.cpp" line="1159"/>
<source>Browse Mod Page</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1345"/>
+ <location filename="mainwindow.cpp" line="1366"/>
<source>Also in: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1356"/>
+ <location filename="mainwindow.cpp" line="1377"/>
<source>No conflict</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1441"/>
+ <location filename="mainwindow.cpp" line="1462"/>
<source>&lt;Edit...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1719"/>
+ <location filename="mainwindow.cpp" line="1740"/>
<source>This bsa is enabled in the ini file so it may be required!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1781"/>
+ <location filename="mainwindow.cpp" line="1802"/>
<source>Activating Network Proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1842"/>
+ <location filename="mainwindow.cpp" line="1863"/>
<source>Notice: Your current MO version (%1) is lower than the previously used one (%2). The GUI may not downgrade gracefully, so you may experience oddities. However, there should be no serious issues.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1948"/>
+ <location filename="mainwindow.cpp" line="1969"/>
<source>Choose Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1949"/>
+ <location filename="mainwindow.cpp" line="1970"/>
<source>Mod Archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2131"/>
+ <location filename="mainwindow.cpp" line="2157"/>
<source>Start Tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2132"/>
+ <location filename="mainwindow.cpp" line="2158"/>
<source>You&apos;re about to start a tutorial. For technical reasons it&apos;s not possible to end the tutorial early. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2291"/>
+ <location filename="mainwindow.cpp" line="2331"/>
<source>failed to spawn notepad.exe: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2331"/>
+ <location filename="mainwindow.cpp" line="2371"/>
<source>failed to change origin name: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2355"/>
+ <location filename="mainwindow.cpp" line="2395"/>
<source>failed to move &quot;%1&quot; from mod &quot;%2&quot; to &quot;%3&quot;: %4</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2379"/>
+ <location filename="mainwindow.cpp" line="2419"/>
<source>&lt;Contains %1&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2414"/>
+ <location filename="mainwindow.cpp" line="2454"/>
<source>&lt;Checked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2415"/>
+ <location filename="mainwindow.cpp" line="2455"/>
<source>&lt;Unchecked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2416"/>
+ <location filename="mainwindow.cpp" line="2456"/>
<source>&lt;Update&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2417"/>
+ <location filename="mainwindow.cpp" line="2457"/>
<source>&lt;Mod Backup&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2418"/>
+ <location filename="mainwindow.cpp" line="2458"/>
<source>&lt;Managed by MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2419"/>
+ <location filename="mainwindow.cpp" line="2459"/>
<source>&lt;Managed outside MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2420"/>
+ <location filename="mainwindow.cpp" line="2460"/>
<source>&lt;No category&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2421"/>
+ <location filename="mainwindow.cpp" line="2461"/>
<source>&lt;Conflicted&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2422"/>
+ <location filename="mainwindow.cpp" line="2462"/>
<source>&lt;Not Endorsed&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2468"/>
+ <location filename="mainwindow.cpp" line="2508"/>
<source>failed to rename mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2481"/>
+ <location filename="mainwindow.cpp" line="2521"/>
<source>Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2482"/>
+ <location filename="mainwindow.cpp" line="2522"/>
<source>This will replace the existing mod &quot;%1&quot;. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2485"/>
+ <location filename="mainwindow.cpp" line="2525"/>
<source>failed to remove mod &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2489"/>
- <location filename="mainwindow.cpp" line="4948"/>
- <location filename="mainwindow.cpp" line="4972"/>
+ <location filename="mainwindow.cpp" line="2529"/>
+ <location filename="mainwindow.cpp" line="5020"/>
+ <location filename="mainwindow.cpp" line="5044"/>
<source>failed to rename &quot;%1&quot; to &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2556"/>
- <location filename="mainwindow.cpp" line="3976"/>
- <location filename="mainwindow.cpp" line="3984"/>
- <location filename="mainwindow.cpp" line="4526"/>
+ <location filename="mainwindow.cpp" line="2606"/>
+ <location filename="mainwindow.cpp" line="4027"/>
+ <location filename="mainwindow.cpp" line="4035"/>
+ <location filename="mainwindow.cpp" line="4577"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2557"/>
+ <location filename="mainwindow.cpp" line="2607"/>
<source>Remove the following mods?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2572"/>
+ <location filename="mainwindow.cpp" line="2622"/>
<source>failed to remove mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2604"/>
- <location filename="mainwindow.cpp" line="2607"/>
- <location filename="mainwindow.cpp" line="2617"/>
+ <location filename="mainwindow.cpp" line="2654"/>
+ <location filename="mainwindow.cpp" line="2657"/>
+ <location filename="mainwindow.cpp" line="2667"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2604"/>
+ <location filename="mainwindow.cpp" line="2654"/>
<source>Installation file no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2608"/>
+ <location filename="mainwindow.cpp" line="2658"/>
<source>Mods installed with old versions of MO can&apos;t be reinstalled in this way.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2618"/>
+ <location filename="mainwindow.cpp" line="2668"/>
<source>Failed to create backup.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2635"/>
+ <location filename="mainwindow.cpp" line="2685"/>
<source>You need to be logged in with Nexus to resume a download</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2651"/>
- <location filename="mainwindow.cpp" line="2677"/>
- <location filename="mainwindow.cpp" line="2711"/>
- <location filename="mainwindow.cpp" line="2737"/>
+ <location filename="mainwindow.cpp" line="2701"/>
+ <location filename="mainwindow.cpp" line="2727"/>
+ <location filename="mainwindow.cpp" line="2761"/>
+ <location filename="mainwindow.cpp" line="2787"/>
<source>You need to be logged in with Nexus to endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2662"/>
- <location filename="mainwindow.cpp" line="2670"/>
+ <location filename="mainwindow.cpp" line="2712"/>
+ <location filename="mainwindow.cpp" line="2720"/>
<source>Endorsing multiple mods will take a while. Please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2722"/>
- <location filename="mainwindow.cpp" line="2730"/>
+ <location filename="mainwindow.cpp" line="2772"/>
+ <location filename="mainwindow.cpp" line="2780"/>
<source>Unendorsing multiple mods will take a while. Please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2798"/>
+ <location filename="mainwindow.cpp" line="2848"/>
<source>Failed to display overwrite dialog: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2985"/>
+ <location filename="mainwindow.cpp" line="3035"/>
<source>Opening Nexus Links</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2986"/>
+ <location filename="mainwindow.cpp" line="3036"/>
<source>You are trying to open %1 links to Nexus Mods. Are you sure you want to do this?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3015"/>
+ <location filename="mainwindow.cpp" line="3065"/>
<source>Nexus ID for this Mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3027"/>
+ <location filename="mainwindow.cpp" line="3077"/>
<source>Opening Web Pages</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3028"/>
+ <location filename="mainwindow.cpp" line="3078"/>
<source>You are trying to open %1 Web Pages. Are you sure you want to do this?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3057"/>
+ <location filename="mainwindow.cpp" line="3107"/>
<source>Web page for this mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3240"/>
+ <location filename="mainwindow.cpp" line="3290"/>
<source>&lt;table cellspacing=&quot;5&quot;&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;All&lt;/th&gt;&lt;th&gt;Visible&lt;/th&gt;&lt;tr&gt;&lt;td&gt;Enabled mods:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%1 / %2&lt;/td&gt;&lt;td align=right&gt;%3 / %4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unmanaged/DLCs:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%5&lt;/td&gt;&lt;td align=right&gt;%6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mod backups:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%7&lt;/td&gt;&lt;td align=right&gt;%8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Separators:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%9&lt;/td&gt;&lt;td align=right&gt;%10&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3295"/>
+ <location filename="mainwindow.cpp" line="3345"/>
<source>&lt;table cellspacing=&quot;6&quot;&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Active &lt;/th&gt;&lt;th&gt;Total&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;All plugins:&lt;/td&gt;&lt;td align=right&gt;%1 &lt;/td&gt;&lt;td align=right&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESMs:&lt;/td&gt;&lt;td align=right&gt;%3 &lt;/td&gt;&lt;td align=right&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESPs:&lt;/td&gt;&lt;td align=right&gt;%7 &lt;/td&gt;&lt;td align=right&gt;%8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESMs+ESPs:&lt;/td&gt;&lt;td align=right&gt;%9 &lt;/td&gt;&lt;td align=right&gt;%10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESLs:&lt;/td&gt;&lt;td align=right&gt;%5 &lt;/td&gt;&lt;td align=right&gt;%6&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3327"/>
- <location filename="mainwindow.cpp" line="3465"/>
- <location filename="mainwindow.cpp" line="4340"/>
+ <location filename="mainwindow.cpp" line="3377"/>
+ <location filename="mainwindow.cpp" line="3515"/>
+ <location filename="mainwindow.cpp" line="4391"/>
<source>Create Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3328"/>
+ <location filename="mainwindow.cpp" line="3378"/>
<source>This will create an empty mod.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3337"/>
- <location filename="mainwindow.cpp" line="3475"/>
+ <location filename="mainwindow.cpp" line="3387"/>
+ <location filename="mainwindow.cpp" line="3525"/>
<source>A mod with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3365"/>
+ <location filename="mainwindow.cpp" line="3415"/>
<source>Create Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3366"/>
+ <location filename="mainwindow.cpp" line="3416"/>
<source>This will create a new separator.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3373"/>
+ <location filename="mainwindow.cpp" line="3423"/>
<source>A separator with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3466"/>
+ <location filename="mainwindow.cpp" line="3516"/>
<source>This will move all files from overwrite into a new, regular mod.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3507"/>
- <location filename="mainwindow.cpp" line="5539"/>
+ <location filename="mainwindow.cpp" line="3557"/>
+ <location filename="mainwindow.cpp" line="5617"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3508"/>
+ <location filename="mainwindow.cpp" line="3558"/>
<source>About to recursively delete:
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3870"/>
+ <location filename="mainwindow.cpp" line="3921"/>
<source>Not logged in, endorsement information will be wrong</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3878"/>
+ <location filename="mainwindow.cpp" line="3929"/>
<source>Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3879"/>
+ <location filename="mainwindow.cpp" line="3930"/>
<source>The versioning scheme decides which version is considered newer than another.
This function will guess the versioning scheme under the assumption that the installed version is outdated.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3899"/>
- <location filename="mainwindow.cpp" line="5084"/>
+ <location filename="mainwindow.cpp" line="3950"/>
+ <location filename="mainwindow.cpp" line="5162"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3900"/>
+ <location filename="mainwindow.cpp" line="3951"/>
<source>I don&apos;t know a versioning scheme where %1 is newer than %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3976"/>
+ <location filename="mainwindow.cpp" line="4027"/>
<source>Really enable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3984"/>
+ <location filename="mainwindow.cpp" line="4035"/>
<source>Really disable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4064"/>
+ <location filename="mainwindow.cpp" line="4115"/>
<source>Export to csv</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4067"/>
+ <location filename="mainwindow.cpp" line="4118"/>
<source>CSV (Comma Separated Values) is a format that can be imported in programs like Excel to create a spreadsheet.
You can also use online editors and converters instead.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4070"/>
+ <location filename="mainwindow.cpp" line="4121"/>
<source>Select what mods you want export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4071"/>
+ <location filename="mainwindow.cpp" line="4122"/>
<source>All installed mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4072"/>
+ <location filename="mainwindow.cpp" line="4123"/>
<source>Only active (checked) mods from your current profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4073"/>
+ <location filename="mainwindow.cpp" line="4124"/>
<source>All currently visible mods in the mod list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4094"/>
+ <location filename="mainwindow.cpp" line="4145"/>
<source>Choose what Columns to export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4097"/>
+ <location filename="mainwindow.cpp" line="4148"/>
<source>Mod_Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4099"/>
+ <location filename="mainwindow.cpp" line="4150"/>
<source>Mod_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4101"/>
+ <location filename="mainwindow.cpp" line="4152"/>
<source>Notes_column</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4102"/>
+ <location filename="mainwindow.cpp" line="4153"/>
<source>Mod_Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4103"/>
+ <location filename="mainwindow.cpp" line="4154"/>
<source>Primary_Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4104"/>
+ <location filename="mainwindow.cpp" line="4155"/>
<source>Nexus_ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4105"/>
+ <location filename="mainwindow.cpp" line="4156"/>
<source>Mod_Nexus_URL</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4106"/>
+ <location filename="mainwindow.cpp" line="4157"/>
<source>Mod_Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4107"/>
+ <location filename="mainwindow.cpp" line="4158"/>
<source>Install_Date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4108"/>
+ <location filename="mainwindow.cpp" line="4159"/>
<source>Download_File_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4215"/>
+ <location filename="mainwindow.cpp" line="4266"/>
<source>export failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4234"/>
+ <location filename="mainwindow.cpp" line="4285"/>
<source>Open Game folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4236"/>
+ <location filename="mainwindow.cpp" line="4287"/>
<source>Open MyGames folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4238"/>
+ <location filename="mainwindow.cpp" line="4289"/>
<source>Open INIs folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4242"/>
+ <location filename="mainwindow.cpp" line="4293"/>
<source>Open Instance folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4244"/>
+ <location filename="mainwindow.cpp" line="4295"/>
<source>Open Mods folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4246"/>
+ <location filename="mainwindow.cpp" line="4297"/>
<source>Open Profile folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4248"/>
+ <location filename="mainwindow.cpp" line="4299"/>
<source>Open Downloads folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4252"/>
+ <location filename="mainwindow.cpp" line="4303"/>
<source>Open MO2 Install folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4254"/>
+ <location filename="mainwindow.cpp" line="4305"/>
<source>Open MO2 Plugins folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4256"/>
+ <location filename="mainwindow.cpp" line="4307"/>
<source>Open MO2 Logs folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4265"/>
+ <location filename="mainwindow.cpp" line="4316"/>
<source>Install Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4267"/>
+ <location filename="mainwindow.cpp" line="4318"/>
<source>Create empty mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4269"/>
+ <location filename="mainwindow.cpp" line="4320"/>
<source>Create Separator</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4273"/>
+ <location filename="mainwindow.cpp" line="4324"/>
<source>Enable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4274"/>
+ <location filename="mainwindow.cpp" line="4325"/>
<source>Disable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4276"/>
+ <location filename="mainwindow.cpp" line="4327"/>
<source>Check all for update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4280"/>
+ <location filename="mainwindow.cpp" line="4331"/>
<source>Export to csv...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4292"/>
- <location filename="mainwindow.cpp" line="4308"/>
+ <location filename="mainwindow.cpp" line="4343"/>
+ <location filename="mainwindow.cpp" line="4359"/>
<source>Send to</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4293"/>
- <location filename="mainwindow.cpp" line="4309"/>
+ <location filename="mainwindow.cpp" line="4344"/>
+ <location filename="mainwindow.cpp" line="4360"/>
<source>Top</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4294"/>
- <location filename="mainwindow.cpp" line="4310"/>
+ <location filename="mainwindow.cpp" line="4345"/>
+ <location filename="mainwindow.cpp" line="4361"/>
<source>Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4295"/>
- <location filename="mainwindow.cpp" line="4311"/>
+ <location filename="mainwindow.cpp" line="4346"/>
+ <location filename="mainwindow.cpp" line="4362"/>
<source>Priority...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4296"/>
+ <location filename="mainwindow.cpp" line="4347"/>
<source>Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4332"/>
+ <location filename="mainwindow.cpp" line="4383"/>
<source>All Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4339"/>
+ <location filename="mainwindow.cpp" line="4390"/>
<source>Sync to Mods...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4341"/>
+ <location filename="mainwindow.cpp" line="4392"/>
<source>Clear Overwrite...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4343"/>
- <location filename="mainwindow.cpp" line="4444"/>
+ <location filename="mainwindow.cpp" line="4394"/>
+ <location filename="mainwindow.cpp" line="4495"/>
<source>Open in Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4345"/>
+ <location filename="mainwindow.cpp" line="4396"/>
<source>Restore Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4346"/>
+ <location filename="mainwindow.cpp" line="4397"/>
<source>Remove Backup...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4349"/>
- <location filename="mainwindow.cpp" line="4368"/>
+ <location filename="mainwindow.cpp" line="4400"/>
+ <location filename="mainwindow.cpp" line="4419"/>
<source>Change Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4353"/>
- <location filename="mainwindow.cpp" line="4373"/>
+ <location filename="mainwindow.cpp" line="4404"/>
+ <location filename="mainwindow.cpp" line="4424"/>
<source>Primary Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4357"/>
+ <location filename="mainwindow.cpp" line="4408"/>
<source>Rename Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4358"/>
+ <location filename="mainwindow.cpp" line="4409"/>
<source>Remove Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4361"/>
+ <location filename="mainwindow.cpp" line="4412"/>
<source>Select Color...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4363"/>
+ <location filename="mainwindow.cpp" line="4414"/>
<source>Reset Color</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4380"/>
+ <location filename="mainwindow.cpp" line="4431"/>
<source>Change versioning scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4384"/>
+ <location filename="mainwindow.cpp" line="4435"/>
<source>Un-ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4388"/>
+ <location filename="mainwindow.cpp" line="4439"/>
<source>Ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4393"/>
- <location filename="mainwindow.cpp" line="5650"/>
+ <location filename="mainwindow.cpp" line="4444"/>
+ <location filename="mainwindow.cpp" line="5728"/>
<source>Enable selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4394"/>
- <location filename="mainwindow.cpp" line="5651"/>
+ <location filename="mainwindow.cpp" line="4445"/>
+ <location filename="mainwindow.cpp" line="5729"/>
<source>Disable selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4400"/>
+ <location filename="mainwindow.cpp" line="4451"/>
<source>Rename Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4401"/>
+ <location filename="mainwindow.cpp" line="4452"/>
<source>Reinstall Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4402"/>
+ <location filename="mainwindow.cpp" line="4453"/>
<source>Remove Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4410"/>
+ <location filename="mainwindow.cpp" line="4461"/>
<source>Un-Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4414"/>
+ <location filename="mainwindow.cpp" line="4465"/>
<source>Won&apos;t endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4420"/>
+ <location filename="mainwindow.cpp" line="4471"/>
<source>Endorsement state unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4431"/>
+ <location filename="mainwindow.cpp" line="4482"/>
<source>Ignore missing data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4435"/>
+ <location filename="mainwindow.cpp" line="4486"/>
<source>Mark as converted/working</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4439"/>
+ <location filename="mainwindow.cpp" line="4490"/>
<source>Visit on Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4441"/>
+ <location filename="mainwindow.cpp" line="4492"/>
<source>Visit web page</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4448"/>
+ <location filename="mainwindow.cpp" line="4499"/>
<source>Information...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4455"/>
- <location filename="mainwindow.cpp" line="5698"/>
+ <location filename="mainwindow.cpp" line="4506"/>
+ <location filename="mainwindow.cpp" line="5776"/>
<source>Exception: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4457"/>
- <location filename="mainwindow.cpp" line="5700"/>
+ <location filename="mainwindow.cpp" line="4508"/>
+ <location filename="mainwindow.cpp" line="5778"/>
<source>Unknown exception</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4486"/>
+ <location filename="mainwindow.cpp" line="4537"/>
<source>&lt;All&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4488"/>
+ <location filename="mainwindow.cpp" line="4539"/>
<source>&lt;Multiple&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4523"/>
+ <location filename="mainwindow.cpp" line="4574"/>
<source>%1 more</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="4527"/>
+ <location filename="mainwindow.cpp" line="4578"/>
<source>Are you sure you want to remove the following %n save(s)?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;&lt;br&gt;Removed saves will be sent to the Recycle Bin.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2843,12 +2859,12 @@ You can also use online editors and converters instead.</source>
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4572"/>
+ <location filename="mainwindow.cpp" line="4623"/>
<source>Enable Mods...</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="4587"/>
+ <location filename="mainwindow.cpp" line="4638"/>
<source>Delete %n save(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2856,22 +2872,22 @@ You can also use online editors and converters instead.</source>
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4629"/>
+ <location filename="mainwindow.cpp" line="4680"/>
<source>failed to remove %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4651"/>
+ <location filename="mainwindow.cpp" line="4702"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4681"/>
+ <location filename="mainwindow.cpp" line="4732"/>
<source>Restarting MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4682"/>
+ <location filename="mainwindow.cpp" line="4733"/>
<source>Changing the managed game directory requires restarting MO.
Any pending downloads will be paused.
@@ -2879,335 +2895,335 @@ Click OK to restart MO now.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4702"/>
+ <location filename="mainwindow.cpp" line="4753"/>
<source>Can&apos;t change download directory while downloads are in progress!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4820"/>
+ <location filename="mainwindow.cpp" line="4892"/>
<source>failed to write to file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4826"/>
+ <location filename="mainwindow.cpp" line="4898"/>
<source>%1 written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4867"/>
+ <location filename="mainwindow.cpp" line="4939"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4867"/>
+ <location filename="mainwindow.cpp" line="4939"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4893"/>
+ <location filename="mainwindow.cpp" line="4965"/>
<source>Enter Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4894"/>
+ <location filename="mainwindow.cpp" line="4966"/>
<source>Please enter a name for the executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4908"/>
+ <location filename="mainwindow.cpp" line="4980"/>
<source>Not an executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4908"/>
+ <location filename="mainwindow.cpp" line="4980"/>
<source>This is not a recognized executable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4933"/>
- <location filename="mainwindow.cpp" line="4958"/>
+ <location filename="mainwindow.cpp" line="5005"/>
+ <location filename="mainwindow.cpp" line="5030"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4933"/>
+ <location filename="mainwindow.cpp" line="5005"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4936"/>
- <location filename="mainwindow.cpp" line="4961"/>
+ <location filename="mainwindow.cpp" line="5008"/>
+ <location filename="mainwindow.cpp" line="5033"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4936"/>
- <location filename="mainwindow.cpp" line="4961"/>
+ <location filename="mainwindow.cpp" line="5008"/>
+ <location filename="mainwindow.cpp" line="5033"/>
<source>Failed to remove &quot;%1&quot;. Maybe you lack the required file permissions?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4958"/>
+ <location filename="mainwindow.cpp" line="5030"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5002"/>
- <location filename="mainwindow.cpp" line="6312"/>
+ <location filename="mainwindow.cpp" line="5074"/>
+ <location filename="mainwindow.cpp" line="6390"/>
<source>Set Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5002"/>
+ <location filename="mainwindow.cpp" line="5074"/>
<source>Set the priority of the selected plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5051"/>
+ <location filename="mainwindow.cpp" line="5129"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5064"/>
+ <location filename="mainwindow.cpp" line="5142"/>
<source>failed to generate preview for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5084"/>
+ <location filename="mainwindow.cpp" line="5162"/>
<source>Sorry, can&apos;t preview anything. This function currently does not support extracting from bsas.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5118"/>
+ <location filename="mainwindow.cpp" line="5196"/>
<source>Update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5165"/>
+ <location filename="mainwindow.cpp" line="5243"/>
<source>Open/Execute</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5166"/>
+ <location filename="mainwindow.cpp" line="5244"/>
<source>Add as Executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5170"/>
+ <location filename="mainwindow.cpp" line="5248"/>
<source>Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5176"/>
+ <location filename="mainwindow.cpp" line="5254"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5178"/>
+ <location filename="mainwindow.cpp" line="5256"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5184"/>
+ <location filename="mainwindow.cpp" line="5262"/>
<source>Write To File...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5209"/>
+ <location filename="mainwindow.cpp" line="5287"/>
<source>Do you want to endorse Mod Organizer on %1 now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5348"/>
+ <location filename="mainwindow.cpp" line="5426"/>
<source>Thank you!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5348"/>
+ <location filename="mainwindow.cpp" line="5426"/>
<source>Thank you for your endorsement!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5383"/>
+ <location filename="mainwindow.cpp" line="5461"/>
<source>Request to Nexus failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5398"/>
- <location filename="mainwindow.cpp" line="5460"/>
+ <location filename="mainwindow.cpp" line="5476"/>
+ <location filename="mainwindow.cpp" line="5538"/>
<source>failed to read %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5410"/>
- <location filename="mainwindow.cpp" line="5888"/>
+ <location filename="mainwindow.cpp" line="5488"/>
+ <location filename="mainwindow.cpp" line="5966"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5410"/>
+ <location filename="mainwindow.cpp" line="5488"/>
<source>failed to extract %1 (errorcode %2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5442"/>
+ <location filename="mainwindow.cpp" line="5520"/>
<source>Extract BSA</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5471"/>
+ <location filename="mainwindow.cpp" line="5549"/>
<source>This archive contains invalid hashes. Some files may be broken.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5517"/>
+ <location filename="mainwindow.cpp" line="5595"/>
<source>Extract...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5540"/>
+ <location filename="mainwindow.cpp" line="5618"/>
<source>This will restart MO, continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5587"/>
+ <location filename="mainwindow.cpp" line="5665"/>
<source>Edit Categories...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5588"/>
+ <location filename="mainwindow.cpp" line="5666"/>
<source>Deselect filter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5639"/>
+ <location filename="mainwindow.cpp" line="5717"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5655"/>
+ <location filename="mainwindow.cpp" line="5733"/>
<source>Enable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5656"/>
+ <location filename="mainwindow.cpp" line="5734"/>
<source>Disable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5677"/>
+ <location filename="mainwindow.cpp" line="5755"/>
<source>Unlock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5680"/>
+ <location filename="mainwindow.cpp" line="5758"/>
<source>Lock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5684"/>
+ <location filename="mainwindow.cpp" line="5762"/>
<source>Open Origin in Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5691"/>
+ <location filename="mainwindow.cpp" line="5769"/>
<source>Open Origin Info...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5834"/>
+ <location filename="mainwindow.cpp" line="5912"/>
<source>depends on missing &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5838"/>
+ <location filename="mainwindow.cpp" line="5916"/>
<source>incompatible with &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5864"/>
+ <location filename="mainwindow.cpp" line="5942"/>
<source>Please wait while LOOT is running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5961"/>
+ <location filename="mainwindow.cpp" line="6039"/>
<source>loot failed. Exit code was: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5983"/>
+ <location filename="mainwindow.cpp" line="6061"/>
<source>failed to start loot</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5986"/>
+ <location filename="mainwindow.cpp" line="6064"/>
<source>failed to run loot: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5990"/>
+ <location filename="mainwindow.cpp" line="6068"/>
<source>Errors occured</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6037"/>
+ <location filename="mainwindow.cpp" line="6115"/>
<source>Backup of load order created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6047"/>
+ <location filename="mainwindow.cpp" line="6125"/>
<source>Choose backup to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6060"/>
+ <location filename="mainwindow.cpp" line="6138"/>
<source>No Backups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6060"/>
+ <location filename="mainwindow.cpp" line="6138"/>
<source>There are no backups to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6081"/>
- <location filename="mainwindow.cpp" line="6103"/>
+ <location filename="mainwindow.cpp" line="6159"/>
+ <location filename="mainwindow.cpp" line="6181"/>
<source>Restore failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6082"/>
- <location filename="mainwindow.cpp" line="6104"/>
+ <location filename="mainwindow.cpp" line="6160"/>
+ <location filename="mainwindow.cpp" line="6182"/>
<source>Failed to restore the backup. Errorcode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6093"/>
+ <location filename="mainwindow.cpp" line="6171"/>
<source>Backup of modlist created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6199"/>
+ <location filename="mainwindow.cpp" line="6277"/>
<source>A file with the same name has already been downloaded. What would you like to do?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6201"/>
+ <location filename="mainwindow.cpp" line="6279"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6202"/>
+ <location filename="mainwindow.cpp" line="6280"/>
<source>Rename new file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6203"/>
+ <location filename="mainwindow.cpp" line="6281"/>
<source>Ignore file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6312"/>
+ <location filename="mainwindow.cpp" line="6390"/>
<source>Set the priority of the selected mods</source>
<translation type="unfinished"></translation>
</message>
@@ -3673,243 +3689,243 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="491"/>
- <location filename="modinfodialog.cpp" line="506"/>
+ <location filename="modinfodialog.cpp" line="504"/>
+ <location filename="modinfodialog.cpp" line="519"/>
<source>Save changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="491"/>
- <location filename="modinfodialog.cpp" line="506"/>
+ <location filename="modinfodialog.cpp" line="504"/>
+ <location filename="modinfodialog.cpp" line="519"/>
<source>Save changes to &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="696"/>
+ <location filename="modinfodialog.cpp" line="710"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="696"/>
+ <location filename="modinfodialog.cpp" line="710"/>
<source>A file with that name exists, please enter a new one</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="713"/>
+ <location filename="modinfodialog.cpp" line="727"/>
<source>failed to move file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="738"/>
+ <location filename="modinfodialog.cpp" line="752"/>
<source>failed to create directory &quot;optional&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="782"/>
- <location filename="modinfodialog.cpp" line="1511"/>
+ <location filename="modinfodialog.cpp" line="796"/>
+ <location filename="modinfodialog.cpp" line="1525"/>
<source>Info requested, please wait</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="836"/>
+ <location filename="modinfodialog.cpp" line="850"/>
<source>Main</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="837"/>
+ <location filename="modinfodialog.cpp" line="851"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="838"/>
+ <location filename="modinfodialog.cpp" line="852"/>
<source>Optional</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="839"/>
+ <location filename="modinfodialog.cpp" line="853"/>
<source>Old</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="840"/>
+ <location filename="modinfodialog.cpp" line="854"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="841"/>
+ <location filename="modinfodialog.cpp" line="855"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="852"/>
+ <location filename="modinfodialog.cpp" line="866"/>
<source>Current Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="856"/>
+ <location filename="modinfodialog.cpp" line="870"/>
<source>No update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="899"/>
+ <location filename="modinfodialog.cpp" line="913"/>
<source>(description incomplete, please visit nexus)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="914"/>
+ <location filename="modinfodialog.cpp" line="928"/>
<source>&lt;a href=&quot;%1&quot;&gt;Visit on Nexus&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1012"/>
+ <location filename="modinfodialog.cpp" line="1026"/>
<source>Failed to delete %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1028"/>
- <location filename="modinfodialog.cpp" line="1034"/>
- <location filename="modinfodialog.cpp" line="1053"/>
- <location filename="modinfodialog.cpp" line="1058"/>
+ <location filename="modinfodialog.cpp" line="1042"/>
+ <location filename="modinfodialog.cpp" line="1048"/>
+ <location filename="modinfodialog.cpp" line="1067"/>
+ <location filename="modinfodialog.cpp" line="1072"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1028"/>
- <location filename="modinfodialog.cpp" line="1053"/>
+ <location filename="modinfodialog.cpp" line="1042"/>
+ <location filename="modinfodialog.cpp" line="1067"/>
<source>Are sure you want to delete &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1034"/>
- <location filename="modinfodialog.cpp" line="1058"/>
+ <location filename="modinfodialog.cpp" line="1048"/>
+ <location filename="modinfodialog.cpp" line="1072"/>
<source>Are sure you want to delete the selected files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1132"/>
- <location filename="modinfodialog.cpp" line="1138"/>
+ <location filename="modinfodialog.cpp" line="1146"/>
+ <location filename="modinfodialog.cpp" line="1152"/>
<source>New Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1144"/>
+ <location filename="modinfodialog.cpp" line="1158"/>
<source>Failed to create &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1248"/>
- <location filename="modinfodialog.cpp" line="1272"/>
+ <location filename="modinfodialog.cpp" line="1262"/>
+ <location filename="modinfodialog.cpp" line="1286"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1248"/>
+ <location filename="modinfodialog.cpp" line="1262"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1251"/>
- <location filename="modinfodialog.cpp" line="1275"/>
+ <location filename="modinfodialog.cpp" line="1265"/>
+ <location filename="modinfodialog.cpp" line="1289"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1251"/>
- <location filename="modinfodialog.cpp" line="1275"/>
+ <location filename="modinfodialog.cpp" line="1265"/>
+ <location filename="modinfodialog.cpp" line="1289"/>
<source>Failed to remove &quot;%1&quot;. Maybe you lack the required file permissions?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1262"/>
- <location filename="modinfodialog.cpp" line="1285"/>
+ <location filename="modinfodialog.cpp" line="1276"/>
+ <location filename="modinfodialog.cpp" line="1299"/>
<source>failed to rename %1 to %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1272"/>
+ <location filename="modinfodialog.cpp" line="1286"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1348"/>
+ <location filename="modinfodialog.cpp" line="1362"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1348"/>
+ <location filename="modinfodialog.cpp" line="1362"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1420"/>
+ <location filename="modinfodialog.cpp" line="1434"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1433"/>
+ <location filename="modinfodialog.cpp" line="1447"/>
<source>failed to generate preview for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1449"/>
+ <location filename="modinfodialog.cpp" line="1463"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1449"/>
+ <location filename="modinfodialog.cpp" line="1463"/>
<source>Sorry, can&apos;t preview anything. This function currently does not support extracting from bsas.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1463"/>
+ <location filename="modinfodialog.cpp" line="1477"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1465"/>
+ <location filename="modinfodialog.cpp" line="1479"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1468"/>
- <location filename="modinfodialog.cpp" line="1488"/>
+ <location filename="modinfodialog.cpp" line="1482"/>
+ <location filename="modinfodialog.cpp" line="1502"/>
<source>Open/Execute</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1472"/>
- <location filename="modinfodialog.cpp" line="1492"/>
+ <location filename="modinfodialog.cpp" line="1486"/>
+ <location filename="modinfodialog.cpp" line="1506"/>
<source>Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1540"/>
+ <location filename="modinfodialog.cpp" line="1554"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1540"/>
+ <location filename="modinfodialog.cpp" line="1554"/>
<source>Please enter a name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1544"/>
- <location filename="modinfodialog.cpp" line="1547"/>
+ <location filename="modinfodialog.cpp" line="1558"/>
+ <location filename="modinfodialog.cpp" line="1561"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1544"/>
+ <location filename="modinfodialog.cpp" line="1558"/>
<source>Invalid name. Must be a valid file name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1547"/>
+ <location filename="modinfodialog.cpp" line="1561"/>
<source>A tweak by that name exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1561"/>
+ <location filename="modinfodialog.cpp" line="1575"/>
<source>Create Tweak</source>
<translation type="unfinished"></translation>
</message>
@@ -3948,18 +3964,18 @@ p, li { white-space: pre-wrap; }
<context>
<name>ModInfoRegular</name>
<message>
- <location filename="modinforegular.cpp" line="179"/>
- <location filename="modinforegular.cpp" line="182"/>
+ <location filename="modinforegular.cpp" line="184"/>
+ <location filename="modinforegular.cpp" line="187"/>
<source>failed to write %1/meta.ini: error %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinforegular.cpp" line="563"/>
+ <location filename="modinforegular.cpp" line="568"/>
<source>%1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinforegular.cpp" line="567"/>
+ <location filename="modinforegular.cpp" line="572"/>
<source>Categories: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -4061,17 +4077,20 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="modlist.cpp" line="161"/>
- <source>Overwrites files</source>
+ <source>Overwrites loose files</source>
+ <oldsource>Overwrites files</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="modlist.cpp" line="162"/>
- <source>Overwritten files</source>
+ <source>Overwritten loose files</source>
+ <oldsource>Overwritten files</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="modlist.cpp" line="163"/>
- <source>Overwrites &amp; Overwritten</source>
+ <source>Loose files Overwrites &amp; Overwritten</source>
+ <oldsource>Overwrites &amp; Overwritten</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -4081,162 +4100,187 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="modlist.cpp" line="165"/>
+ <source>Overwrites an archive with loose files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="166"/>
+ <source>Archive is overwritten by loose files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="167"/>
+ <source>Overwrites another archive file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="168"/>
+ <source>Overwritten by another archive file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="169"/>
+ <source>Archive files overwrites &amp; overwritten</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="170"/>
<source>This mod targets a different game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="257"/>
+ <location filename="modlist.cpp" line="262"/>
<source>Non-MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="289"/>
+ <location filename="modlist.cpp" line="294"/>
<source>invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="437"/>
+ <location filename="modlist.cpp" line="451"/>
<source>installed version: &quot;%1&quot;, newest version: &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="439"/>
+ <location filename="modlist.cpp" line="453"/>
<source>The newest version on Nexus seems to be older than the one you have installed. This could either mean the version you have has been withdrawn (i.e. due to a bug) or the author uses a non-standard versioning scheme and that newest version is actually newer. Either way you may want to &quot;upgrade&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="447"/>
+ <location filename="modlist.cpp" line="461"/>
<source>Categories: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="478"/>
+ <location filename="modlist.cpp" line="492"/>
<source>Invalid name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="483"/>
+ <location filename="modlist.cpp" line="497"/>
<source>Name is already in use by another mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1030"/>
+ <location filename="modlist.cpp" line="1057"/>
<source>drag&amp;drop failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1109"/>
+ <location filename="modlist.cpp" line="1136"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1110"/>
+ <location filename="modlist.cpp" line="1137"/>
<source>Are you sure you want to remove &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1173"/>
+ <location filename="modlist.cpp" line="1204"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1174"/>
+ <location filename="modlist.cpp" line="1205"/>
<source>Content</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1175"/>
+ <location filename="modlist.cpp" line="1206"/>
<source>Mod Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1176"/>
+ <location filename="modlist.cpp" line="1207"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1177"/>
+ <location filename="modlist.cpp" line="1208"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1178"/>
+ <location filename="modlist.cpp" line="1209"/>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1179"/>
+ <location filename="modlist.cpp" line="1210"/>
<source>Source Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1180"/>
+ <location filename="modlist.cpp" line="1211"/>
<source>Nexus ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1181"/>
+ <location filename="modlist.cpp" line="1212"/>
<source>Installation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1182"/>
+ <location filename="modlist.cpp" line="1213"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1183"/>
- <location filename="modlist.cpp" line="1219"/>
+ <location filename="modlist.cpp" line="1214"/>
+ <location filename="modlist.cpp" line="1250"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1191"/>
+ <location filename="modlist.cpp" line="1222"/>
<source>Name of your mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1192"/>
+ <location filename="modlist.cpp" line="1223"/>
<source>Version of the mod (if available)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1193"/>
+ <location filename="modlist.cpp" line="1224"/>
<source>Installation priority of your mod. The higher, the more &quot;important&quot; it is and thus overwrites files from mods with lower priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1195"/>
+ <location filename="modlist.cpp" line="1226"/>
<source>Category of the mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1196"/>
+ <location filename="modlist.cpp" line="1227"/>
<source>The source game which was the origin of this mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1197"/>
+ <location filename="modlist.cpp" line="1228"/>
<source>Id of the mod as used on Nexus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1198"/>
+ <location filename="modlist.cpp" line="1229"/>
<source>Emblemes to highlight things that might require attention.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1199"/>
+ <location filename="modlist.cpp" line="1230"/>
<source>Depicts the content of the mod:&lt;br&gt;&lt;table cellspacing=7&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/plugin&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Game plugins (esp/esm/esl)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/interface&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Interface&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/mesh&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Meshes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/bsa&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;BSA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/texture&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Textures&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/sound&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Sounds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/music&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Music&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/string&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/script&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Scripts (Papyrus)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skse&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Script Extender plugins&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skyproc&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;SkyProc Patcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/menu&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Mod Configuration Menu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/inifile&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;INI files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/modgroup&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;ModGroup files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1217"/>
+ <location filename="modlist.cpp" line="1248"/>
<source>Time this mod was installed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1218"/>
+ <location filename="modlist.cpp" line="1249"/>
<source>User notes about the mod</source>
<translation type="unfinished"></translation>
</message>
@@ -4244,7 +4288,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>ModListSortProxy</name>
<message>
- <location filename="modlistsortproxy.cpp" line="465"/>
+ <location filename="modlistsortproxy.cpp" line="506"/>
<source>Drag&amp;Drop is only supported when sorting by priority</source>
<translation type="unfinished"></translation>
</message>
@@ -4363,182 +4407,183 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="699"/>
- <location filename="organizercore.cpp" line="710"/>
+ <location filename="organizercore.cpp" line="701"/>
+ <location filename="organizercore.cpp" line="712"/>
<source>Download started</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="713"/>
+ <location filename="organizercore.cpp" line="715"/>
<source>Download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="979"/>
- <location filename="organizercore.cpp" line="1037"/>
+ <location filename="organizercore.cpp" line="992"/>
+ <location filename="organizercore.cpp" line="1050"/>
<source>Installation successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="987"/>
- <location filename="organizercore.cpp" line="1047"/>
+ <location filename="organizercore.cpp" line="1000"/>
+ <location filename="organizercore.cpp" line="1060"/>
<source>Configure Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="988"/>
- <location filename="organizercore.cpp" line="1048"/>
+ <location filename="organizercore.cpp" line="1001"/>
+ <location filename="organizercore.cpp" line="1061"/>
<source>This mod contains ini tweaks. Do you want to configure them now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1000"/>
- <location filename="organizercore.cpp" line="1058"/>
+ <location filename="organizercore.cpp" line="1013"/>
+ <location filename="organizercore.cpp" line="1071"/>
<source>mod &quot;%1&quot; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1003"/>
- <location filename="organizercore.cpp" line="1065"/>
+ <location filename="organizercore.cpp" line="1016"/>
+ <location filename="organizercore.cpp" line="1078"/>
<source>Installation cancelled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1004"/>
- <location filename="organizercore.cpp" line="1066"/>
+ <location filename="organizercore.cpp" line="1017"/>
+ <location filename="organizercore.cpp" line="1079"/>
<source>The mod was not installed completely.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1280"/>
+ <location filename="organizercore.cpp" line="1293"/>
<source>Executable &quot;%1&quot; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1308"/>
+ <location filename="organizercore.cpp" line="1321"/>
<source>Start Steam?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1309"/>
+ <location filename="organizercore.cpp" line="1322"/>
<source>Steam is required to be running already to correctly start the game. Should MO try to start steam now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1340"/>
+ <location filename="organizercore.cpp" line="1353"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1348"/>
+ <location filename="organizercore.cpp" line="1361"/>
<source>Windows Event Log Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1349"/>
+ <location filename="organizercore.cpp" line="1362"/>
<source>The Windows Event Log service is disabled and/or not running. This prevents USVFS from running properly. Your mods may not be working in the executable that you are launching. Note that you may have to restart MO and/or your PC after the service is fixed.
Continue launching %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1361"/>
+ <location filename="organizercore.cpp" line="1374"/>
<source>Blacklisted Executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1362"/>
+ <location filename="organizercore.cpp" line="1375"/>
<source>The executable you are attempted to launch is blacklisted in the virtual file system. This will likely prevent the executable, and any executables that are launched by this one, from seeing any mods. This could extend to INI files, save games and any other virtualized files.
Continue launching %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1457"/>
+ <location filename="organizercore.cpp" line="1470"/>
<source>No profile set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1753"/>
+ <location filename="organizercore.cpp" line="1766"/>
<source>Failed to refresh list of esps: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1852"/>
+ <location filename="organizercore.cpp" line="1875"/>
<source>Multiple esps/esls activated, please check that they don&apos;t conflict.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1929"/>
+ <location filename="organizercore.cpp" line="1963"/>
<source>Download?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1930"/>
+ <location filename="organizercore.cpp" line="1964"/>
<source>A download has been started but no installed page plugin recognizes it.
If you download anyway no information (i.e. version) will be associated with the download.
Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2063"/>
+ <location filename="organizercore.cpp" line="2099"/>
+ <location filename="organizercore.cpp" line="2148"/>
<source>failed to update mod list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2070"/>
- <location filename="organizercore.cpp" line="2087"/>
+ <location filename="organizercore.cpp" line="2155"/>
+ <location filename="organizercore.cpp" line="2172"/>
<source>login successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2094"/>
+ <location filename="organizercore.cpp" line="2179"/>
<source>Login failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2095"/>
+ <location filename="organizercore.cpp" line="2180"/>
<source>Login failed, try again?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2104"/>
+ <location filename="organizercore.cpp" line="2189"/>
<source>login failed: %1. Download will not be associated with an account</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2112"/>
+ <location filename="organizercore.cpp" line="2197"/>
<source>login failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2122"/>
+ <location filename="organizercore.cpp" line="2207"/>
<source>login failed: %1. You need to log-in with Nexus to update MO.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2175"/>
+ <location filename="organizercore.cpp" line="2260"/>
<source>MO1 &quot;Script Extender&quot; load mechanism has left hook.dll in your game folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2178"/>
- <location filename="organizercore.cpp" line="2194"/>
+ <location filename="organizercore.cpp" line="2263"/>
+ <location filename="organizercore.cpp" line="2279"/>
<source>Description missing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2187"/>
+ <location filename="organizercore.cpp" line="2272"/>
<source>&lt;a href=&quot;%1&quot;&gt;hook.dll&lt;/a&gt; has been found in your game folder (right click to copy the full path). This is most likely a leftover of setting the ModOrganizer 1 load mechanism to &quot;Script Extender&quot;, in which case you must remove this file either by changing the load mechanism in ModOrganizer 1 or manually removing the file, otherwise the game is likely to crash and burn.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2221"/>
+ <location filename="organizercore.cpp" line="2306"/>
<source>failed to save load order: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2293"/>
+ <location filename="organizercore.cpp" line="2378"/>
<source>The designated write target &quot;%1&quot; is not enabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4685,94 +4730,94 @@ Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="246"/>
+ <location filename="pluginlist.cpp" line="228"/>
<source>failed to update esp info for file %1 (source id: %2), error: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="319"/>
+ <location filename="pluginlist.cpp" line="301"/>
<source>esp not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="367"/>
- <location filename="pluginlist.cpp" line="379"/>
+ <location filename="pluginlist.cpp" line="349"/>
+ <location filename="pluginlist.cpp" line="361"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="367"/>
+ <location filename="pluginlist.cpp" line="349"/>
<source>Really enable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="379"/>
+ <location filename="pluginlist.cpp" line="361"/>
<source>Really disable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="484"/>
+ <location filename="pluginlist.cpp" line="466"/>
<source>The file containing locked plugin indices is broken</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="981"/>
- <location filename="pluginlist.cpp" line="985"/>
+ <location filename="pluginlist.cpp" line="963"/>
+ <location filename="pluginlist.cpp" line="967"/>
<source>&lt;b&gt;Origin&lt;/b&gt;: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="982"/>
+ <location filename="pluginlist.cpp" line="964"/>
<source>&lt;br&gt;&lt;b&gt;&lt;i&gt;This plugin can&apos;t be disabled (enforced by the game).&lt;/i&gt;&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="987"/>
+ <location filename="pluginlist.cpp" line="969"/>
<source>Author</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="990"/>
+ <location filename="pluginlist.cpp" line="972"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="993"/>
+ <location filename="pluginlist.cpp" line="975"/>
<source>Missing Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1000"/>
+ <location filename="pluginlist.cpp" line="982"/>
<source>Enabled Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1003"/>
+ <location filename="pluginlist.cpp" line="985"/>
<source>Loads Archives</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1004"/>
+ <location filename="pluginlist.cpp" line="986"/>
<source>There are Archives connected to this plugin. Their assets will be added to your game, overwriting in case of conflicts following the plugin order. Loose files will always overwrite assets from Archives. (This flag only checks for Archives from the same mod as the plugin)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1009"/>
+ <location filename="pluginlist.cpp" line="991"/>
<source>Loads INI settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1010"/>
+ <location filename="pluginlist.cpp" line="992"/>
<source>There is an ini file connected to this plugin. Its settings will be added to your game settings, overwriting in case of conflicts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1014"/>
+ <location filename="pluginlist.cpp" line="996"/>
<source>This ESP is flagged as an ESL. It will adhere to the ESP load order but the records will be loaded in ESL space.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1189"/>
+ <location filename="pluginlist.cpp" line="1171"/>
<source>failed to restore load order for %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4872,8 +4917,10 @@ p, li { white-space: pre-wrap; }
<location filename="profile.cpp" line="419"/>
<location filename="profile.cpp" line="458"/>
<location filename="profile.cpp" line="555"/>
- <location filename="profile.cpp" line="574"/>
- <location filename="profile.cpp" line="584"/>
+ <location filename="profile.cpp" line="576"/>
+ <location filename="profile.cpp" line="586"/>
+ <location filename="profile.cpp" line="605"/>
+ <location filename="profile.cpp" line="615"/>
<source>invalid index %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4888,22 +4935,22 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="755"/>
+ <location filename="profile.cpp" line="786"/>
<source>Delete profile-specific save games?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="756"/>
+ <location filename="profile.cpp" line="787"/>
<source>Do you want to delete the profile-specific save games? (If you select &quot;No&quot;, the save games will show up again if you re-enable profile-specific save games)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="786"/>
+ <location filename="profile.cpp" line="817"/>
<source>Missing profile-specific game INI files!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="787"/>
+ <location filename="profile.cpp" line="818"/>
<source>Some of your profile-specific game INI files were missing. They will now be copied from the vanilla game folder. You might want double-check your settings.
Missing files:
@@ -4911,12 +4958,12 @@ Missing files:
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="803"/>
+ <location filename="profile.cpp" line="834"/>
<source>Delete profile-specific game INI files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="804"/>
+ <location filename="profile.cpp" line="835"/>
<source>Do you want to delete the profile-specific game INI files? (If you select &quot;No&quot;, the INI files will be used again if you re-enable profile-specific game INI files.)</source>
<translation type="unfinished"></translation>
</message>
@@ -5194,7 +5241,7 @@ p, li { white-space: pre-wrap; }
<location filename="../../uibase/src/report.cpp" line="34"/>
<location filename="../../uibase/src/report.cpp" line="37"/>
<location filename="main.cpp" line="98"/>
- <location filename="organizercore.cpp" line="737"/>
+ <location filename="organizercore.cpp" line="739"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@@ -5364,88 +5411,91 @@ If the folder was still in use, restart MO and try again.</source>
<message>
<location filename="instancemanager.cpp" line="140"/>
<source>Enter a new name or select one from the suggested list:
-(This is just the name of the Instance, not the game selection)</source>
+(This is just a name for the Instance and can be whatever you wish,
+ the actual game selection will happen on the next screen regardless of chosen name)</source>
+ <oldsource>Enter a new name or select one from the suggested list:
+(This is just the name of the Instance, not the game selection)</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="150"/>
- <location filename="instancemanager.cpp" line="221"/>
+ <location filename="instancemanager.cpp" line="151"/>
+ <location filename="instancemanager.cpp" line="222"/>
<source>Canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="156"/>
+ <location filename="instancemanager.cpp" line="157"/>
<source>Invalid instance name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="157"/>
+ <location filename="instancemanager.cpp" line="158"/>
<source>The instance name &quot;%1&quot; is invalid. Use the name &quot;%2&quot; instead?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="172"/>
+ <location filename="instancemanager.cpp" line="173"/>
<source>The instance &quot;%1&quot; already exists.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="173"/>
+ <location filename="instancemanager.cpp" line="174"/>
<source>Please choose a different instance name, like: &quot;%1 1&quot; .</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="192"/>
+ <location filename="instancemanager.cpp" line="193"/>
<source>Choose Instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="193"/>
+ <location filename="instancemanager.cpp" line="194"/>
<source>Each Instance is a full set of MO data files (mods, downloads, profiles, configuration, ...). You can use multiple instances for different games. Instances are stored in Appdata and can be accessed by all MO installations. If your MO folder is writable, you can also store a single instance locally (called a Portable install, and all the MO data files will be inside the installation folder).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="205"/>
+ <location filename="instancemanager.cpp" line="206"/>
<source>New</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="206"/>
+ <location filename="instancemanager.cpp" line="207"/>
<source>Create a new instance.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="210"/>
+ <location filename="instancemanager.cpp" line="211"/>
<source>Portable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="211"/>
+ <location filename="instancemanager.cpp" line="212"/>
<source>Use MO folder for data.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="215"/>
+ <location filename="instancemanager.cpp" line="216"/>
<source>Manage Instances</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="216"/>
+ <location filename="instancemanager.cpp" line="217"/>
<source>Delete an Instance.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="267"/>
+ <location filename="instancemanager.cpp" line="268"/>
<location filename="profile.cpp" line="69"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="270"/>
+ <location filename="instancemanager.cpp" line="271"/>
<source>Data directory created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="271"/>
+ <location filename="instancemanager.cpp" line="272"/>
<source>New data directory created at %1. If you don&apos;t want to store a lot of data there, reconfigure the storage directories via settings.</source>
<translation type="unfinished"></translation>
</message>
@@ -5515,7 +5565,7 @@ If the folder was still in use, restart MO and try again.</source>
</message>
<message>
<location filename="main.cpp" line="99"/>
- <location filename="organizercore.cpp" line="738"/>
+ <location filename="organizercore.cpp" line="740"/>
<source>Failed to create &quot;%1&quot;. Your user account probably lacks permission.</source>
<translation type="unfinished"></translation>
</message>
@@ -5557,7 +5607,7 @@ If the folder was still in use, restart MO and try again.</source>
</message>
<message>
<location filename="main.cpp" line="682"/>
- <location filename="settings.cpp" line="1098"/>
+ <location filename="settings.cpp" line="1123"/>
<source>Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
@@ -5572,18 +5622,18 @@ If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="920"/>
+ <location filename="mainwindow.cpp" line="937"/>
<source>Please use &quot;Help&quot; from the toolbar to get usage instructions to all elements</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1405"/>
- <location filename="mainwindow.cpp" line="4778"/>
+ <location filename="mainwindow.cpp" line="1426"/>
+ <location filename="mainwindow.cpp" line="4850"/>
<source>&lt;Manage...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1417"/>
+ <location filename="mainwindow.cpp" line="1438"/>
<source>failed to parse profile %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -5619,12 +5669,12 @@ If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="560"/>
+ <location filename="pluginlist.cpp" line="542"/>
<source>failed to access %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="574"/>
+ <location filename="pluginlist.cpp" line="556"/>
<source>failed to set file time %1</source>
<translation type="unfinished"></translation>
</message>
@@ -5634,12 +5684,12 @@ If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="1105"/>
+ <location filename="settings.cpp" line="1130"/>
<source>Script Extender</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="1112"/>
+ <location filename="settings.cpp" line="1137"/>
<source>Proxy DLL</source>
<translation type="unfinished"></translation>
</message>
@@ -5855,28 +5905,28 @@ Select Show Details option to see the full change-log.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="503"/>
- <location filename="settings.cpp" line="522"/>
+ <location filename="settings.cpp" line="518"/>
+ <location filename="settings.cpp" line="537"/>
<source>attempt to store setting for unknown plugin &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="877"/>
+ <location filename="settings.cpp" line="901"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="878"/>
+ <location filename="settings.cpp" line="902"/>
<source>Failed to create &quot;%1&quot;, you may not have the necessary permission. path remains unchanged.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="1149"/>
+ <location filename="settings.cpp" line="1176"/>
<source>Restart Mod Organizer?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="1150"/>
+ <location filename="settings.cpp" line="1177"/>
<source>In order to reset the window geometries, MO must be restarted.
Restart it now?</source>
<translation type="unfinished"></translation>
@@ -5958,174 +6008,184 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="105"/>
+ <location filename="settingsdialog.ui" line="142"/>
<source>Reset Colors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="112"/>
+ <location filename="settingsdialog.ui" line="128"/>
<source>Is overwritten (loose files)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="119"/>
+ <location filename="settingsdialog.ui" line="149"/>
<source>Mod Contains selected Plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="126"/>
+ <location filename="settingsdialog.ui" line="121"/>
<source>Plugin is Contained in selected Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="133"/>
+ <location filename="settingsdialog.ui" line="135"/>
<source>Is overwriting (loose files)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="140"/>
- <location filename="settingsdialog.ui" line="143"/>
+ <location filename="settingsdialog.ui" line="105"/>
+ <location filename="settingsdialog.ui" line="108"/>
<source>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="146"/>
+ <location filename="settingsdialog.ui" line="111"/>
<source>Show mod list separator colors on the scrollbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="159"/>
- <location filename="settingsdialog.ui" line="162"/>
+ <location filename="settingsdialog.ui" line="156"/>
+ <source>Is overwritten (archive files)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="163"/>
+ <source>Is overwriting (archive files)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="173"/>
+ <location filename="settingsdialog.ui" line="176"/>
<source>Modify the categories available to arrange your mods.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="165"/>
+ <location filename="settingsdialog.ui" line="179"/>
<source>Configure Mod Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="178"/>
+ <location filename="settingsdialog.ui" line="192"/>
<source>Reset stored information from dialogs.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="181"/>
+ <location filename="settingsdialog.ui" line="195"/>
<source>This will make all dialogs show up again where you checked the &quot;Remember selection&quot;-box.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="184"/>
+ <location filename="settingsdialog.ui" line="198"/>
<source>Reset Dialogs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="191"/>
+ <location filename="settingsdialog.ui" line="205"/>
<source>If checked, the download interface will be more compact.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="194"/>
+ <location filename="settingsdialog.ui" line="208"/>
<source>Compact Download Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="214"/>
+ <location filename="settingsdialog.ui" line="228"/>
<source>If checked, the download list will display meta information instead of file names.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="217"/>
+ <location filename="settingsdialog.ui" line="231"/>
<source>Download Meta Information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="228"/>
+ <location filename="settingsdialog.ui" line="242"/>
<source>Paths</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="236"/>
- <location filename="settingsdialog.ui" line="253"/>
- <location filename="settingsdialog.ui" line="350"/>
- <location filename="settingsdialog.ui" line="408"/>
+ <location filename="settingsdialog.ui" line="250"/>
+ <location filename="settingsdialog.ui" line="267"/>
+ <location filename="settingsdialog.ui" line="364"/>
+ <location filename="settingsdialog.ui" line="422"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="263"/>
+ <location filename="settingsdialog.ui" line="277"/>
<source>Caches</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="270"/>
+ <location filename="settingsdialog.ui" line="284"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="277"/>
- <location filename="settingsdialog.ui" line="280"/>
+ <location filename="settingsdialog.ui" line="291"/>
+ <location filename="settingsdialog.ui" line="294"/>
<source>Directory where downloads are stored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="297"/>
+ <location filename="settingsdialog.ui" line="311"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="317"/>
+ <location filename="settingsdialog.ui" line="331"/>
<source>Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="340"/>
+ <location filename="settingsdialog.ui" line="354"/>
<source>Directory where mods are stored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="343"/>
+ <location filename="settingsdialog.ui" line="357"/>
<source>Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don&apos;t exist in the new location (with the same name).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="367"/>
+ <location filename="settingsdialog.ui" line="381"/>
<source>Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="387"/>
+ <location filename="settingsdialog.ui" line="401"/>
<source>Managed Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="394"/>
+ <location filename="settingsdialog.ui" line="408"/>
<source>Base Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="401"/>
+ <location filename="settingsdialog.ui" line="415"/>
<source>Use %BASE_DIR% to refer to the Base Directory.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="430"/>
+ <location filename="settingsdialog.ui" line="444"/>
<source>Important: All directories have to be writeable!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="438"/>
- <location filename="settingsdialog.ui" line="454"/>
+ <location filename="settingsdialog.ui" line="452"/>
+ <location filename="settingsdialog.ui" line="468"/>
<source>Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="444"/>
+ <location filename="settingsdialog.ui" line="458"/>
<source>Allows automatic log-in when the Nexus-Page for the game is clicked.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="447"/>
+ <location filename="settingsdialog.ui" line="461"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -6134,149 +6194,149 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="463"/>
+ <location filename="settingsdialog.ui" line="477"/>
<source>If checked and if correct credentials are entered below, log-in to Nexus (for browsing and downloading) is automatic.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="466"/>
+ <location filename="settingsdialog.ui" line="480"/>
<source>Automatically Log-In to Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="475"/>
- <location filename="settingsdialog.ui" line="675"/>
+ <location filename="settingsdialog.ui" line="489"/>
+ <location filename="settingsdialog.ui" line="689"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="489"/>
- <location filename="settingsdialog.ui" line="685"/>
+ <location filename="settingsdialog.ui" line="503"/>
+ <location filename="settingsdialog.ui" line="699"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="510"/>
+ <location filename="settingsdialog.ui" line="524"/>
<source>Remove cache and cookies. Forces a new login.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="513"/>
+ <location filename="settingsdialog.ui" line="527"/>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="544"/>
+ <location filename="settingsdialog.ui" line="558"/>
<source>Disable automatic internet features</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="547"/>
+ <location filename="settingsdialog.ui" line="561"/>
<source>Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="550"/>
+ <location filename="settingsdialog.ui" line="564"/>
<source>Offline Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="557"/>
+ <location filename="settingsdialog.ui" line="571"/>
<source>Use a proxy for network connections.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="560"/>
+ <location filename="settingsdialog.ui" line="574"/>
<source>Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="563"/>
+ <location filename="settingsdialog.ui" line="577"/>
<source>Use HTTP Proxy (Uses System Settings)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="570"/>
+ <location filename="settingsdialog.ui" line="584"/>
<source>Endorsement Integration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="584"/>
+ <location filename="settingsdialog.ui" line="598"/>
<source>Associate with &quot;Download with manager&quot; links</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="613"/>
+ <location filename="settingsdialog.ui" line="627"/>
<source>Known Servers (updated on download)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="634"/>
+ <location filename="settingsdialog.ui" line="648"/>
<source>Preferred Servers (Drag &amp; Drop)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="669"/>
+ <location filename="settingsdialog.ui" line="683"/>
<source>Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="715"/>
+ <location filename="settingsdialog.ui" line="729"/>
<source>If you save your steam user ID and password here, they will be used when logging into steam. Note, however, your password will be stored unencrypted, so make sure your computer is secure.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="742"/>
+ <location filename="settingsdialog.ui" line="756"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="767"/>
+ <location filename="settingsdialog.ui" line="781"/>
<source>Author:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="781"/>
+ <location filename="settingsdialog.ui" line="795"/>
<source>Version:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="795"/>
+ <location filename="settingsdialog.ui" line="809"/>
<source>Description:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="833"/>
+ <location filename="settingsdialog.ui" line="847"/>
<source>Key</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="838"/>
+ <location filename="settingsdialog.ui" line="852"/>
<source>Value</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="850"/>
+ <location filename="settingsdialog.ui" line="864"/>
<source>Blacklisted Plugins (use &lt;del&gt; to remove):</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="861"/>
+ <location filename="settingsdialog.ui" line="875"/>
<source>Workarounds</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="869"/>
+ <location filename="settingsdialog.ui" line="883"/>
<source>Steam App ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="889"/>
+ <location filename="settingsdialog.ui" line="903"/>
<source>The Steam AppID for your game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="892"/>
+ <location filename="settingsdialog.ui" line="906"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -6292,17 +6352,17 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="923"/>
+ <location filename="settingsdialog.ui" line="937"/>
<source>Load Mechanism</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="943"/>
+ <location filename="settingsdialog.ui" line="957"/>
<source>Select loading mechanism. See help for details.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="946"/>
+ <location filename="settingsdialog.ui" line="960"/>
<source>Mod Organizer needs a dll to be injected into the game so all mods are visible to it.
There are several means to do this:
*Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it.
@@ -6313,17 +6373,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="963"/>
+ <location filename="settingsdialog.ui" line="977"/>
<source>NMM Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="983"/>
+ <location filename="settingsdialog.ui" line="997"/>
<source>The Version of Nexus Mod Manager to impersonate.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="986"/>
+ <location filename="settingsdialog.ui" line="1000"/>
<source>Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in.
On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn&apos;t need an update. Therefore you can configure the version to identify as here.
Please note that MO does identify itself as MO to the webserver, it&apos;s not lying about what it is. It is merely adding a &quot;compatible&quot; NMM version to the user agent.
@@ -6332,28 +6392,28 @@ tl;dr-version: If Nexus-features don&apos;t work, insert the current version num
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1010"/>
+ <location filename="settingsdialog.ui" line="1060"/>
<source>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1013"/>
+ <location filename="settingsdialog.ui" line="1063"/>
<source>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)
Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1017"/>
+ <location filename="settingsdialog.ui" line="1067"/>
<source>Force-enable game files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1027"/>
+ <location filename="settingsdialog.ui" line="1041"/>
<source>Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1030"/>
+ <location filename="settingsdialog.ui" line="1044"/>
<source>By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods.
However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can&apos;t be resolved correctly.
@@ -6361,51 +6421,66 @@ If you disable this feature, MO will only display official DLCs this way. Please
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1036"/>
+ <location filename="settingsdialog.ui" line="1050"/>
<source>Display mods installed outside MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1049"/>
+ <location filename="settingsdialog.ui" line="1027"/>
<source>Enforces that inactive ESPs and ESMs are never loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1052"/>
+ <location filename="settingsdialog.ui" line="1030"/>
<source>It seems that the Games occasionally load ESP or ESM files even if they haven&apos;t been activated as plugins.
I don&apos;t yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1056"/>
+ <location filename="settingsdialog.ui" line="1034"/>
<source>Hide inactive ESPs/ESMs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1063"/>
- <location filename="settingsdialog.ui" line="1066"/>
+ <location filename="settingsdialog.ui" line="1077"/>
+ <location filename="settingsdialog.ui" line="1080"/>
<source>Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1069"/>
+ <location filename="settingsdialog.ui" line="1083"/>
<source>Lock GUI when running executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1081"/>
- <location filename="settingsdialog.ui" line="1085"/>
+ <location filename="settingsdialog.ui" line="1093"/>
+ <source>Enable parsing of Archives. Has negative effects on performance.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1096"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, MO will parse archive files (BSA, BA2) to calculate conflicts between the contents of the archive files and other loose files. This process has a noticeable cost in performance.&lt;/p&gt;&lt;p&gt;This feature should not be confused with the archive management feature offered by MO1. MO2 will only show conflicts with archives and will NOT load them into the game or program.&lt;/p&gt;&lt;p&gt;If you disable this feature, MO will only display conflicts between loose files.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1099"/>
+ <source>Enable parsing of Archives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1111"/>
+ <location filename="settingsdialog.ui" line="1115"/>
<source>For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles.
For the other games this is not a sufficient replacement for AI!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1089"/>
+ <location filename="settingsdialog.ui" line="1119"/>
<source>Back-date BSAs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1100"/>
+ <location filename="settingsdialog.ui" line="1130"/>
<source>Add executables to the blacklist to prevent them from
accessing the virtual file system. This is useful to prevent
unintended programs from being hooked. Hooking unintended
@@ -6414,48 +6489,48 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1107"/>
+ <location filename="settingsdialog.ui" line="1137"/>
<source>Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1110"/>
+ <location filename="settingsdialog.ui" line="1140"/>
<source>Configure Executables Blacklist</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1120"/>
- <location filename="settingsdialog.ui" line="1123"/>
+ <location filename="settingsdialog.ui" line="1150"/>
+ <location filename="settingsdialog.ui" line="1153"/>
<source>Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1126"/>
+ <location filename="settingsdialog.ui" line="1156"/>
<source>Reset Window Geometries</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1149"/>
+ <location filename="settingsdialog.ui" line="1179"/>
<source>These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1160"/>
+ <location filename="settingsdialog.ui" line="1190"/>
<source>Diagnostics</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1168"/>
+ <location filename="settingsdialog.ui" line="1198"/>
<source>Max Dumps To Keep</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1188"/>
+ <location filename="settingsdialog.ui" line="1218"/>
<source>Maximum number of crash dumps to keep on disk. Use 0 for unlimited.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1191"/>
+ <location filename="settingsdialog.ui" line="1221"/>
<source>
Maximum number of crash dumps to keep on disk. Use 0 for unlimited.
Set &quot;Crash Dumps&quot; above to None to disable crash dump collection.
@@ -6463,12 +6538,12 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1203"/>
+ <location filename="settingsdialog.ui" line="1233"/>
<source>Hint: right click link and copy link location</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1206"/>
+ <location filename="settingsdialog.ui" line="1236"/>
<source>
Logs and crash dumps are stored under your current instance in the &lt;a href=&quot;LOGS_FULL_PATH&quot;&gt;LOGS_DIR&lt;/a&gt;
and &lt;a href=&quot;DUMPS_FULL_PATH&quot;&gt;DUMPS_DIR&lt;/a&gt; folders.
@@ -6478,17 +6553,17 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1223"/>
+ <location filename="settingsdialog.ui" line="1253"/>
<source>Crash Dumps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1230"/>
+ <location filename="settingsdialog.ui" line="1260"/>
<source>Decides which type of crash dumps are collected when injected processes crash.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1233"/>
+ <location filename="settingsdialog.ui" line="1263"/>
<source>
Decides which type of crash dumps are collected when injected processes crash.
&quot;None&quot; Disables the generation of crash dumps by MO.
@@ -6499,37 +6574,37 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1243"/>
+ <location filename="settingsdialog.ui" line="1273"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1248"/>
+ <location filename="settingsdialog.ui" line="1278"/>
<source>Mini (recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1253"/>
+ <location filename="settingsdialog.ui" line="1283"/>
<source>Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1258"/>
+ <location filename="settingsdialog.ui" line="1288"/>
<source>Full</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1286"/>
+ <location filename="settingsdialog.ui" line="1316"/>
<source>Log Level</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1293"/>
+ <location filename="settingsdialog.ui" line="1323"/>
<source>Decides the amount of data printed to &quot;ModOrganizer.log&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1296"/>
+ <location filename="settingsdialog.ui" line="1326"/>
<source>
Decides the amount of data printed to &quot;ModOrganizer.log&quot;.
&quot;Debug&quot; produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the &quot;Info&quot; level for regluar use. On the &quot;Error&quot; level the log file usually remains empty.
@@ -6537,22 +6612,22 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1303"/>
+ <location filename="settingsdialog.ui" line="1333"/>
<source>Debug</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1308"/>
+ <location filename="settingsdialog.ui" line="1338"/>
<source>Info (recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1313"/>
+ <location filename="settingsdialog.ui" line="1343"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1318"/>
+ <location filename="settingsdialog.ui" line="1348"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@@ -6618,12 +6693,12 @@ Example:
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="300"/>
+ <location filename="settingsdialog.cpp" line="322"/>
<source>Confirm?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="301"/>
+ <location filename="settingsdialog.cpp" line="323"/>
<source>This will make all dialogs show up again where you checked the &quot;Remember selection&quot;-box. Continue?</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index f4aa5beb..b5a1cb8a 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -792,6 +792,16 @@ std::wstring OrganizerCore::crashDumpsPath() {
).toStdWString();
}
+bool OrganizerCore::getArchiveParsing() const
+{
+ return m_ArchiveParsing;
+}
+
+void OrganizerCore::setArchiveParsing(const bool archiveParsing)
+{
+ m_ArchiveParsing = archiveParsing;
+}
+
void OrganizerCore::setCurrentProfile(const QString &profileName)
{
if ((m_CurrentProfile != nullptr)
@@ -1161,7 +1171,7 @@ QList<MOBase::IOrganizer::FileInfo> OrganizerCore::findFileInfos(
info.origins.append(ToQString(
m_DirectoryStructure->getOriginByID(file->getOrigin(fromArchive))
.getName()));
- info.archive = fromArchive ? ToQString(file->getArchive()) : "";
+ info.archive = fromArchive ? ToQString(file->getArchive().first) : "";
foreach (auto idx, file->getAlternatives()) {
info.origins.append(
ToQString(m_DirectoryStructure->getOriginByID(idx.first).getName()));
@@ -1986,12 +1996,14 @@ IPluginGame const *OrganizerCore::managedGame() const
std::vector<QString> OrganizerCore::enabledArchives()
{
std::vector<QString> result;
- QFile archiveFile(m_CurrentProfile->getArchivesFileName());
- if (archiveFile.open(QIODevice::ReadOnly)) {
- while (!archiveFile.atEnd()) {
- result.push_back(QString::fromUtf8(archiveFile.readLine()).trimmed());
+ if (m_ArchiveParsing) {
+ QFile archiveFile(m_CurrentProfile->getArchivesFileName());
+ if (archiveFile.open(QIODevice::ReadOnly)) {
+ while (!archiveFile.atEnd()) {
+ result.push_back(QString::fromUtf8(archiveFile.readLine()).trimmed());
+ }
+ archiveFile.close();
}
- archiveFile.close();
}
return result;
}
diff --git a/src/organizercore.h b/src/organizercore.h
index 7a62d2c8..68d4e7e4 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -216,6 +216,8 @@ public:
bool onFinishedRun(const std::function<void (const QString &, unsigned int)> &func);
void refreshModList(bool saveChanges = true);
QStringList modsSortedByProfilePriority() const;
+ bool getArchiveParsing() const;
+ void setArchiveParsing(bool archiveParsing);
public: // IPluginDiagnose interface
@@ -342,6 +344,7 @@ private:
bool m_AskForNexusPW;
bool m_DirectoryUpdate;
bool m_ArchivesInit;
+ bool m_ArchiveParsing{ m_Settings.archiveParsing() };
MOBase::DelayedFileWriter m_PluginListsWriter;
UsvfsConnector m_USVFS;
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp
index ab8bb9f7..b2fabbe0 100644
--- a/src/pluginlist.cpp
+++ b/src/pluginlist.cpp
@@ -141,8 +141,8 @@ void PluginList::highlightPlugins(const QItemSelectionModel *selection, const MO
for (auto plugin : plugins) {
MOShared::FileEntry::Ptr file = directoryEntry.findFile(plugin.toStdWString());
if (file->getOrigin() != origin.getID()) {
- const std::vector<std::pair<int, std::wstring>> alternatives = file->getAlternatives();
- if (std::find_if(alternatives.begin(), alternatives.end(), [&](const std::pair<int, std::wstring>& element) { return element.first == origin.getID(); }) == alternatives.end())
+ const std::vector<std::pair<int, std::pair<std::wstring, int>>> alternatives = file->getAlternatives();
+ if (std::find_if(alternatives.begin(), alternatives.end(), [&](const std::pair<int, std::pair<std::wstring, int>>& element) { return element.first == origin.getID(); }) == alternatives.end())
continue;
}
std::map<QString, int>::iterator iter = m_ESPsByName.find(plugin.toLower());
diff --git a/src/resources.qrc b/src/resources.qrc
index 1dccce0b..5ed1780e 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -48,6 +48,9 @@
<file alias="emblem_conflict_overwrite">resources/conflict-overwrite.png</file>
<file alias="emblem_conflict_overwritten">resources/conflict-overwritten.png</file>
<file alias="emblem_conflict_redundant">resources/conflict-redundant.png</file>
+ <file alias="archive_loose_conflict_mixed">resources/conflict-mixed-blue.png</file>
+ <file alias="archive_loose_conflict_overwrite">resources/conflict-overwrite-blue.png</file>
+ <file alias="archive_loose_conflict_overwritten">resources/red-archive-conflict-loser.png</file>
<file alias="emblem_notes">resources/accessories-text-editor.png</file>
<file alias="version_date">resources/x-office-calendar.png</file>
<file alias="warning_16">resources/dialog-warning_16.png</file>
@@ -93,8 +96,8 @@
<file alias="string">resources/contents/conversation.png</file>
<file alias="bsa">resources/contents/locked-chest.png</file>
<file alias="menu">resources/contents/config.png</file>
- <file alias="inifile">resources/contents/feather-and-scroll.png</file>
- <file alias="modgroup">resources/contents/xedit.png</file>
+ <file alias="inifile">resources/contents/feather-and-scroll.png</file>
+ <file alias="modgroup">resources/contents/xedit.png</file>
</qresource>
<qresource prefix="/qt/etc">
<file>qt.conf</file>
diff --git a/src/resources/conflict-mixed-blue.png b/src/resources/conflict-mixed-blue.png
new file mode 100644
index 00000000..2afbb304
--- /dev/null
+++ b/src/resources/conflict-mixed-blue.png
Binary files differ
diff --git a/src/resources/conflict-overwrite-blue.png b/src/resources/conflict-overwrite-blue.png
new file mode 100644
index 00000000..3247e7b7
--- /dev/null
+++ b/src/resources/conflict-overwrite-blue.png
Binary files differ
diff --git a/src/resources/conflict-overwritten-blue.png b/src/resources/conflict-overwritten-blue.png
new file mode 100644
index 00000000..3a032a55
--- /dev/null
+++ b/src/resources/conflict-overwritten-blue.png
Binary files differ
diff --git a/src/resources/red-archive-conflict-loser.png b/src/resources/red-archive-conflict-loser.png
new file mode 100644
index 00000000..18284ee2
--- /dev/null
+++ b/src/resources/red-archive-conflict-loser.png
Binary files differ
diff --git a/src/settings.cpp b/src/settings.cpp
index c4228f65..95d7af49 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -394,6 +394,16 @@ QColor Settings::modlistOverwritingLooseColor() const
return m_Settings.value("Settings/overwritingLooseFilesColor", QColor(255, 0, 0, 64)).value<QColor>();
}
+QColor Settings::modlistOverwrittenArchiveColor() const
+{
+ return m_Settings.value("Settings/overwrittenArchiveFilesColor", QColor(0, 255, 255, 64)).value<QColor>();
+}
+
+QColor Settings::modlistOverwritingArchiveColor() const
+{
+ return m_Settings.value("Settings/overwritingArchiveFilesColor", QColor(255, 0, 255, 64)).value<QColor>();
+}
+
QColor Settings::modlistContainsPluginColor() const
{
return m_Settings.value("Settings/containsPluginColor", QColor(0, 0, 255, 64)).value<QColor>();
@@ -482,6 +492,11 @@ uint Settings::getMotDHash() const
return m_Settings.value("motd_hash", 0).toUInt();
}
+bool Settings::archiveParsing() const
+{
+ return m_Settings.value("Settings/archive_parsing", true).toBool();
+}
+
QVariant Settings::pluginSetting(const QString &pluginName, const QString &key) const
{
auto iterPlugin = m_PluginSettings.find(pluginName);
@@ -728,6 +743,8 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
, m_usePrereleaseBox(m_dialog.findChild<QCheckBox *>("usePrereleaseBox"))
, m_overwritingBtn(m_dialog.findChild<QPushButton *>("overwritingBtn"))
, m_overwrittenBtn(m_dialog.findChild<QPushButton *>("overwrittenBtn"))
+ , m_overwritingArchiveBtn(m_dialog.findChild<QPushButton *>("overwritingArchiveBtn"))
+ , m_overwrittenArchiveBtn(m_dialog.findChild<QPushButton *>("overwrittenArchiveBtn"))
, m_containsBtn(m_dialog.findChild<QPushButton *>("containsBtn"))
, m_containedBtn(m_dialog.findChild<QPushButton *>("containedBtn"))
, m_colorSeparatorsBox(m_dialog.findChild<QCheckBox *>("colorSeparatorsBox"))
@@ -784,11 +801,15 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
//version with stylesheet
m_dialog.setButtonColor(m_overwritingBtn, m_parent->modlistOverwritingLooseColor());
m_dialog.setButtonColor(m_overwrittenBtn, m_parent->modlistOverwrittenLooseColor());
+ m_dialog.setButtonColor(m_overwritingArchiveBtn, m_parent->modlistOverwritingArchiveColor());
+ m_dialog.setButtonColor(m_overwrittenArchiveBtn, m_parent->modlistOverwrittenArchiveColor());
m_dialog.setButtonColor(m_containsBtn, m_parent->modlistContainsPluginColor());
m_dialog.setButtonColor(m_containedBtn, m_parent->pluginListContainedColor());
m_dialog.setOverwritingColor(m_parent->modlistOverwritingLooseColor());
m_dialog.setOverwrittenColor(m_parent->modlistOverwrittenLooseColor());
+ m_dialog.setOverwritingArchiveColor(m_parent->modlistOverwritingArchiveColor());
+ m_dialog.setOverwrittenArchiveColor(m_parent->modlistOverwrittenArchiveColor());
m_dialog.setContainsColor(m_parent->modlistContainsPluginColor());
m_dialog.setContainedColor(m_parent->pluginListContainedColor());
@@ -816,6 +837,8 @@ void Settings::GeneralTab::update()
m_Settings.setValue("Settings/overwritingLooseFilesColor", m_dialog.getOverwritingColor());
m_Settings.setValue("Settings/overwrittenLooseFilesColor", m_dialog.getOverwrittenColor());
+ m_Settings.setValue("Settings/overwritingArchiveFilesColor", m_dialog.getOverwritingArchiveColor());
+ m_Settings.setValue("Settings/overwrittenArchiveFilesColor", m_dialog.getOverwrittenArchiveColor());
m_Settings.setValue("Settings/containsPluginColor", m_dialog.getContainsColor());
m_Settings.setValue("Settings/containedColor", m_dialog.getContainedColor());
m_Settings.setValue("Settings/compact_downloads", m_compactBox->isChecked());
@@ -1089,6 +1112,7 @@ Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent,
, m_forceEnableBox(m_dialog.findChild<QCheckBox *>("forceEnableBox"))
, m_displayForeignBox(m_dialog.findChild<QCheckBox *>("displayForeignBox"))
, m_lockGUIBox(m_dialog.findChild<QCheckBox *>("lockGUIBox"))
+ , m_enableArchiveParsingBox(m_dialog.findChild<QCheckBox *>("enableArchiveParsingBox"))
{
m_appIDEdit->setText(m_parent->getSteamAppID());
@@ -1123,6 +1147,7 @@ Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent,
m_forceEnableBox->setChecked(m_parent->forceEnableCoreFiles());
m_displayForeignBox->setChecked(m_parent->displayForeign());
m_lockGUIBox->setChecked(m_parent->lockGUI());
+ m_enableArchiveParsingBox->setChecked(m_parent->archiveParsing());
m_dialog.setExecutableBlacklist(m_parent->executablesBlacklist());
@@ -1141,6 +1166,7 @@ void Settings::WorkaroundsTab::update()
m_Settings.setValue("Settings/force_enable_core_files", m_forceEnableBox->isChecked());
m_Settings.setValue("Settings/display_foreign", m_displayForeignBox->isChecked());
m_Settings.setValue("Settings/lock_gui", m_lockGUIBox->isChecked());
+ m_Settings.setValue("Settings/archive_parsing", m_enableArchiveParsingBox->isChecked());
m_Settings.setValue("Settings/executable_blacklist", m_dialog.getExecutableBlacklist());
diff --git a/src/settings.h b/src/settings.h
index a47c255c..0286d4db 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -233,6 +233,10 @@ public:
QColor modlistOverwritingLooseColor() const;
+ QColor modlistOverwrittenArchiveColor() const;
+
+ QColor modlistOverwritingArchiveColor() const;
+
QColor modlistContainsPluginColor() const;
QColor pluginListContainedColor() const;
@@ -286,6 +290,11 @@ public:
void setMotDHash(uint hash);
/**
+ * @return true if the user wants to have archives being parsed to show conflicts and contents
+ */
+ bool archiveParsing() const;
+
+ /**
* @return hash of the last displayed message of the day
**/
uint getMotDHash() const;
@@ -423,6 +432,8 @@ private:
QCheckBox *m_usePrereleaseBox;
QPushButton *m_overwritingBtn;
QPushButton *m_overwrittenBtn;
+ QPushButton *m_overwritingArchiveBtn;
+ QPushButton *m_overwrittenArchiveBtn;
QPushButton *m_containsBtn;
QPushButton *m_containedBtn;
QCheckBox *m_colorSeparatorsBox;
@@ -520,6 +531,7 @@ private:
QCheckBox *m_forceEnableBox;
QCheckBox *m_displayForeignBox;
QCheckBox *m_lockGUIBox;
+ QCheckBox *m_enableArchiveParsingBox;
};
private slots:
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 3032a6c6..1bbc256f 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -266,7 +266,7 @@ void SettingsDialog::on_containedBtn_clicked()
void SettingsDialog::on_overwrittenBtn_clicked()
{
- QColor result = QColorDialog::getColor(m_OverwrittenColor, this, "ColorPicker: Is overwritten", QColorDialog::ShowAlphaChannel);
+ QColor result = QColorDialog::getColor(m_OverwrittenColor, this, "ColorPicker: Is overwritten (loose files)", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
m_OverwrittenColor = result;
setButtonColor(ui->overwrittenBtn, result);
@@ -275,22 +275,44 @@ void SettingsDialog::on_overwrittenBtn_clicked()
void SettingsDialog::on_overwritingBtn_clicked()
{
- QColor result = QColorDialog::getColor(m_OverwritingColor, this, "ColorPicker: Is overwriting", QColorDialog::ShowAlphaChannel);
+ QColor result = QColorDialog::getColor(m_OverwritingColor, this, "ColorPicker: Is overwriting (loose files)", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
m_OverwritingColor = result;
setButtonColor(ui->overwritingBtn, result);
}
}
+void SettingsDialog::on_overwrittenArchiveBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_OverwrittenArchiveColor, this, "ColorPicker: Is overwritten (archive files)", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_OverwrittenArchiveColor = result;
+ setButtonColor(ui->overwrittenArchiveBtn, result);
+ }
+}
+
+void SettingsDialog::on_overwritingArchiveBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_OverwritingArchiveColor, this, "ColorPicker: Is overwriting (archive files)", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_OverwritingArchiveColor = result;
+ setButtonColor(ui->overwritingArchiveBtn, result);
+ }
+}
+
void SettingsDialog::on_resetColorsBtn_clicked()
{
m_OverwritingColor = QColor(255, 0, 0, 64);
m_OverwrittenColor = QColor(0, 255, 0, 64);
+ m_OverwritingArchiveColor = QColor(255, 0, 255, 64);
+ m_OverwrittenArchiveColor = QColor(0, 255, 255, 64);
m_ContainsColor = QColor(0, 0, 255, 64);
m_ContainedColor = QColor(0, 0, 255, 64);
setButtonColor(ui->overwritingBtn, m_OverwritingColor);
setButtonColor(ui->overwrittenBtn, m_OverwrittenColor);
+ setButtonColor(ui->overwritingArchiveBtn, m_OverwritingArchiveColor);
+ setButtonColor(ui->overwrittenArchiveBtn, m_OverwrittenArchiveColor);
setButtonColor(ui->containsBtn, m_ContainsColor);
setButtonColor(ui->containedBtn, m_ContainedColor);
}
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index b005f928..6357f064 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -69,6 +69,8 @@ public:
QColor getOverwritingColor() { return m_OverwritingColor; }
QColor getOverwrittenColor() { return m_OverwrittenColor; }
+ QColor getOverwritingArchiveColor() { return m_OverwritingArchiveColor; }
+ QColor getOverwrittenArchiveColor() { return m_OverwrittenArchiveColor; }
QColor getContainsColor() { return m_ContainsColor; }
QColor getContainedColor() { return m_ContainedColor; }
QString getExecutableBlacklist() { return m_ExecutableBlacklist; }
@@ -76,6 +78,8 @@ public:
void setOverwritingColor(QColor col) { m_OverwritingColor = col; }
void setOverwrittenColor(QColor col) { m_OverwrittenColor = col; }
+ void setOverwritingArchiveColor(QColor col) { m_OverwritingArchiveColor = col; }
+ void setOverwrittenArchiveColor(QColor col) { m_OverwrittenArchiveColor = col; }
void setContainsColor(QColor col) { m_ContainsColor = col; }
void setContainedColor(QColor col) { m_ContainedColor = col; }
void setExecutableBlacklist(QString blacklist) { m_ExecutableBlacklist = blacklist; }
@@ -118,6 +122,10 @@ private slots:
void on_overwrittenBtn_clicked();
+ void on_overwritingArchiveBtn_clicked();
+
+ void on_overwrittenArchiveBtn_clicked();
+
void on_containsBtn_clicked();
void on_containedBtn_clicked();
@@ -142,6 +150,8 @@ private:
QColor m_OverwritingColor;
QColor m_OverwrittenColor;
+ QColor m_OverwritingArchiveColor;
+ QColor m_OverwrittenArchiveColor;
QColor m_ContainsColor;
QColor m_ContainedColor;
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index d9fa92d8..686a3028 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>586</width>
- <height>462</height>
+ <height>486</height>
</rect>
</property>
<property name="windowTitle">
@@ -99,10 +99,26 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
<string>Colors</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
+ <item row="6" column="0">
+ <widget class="QCheckBox" name="colorSeparatorsBox">
+ <property name="toolTip">
+ <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
+ </property>
+ <property name="whatsThis">
+ <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
+ </property>
+ <property name="text">
+ <string>Show mod list separator colors on the scrollbar</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
<item row="4" column="0" colspan="2">
- <widget class="QPushButton" name="resetColorsBtn">
+ <widget class="QPushButton" name="containedBtn">
<property name="text">
- <string>Reset Colors</string>
+ <string>Plugin is Contained in selected Mod</string>
</property>
</widget>
</item>
@@ -113,40 +129,38 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
</property>
</widget>
</item>
- <item row="2" column="0" colspan="2">
- <widget class="QPushButton" name="containsBtn">
+ <item row="1" column="1">
+ <widget class="QPushButton" name="overwritingBtn">
<property name="text">
- <string>Mod Contains selected Plugin</string>
+ <string>Is overwriting (loose files)</string>
</property>
</widget>
</item>
- <item row="3" column="0" colspan="2">
- <widget class="QPushButton" name="containedBtn">
+ <item row="5" column="0" colspan="2">
+ <widget class="QPushButton" name="resetColorsBtn">
<property name="text">
- <string>Plugin is Contained in selected Mod</string>
+ <string>Reset Colors</string>
</property>
</widget>
</item>
- <item row="1" column="1">
- <widget class="QPushButton" name="overwritingBtn">
+ <item row="3" column="0" colspan="2">
+ <widget class="QPushButton" name="containsBtn">
<property name="text">
- <string>Is overwriting (loose files)</string>
+ <string>Mod Contains selected Plugin</string>
</property>
</widget>
</item>
- <item row="5" column="0">
- <widget class="QCheckBox" name="colorSeparatorsBox">
- <property name="toolTip">
- <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
- </property>
- <property name="whatsThis">
- <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
- </property>
+ <item row="2" column="0">
+ <widget class="QPushButton" name="overwrittenArchiveBtn">
<property name="text">
- <string>Show mod list separator colors on the scrollbar</string>
+ <string>Is overwritten (archive files)</string>
</property>
- <property name="checked">
- <bool>true</bool>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="overwritingArchiveBtn">
+ <property name="text">
+ <string>Is overwriting (archive files)</string>
</property>
</widget>
</item>
@@ -1004,20 +1018,20 @@ tl;dr-version: If Nexus-features don't work, insert the current version number o
</item>
<item>
<layout class="QGridLayout" name="gridLayout_6">
- <item row="1" column="1">
- <widget class="QCheckBox" name="forceEnableBox">
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="hideUncheckedBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="toolTip">
- <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)</string>
+ <string>Enforces that inactive ESPs and ESMs are never loaded.</string>
</property>
<property name="whatsThis">
- <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)
-Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled.</string>
+ <string>It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins.
+I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded.</string>
</property>
<property name="text">
- <string>Force-enable game files</string>
- </property>
- <property name="checked">
- <bool>true</bool>
+ <string>Hide inactive ESPs/ESMs</string>
</property>
</widget>
</item>
@@ -1040,20 +1054,20 @@ If you disable this feature, MO will only display official DLCs this way. Please
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="hideUncheckedBox">
- <property name="enabled">
- <bool>false</bool>
- </property>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="forceEnableBox">
<property name="toolTip">
- <string>Enforces that inactive ESPs and ESMs are never loaded.</string>
+ <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)</string>
</property>
<property name="whatsThis">
- <string>It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins.
-I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded.</string>
+ <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)
+Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled.</string>
</property>
<property name="text">
- <string>Hide inactive ESPs/ESMs</string>
+ <string>Force-enable game files</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
</property>
</widget>
</item>
@@ -1073,6 +1087,22 @@ I don't yet know what the circumstances are, but user reports imply it is in som
</property>
</widget>
</item>
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="enableArchiveParsingBox">
+ <property name="toolTip">
+ <string>Enable parsing of Archives. Has negative effects on performance.</string>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, MO will parse archive files (BSA, BA2) to calculate conflicts between the contents of the archive files and other loose files. This process has a noticeable cost in performance.&lt;/p&gt;&lt;p&gt;This feature should not be confused with the archive management feature offered by MO1. MO2 will only show conflicts with archives and will NOT load them into the game or program.&lt;/p&gt;&lt;p&gt;If you disable this feature, MO will only display conflicts between loose files.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Enable parsing of Archives</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
<item>
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp
index cebf270e..9f54e526 100644
--- a/src/shared/directoryentry.cpp
+++ b/src/shared/directoryentry.cpp
@@ -220,12 +220,19 @@ std::vector<FileEntry::Ptr> FilesOrigin::getFiles() const
return result;
}
+bool FilesOrigin::containsArchive(std::wstring archiveName)
+{
+ for (FileEntry::Index fileIdx : m_Files)
+ if (FileEntry::Ptr p = m_FileRegister.lock()->getFile(fileIdx))
+ if (p->isFromArchive(archiveName)) return true;
+ return false;
+}
//
// FileEntry
//
-void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &archive)
+void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &archive, int order)
{
m_LastAccessed = time(nullptr);
if (m_Parent != nullptr) {
@@ -234,36 +241,36 @@ void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &arc
if (m_Origin == -1) {
m_Origin = origin;
m_FileTime = fileTime;
- m_Archive = archive;
+ m_Archive = std::pair<std::wstring, int>(archive, order);
} else if ((m_Parent != nullptr)
&& (m_Parent->getOriginByID(origin).getPriority() > m_Parent->getOriginByID(m_Origin).getPriority())
- && (archive.size() == 0 || m_Archive.size() > 0 )) {
- if (std::find_if(m_Alternatives.begin(), m_Alternatives.end(), [&](const std::pair<int, std::wstring> &i) -> bool { return i.first == m_Origin; }) == m_Alternatives.end()) {
- m_Alternatives.push_back(std::pair<int, std::wstring>(m_Origin, m_Archive));
+ && (archive.size() == 0 || m_Archive.first.size() > 0 )) {
+ if (std::find_if(m_Alternatives.begin(), m_Alternatives.end(), [&](const std::pair<int, std::pair<std::wstring, int>> &i) -> bool { return i.first == m_Origin; }) == m_Alternatives.end()) {
+ m_Alternatives.push_back(std::pair<int, std::pair<std::wstring, int>>(m_Origin, m_Archive));
}
m_Origin = origin;
m_FileTime = fileTime;
- m_Archive = archive;
+ m_Archive = std::pair<std::wstring, int>(archive, order);
} else {
bool found = false;
if (m_Origin == origin) {
// already an origin
return;
}
- for (std::vector<std::pair<int, std::wstring>>::iterator iter = m_Alternatives.begin(); iter != m_Alternatives.end(); ++iter) {
+ for (std::vector<std::pair<int, std::pair<std::wstring, int>>>::iterator iter = m_Alternatives.begin(); iter != m_Alternatives.end(); ++iter) {
if (iter->first == origin) {
// already an origin
return;
}
if ((m_Parent != nullptr)
&& (m_Parent->getOriginByID(iter->first).getPriority() < m_Parent->getOriginByID(origin).getPriority())) {
- m_Alternatives.insert(iter, std::pair<int, std::wstring>(origin, archive));
+ m_Alternatives.insert(iter, std::pair<int, std::pair<std::wstring, int>>(origin, std::pair<std::wstring, int>(archive, order)));
found = true;
break;
}
}
if (!found) {
- m_Alternatives.push_back(std::pair<int, std::wstring>(origin, archive));
+ m_Alternatives.push_back(std::pair<int, std::pair<std::wstring, int>>(origin, std::pair<std::wstring, int>(archive, order)));
}
}
}
@@ -273,14 +280,34 @@ bool FileEntry::removeOrigin(int origin)
if (m_Origin == origin) {
if (!m_Alternatives.empty()) {
// find alternative with the highest priority
- std::vector<std::pair<int, std::wstring>>::iterator currentIter = m_Alternatives.begin();
- for (std::vector<std::pair<int, std::wstring>>::iterator iter = m_Alternatives.begin(); iter != m_Alternatives.end(); ++iter) {
- if ((m_Parent->getOriginByID(iter->first).getPriority() > m_Parent->getOriginByID(currentIter->first).getPriority()) &&
- (iter->first != origin)) {
- currentIter = iter;
+ std::vector<std::pair<int, std::pair<std::wstring, int>>>::iterator currentIter = m_Alternatives.begin();
+ for (std::vector<std::pair<int, std::pair<std::wstring, int>>>::iterator iter = m_Alternatives.begin(); iter != m_Alternatives.end(); ++iter) {
+ if (iter->first != origin) {
+
+ //Both files are not from archives.
+ if (!iter->second.first.size() && !currentIter->second.first.size()) {
+ if ((m_Parent->getOriginByID(iter->first).getPriority() > m_Parent->getOriginByID(currentIter->first).getPriority())) {
+ currentIter = iter;
+ }
+ }
+ else {
+ //Both files are from archives
+ if (iter->second.first.size() && currentIter->second.first.size()) {
+ if (iter->second.second > currentIter->second.second) {
+ currentIter = iter;
+ }
+ }
+ else {
+ //Only one of the two is an archive, so we change currentIter only if he is the archive one.
+ if (currentIter->second.first.size()) {
+ currentIter = iter;
+ }
+ }
+ }
}
}
int currentID = currentIter->first;
+ m_Archive = currentIter->second;
m_Alternatives.erase(currentIter);
m_Origin = currentID;
@@ -292,19 +319,20 @@ bool FileEntry::removeOrigin(int origin)
if (!::GetFileTime(file, nullptr, nullptr, &m_FileTime)) {
// maybe this file is in a bsa, but there is no easy way to find out which. User should refresh
// the view to find out
- m_Archive = L"bsa?";
+ //m_Archive = std::pair<std::wstring, int>(L"bsa?", -1);
} else {
- m_Archive = L"";
+ //m_Archive = std::pair<std::wstring, int>(L"", -1);
}
::CloseHandle(file);
} else {
m_Origin = -1;
+ m_Archive = std::pair<std::wstring, int>(L"", -1);
return true;
}
} else {
- std::vector<std::pair<int, std::wstring>>::iterator newEnd = std::find_if(m_Alternatives.begin(), m_Alternatives.end(), [&](const std::pair<int, std::wstring> &i) -> bool { return i.first == origin; });
+ auto newEnd = std::remove_if(m_Alternatives.begin(), m_Alternatives.end(), [&](auto &i) -> bool { return i.first == origin; });
if (newEnd != m_Alternatives.end())
m_Alternatives.erase(newEnd, m_Alternatives.end());
}
@@ -318,7 +346,7 @@ FileEntry::FileEntry()
}
FileEntry::FileEntry(Index index, const std::wstring &name, DirectoryEntry *parent)
- : m_Index(index), m_Name(name), m_Origin(-1), m_Archive(L""), m_Parent(parent), m_LastAccessed(time(nullptr))
+ : m_Index(index), m_Name(name), m_Origin(-1), m_Archive(L"", -1), m_Parent(parent), m_LastAccessed(time(nullptr))
{
LEAK_TRACE;
}
@@ -330,16 +358,23 @@ FileEntry::~FileEntry()
void FileEntry::sortOrigins()
{
- m_Alternatives.push_back(std::pair<int, std::wstring>(m_Origin, m_Archive));
- std::sort(m_Alternatives.begin(), m_Alternatives.end(), [&](const std::pair<int, std::wstring> &LHS, const std::pair<int, std::wstring> &RHS) -> bool {
- if ((!LHS.second.size() && !RHS.second.size()) || (LHS.second.size() && RHS.second.size())) {
+ m_Alternatives.push_back(std::pair<int, std::pair<std::wstring, int>>(m_Origin, m_Archive));
+ std::sort(m_Alternatives.begin(), m_Alternatives.end(), [&](const std::pair<int, std::pair<std::wstring, int>> &LHS, const std::pair<int, std::pair<std::wstring, int>> &RHS) -> bool {
+ if (!LHS.second.first.size() && !RHS.second.first.size()) {
int l = m_Parent->getOriginByID(LHS.first).getPriority(); if (l < 0) l = INT_MAX;
int r = m_Parent->getOriginByID(RHS.first).getPriority(); if (r < 0) r = INT_MAX;
return l < r;
}
- if (RHS.second.size()) return false;
+ if (LHS.second.first.size() && RHS.second.first.size()) {
+ int l = LHS.second.second; if (l < 0) l = INT_MAX;
+ int r = RHS.second.second; if (r < 0) r = INT_MAX;
+
+ return l < r;
+ }
+
+ if (RHS.second.first.size()) return false;
return true;
});
if (!m_Alternatives.empty()) {
@@ -379,6 +414,16 @@ std::wstring FileEntry::getRelativePath() const
return result + L"\\" + m_Name;
}
+bool FileEntry::isFromArchive(std::wstring archiveName)
+{
+ if (archiveName.length() == 0) return m_Archive.first.length() != 0;
+ if (m_Archive.first.compare(archiveName) == 0) return true;
+ for (auto alternative : m_Alternatives) {
+ if (alternative.second.first.compare(archiveName) == 0) return true;
+ }
+ return false;
+}
+
//
// DirectoryEntry
@@ -451,7 +496,7 @@ void DirectoryEntry::addFromOrigin(const std::wstring &originName, const std::ws
}
-void DirectoryEntry::addFromBSA(const std::wstring &originName, std::wstring &directory, const std::wstring &fileName, int priority)
+void DirectoryEntry::addFromBSA(const std::wstring &originName, std::wstring &directory, const std::wstring &fileName, int priority, int order)
{
FilesOrigin &origin = createOrigin(originName, directory, priority);
@@ -459,23 +504,33 @@ void DirectoryEntry::addFromBSA(const std::wstring &originName, std::wstring &di
if (::GetFileAttributesExW(fileName.c_str(), GetFileExInfoStandard, &fileData) == 0) {
throw windows_error("failed to determine file time");
}
+ FILETIME now;
+ ::GetSystemTimeAsFileTime(&now);
+
+ const double clfSecondsPer100ns = 100. * 1.E-9;
+
+ ((ULARGE_INTEGER *)&now)->QuadPart -= ((double)5) / clfSecondsPer100ns;
- BSA::Archive archive;
- BSA::EErrorCode res = archive.read(ToString(fileName, false).c_str(), false);
- if ((res != BSA::ERROR_NONE) && (res != BSA::ERROR_INVALIDHASHES)) {
- std::ostringstream stream;
- stream << "invalid bsa file: " << ToString(fileName, false) << " errorcode " << res << " - " << ::GetLastError();
- throw std::runtime_error(stream.str());
- }
size_t namePos = fileName.find_last_of(L"\\/");
if (namePos == std::wstring::npos) {
namePos = 0;
- } else {
+ }
+ else {
++namePos;
}
- addFiles(origin, archive.getRoot(), fileData.ftLastWriteTime, fileName.substr(namePos));
- m_Populated = true;
+ if (!containsArchive(fileName.substr(namePos)) || ::CompareFileTime(&fileData.ftLastWriteTime, &now) > 0) {
+ BSA::Archive archive;
+ BSA::EErrorCode res = archive.read(ToString(fileName, false).c_str(), false);
+ if ((res != BSA::ERROR_NONE) && (res != BSA::ERROR_INVALIDHASHES)) {
+ std::ostringstream stream;
+ stream << "invalid bsa file: " << ToString(fileName, false) << " errorcode " << res << " - " << ::GetLastError();
+ throw std::runtime_error(stream.str());
+ }
+
+ addFiles(origin, archive.getRoot(), fileData.ftLastWriteTime, fileName.substr(namePos), order);
+ m_Populated = true;
+ }
}
void DirectoryEntry::propagateOrigin(int origin)
@@ -536,7 +591,7 @@ void DirectoryEntry::addFiles(FilesOrigin &origin, wchar_t *buffer, int bufferOf
getSubDirectory(findData.cFileName, true, origin.getID())->addFiles(origin, buffer, bufferOffset + offset);
}
} else {
- insert(findData.cFileName, origin, findData.ftLastWriteTime, L"");
+ insert(findData.cFileName, origin, findData.ftLastWriteTime, L"", -1);
}
result = ::FindNextFileW(searchHandle, &findData);
}
@@ -546,12 +601,12 @@ void DirectoryEntry::addFiles(FilesOrigin &origin, wchar_t *buffer, int bufferOf
}
-void DirectoryEntry::addFiles(FilesOrigin &origin, BSA::Folder::Ptr archiveFolder, FILETIME &fileTime, const std::wstring &archiveName)
+void DirectoryEntry::addFiles(FilesOrigin &origin, BSA::Folder::Ptr archiveFolder, FILETIME &fileTime, const std::wstring &archiveName, int order)
{
// add files
for (unsigned int fileIdx = 0; fileIdx < archiveFolder->getNumFiles(); ++fileIdx) {
BSA::File::Ptr file = archiveFolder->getFile(fileIdx);
- insert(ToWString(file->getName(), true), origin, fileTime, archiveName);
+ insert(ToWString(file->getName(), true), origin, fileTime, archiveName, order);
}
// recurse into subdirectories
@@ -559,7 +614,7 @@ void DirectoryEntry::addFiles(FilesOrigin &origin, BSA::Folder::Ptr archiveFolde
BSA::Folder::Ptr folder = archiveFolder->getSubFolder(folderIdx);
DirectoryEntry *folderEntry = getSubDirectoryRecursive(ToWString(folder->getName(), true), true, origin.getID());
- folderEntry->addFiles(origin, folder, fileTime, archiveName);
+ folderEntry->addFiles(origin, folder, fileTime, archiveName, order);
}
}
@@ -626,7 +681,7 @@ void DirectoryEntry::insertFile(const std::wstring &filePath, FilesOrigin &origi
{
size_t pos = filePath.find_first_of(L"\\/");
if (pos == std::string::npos) {
- this->insert(filePath, origin, fileTime, std::wstring());
+ this->insert(filePath, origin, fileTime, std::wstring(), -1);
} else {
std::wstring dirName = filePath.substr(0, pos);
std::wstring rest = filePath.substr(pos + 1);
@@ -667,6 +722,14 @@ void DirectoryEntry::removeFiles(const std::set<FileEntry::Index> &indices)
}
}
+bool DirectoryEntry::containsArchive(std::wstring archiveName)
+{
+ for (auto iter = m_Files.begin(); iter != m_Files.end(); ++iter) {
+ FileEntry::Ptr entry = m_FileRegister->getFile(iter->second);
+ if (entry->isFromArchive(archiveName)) return true;
+ }
+ return false;
+}
int DirectoryEntry::anyOrigin() const
{
@@ -890,7 +953,7 @@ void FileRegister::unregisterFile(FileEntry::Ptr file)
// unregister from origin
int originID = file->getOrigin(ignore);
m_OriginConnection->getByID(originID).removeFile(file->getIndex());
- const std::vector<std::pair<int, std::wstring>> &alternatives = file->getAlternatives();
+ const std::vector<std::pair<int, std::pair<std::wstring, int>>> &alternatives = file->getAlternatives();
for (auto iter = alternatives.begin(); iter != alternatives.end(); ++iter) {
m_OriginConnection->getByID(iter->first).removeFile(file->getIndex());
}
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h
index 8dbedaf4..12cef11d 100644
--- a/src/shared/directoryentry.h
+++ b/src/shared/directoryentry.h
@@ -64,7 +64,7 @@ public:
time_t lastAccessed() const { return m_LastAccessed; }
- void addOrigin(int origin, FILETIME fileTime, const std::wstring &archive);
+ void addOrigin(int origin, FILETIME fileTime, const std::wstring &archive, int order);
// remove the specified origin from the list of origins that contain this file. if no origin is left,
// the file is effectively deleted and true is returned. otherwise, false is returned
bool removeOrigin(int origin);
@@ -72,13 +72,13 @@ public:
// gets the list of alternative origins (origins with lower priority than the primary one).
// if sortOrigins has been called, it is sorted by priority (ascending)
- const std::vector<std::pair<int, std::wstring>> &getAlternatives() const { return m_Alternatives; }
+ const std::vector<std::pair<int, std::pair<std::wstring, int>>> &getAlternatives() const { return m_Alternatives; }
const std::wstring &getName() const { return m_Name; }
int getOrigin() const { return m_Origin; }
- int getOrigin(bool &archive) const { archive = (m_Archive.length() != 0); return m_Origin; }
- const std::wstring &getArchive() const { return m_Archive; }
- bool isFromArchive() const { return m_Archive.length() != 0; }
+ int getOrigin(bool &archive) const { archive = (m_Archive.first.length() != 0); return m_Origin; }
+ const std::pair<std::wstring, int> &getArchive() const { return m_Archive; }
+ bool isFromArchive(std::wstring archiveName = L"");
std::wstring getFullPath() const;
std::wstring getRelativePath() const;
DirectoryEntry *getParent() { return m_Parent; }
@@ -97,8 +97,8 @@ private:
Index m_Index;
std::wstring m_Name;
int m_Origin = -1;
- std::wstring m_Archive;
- std::vector<std::pair<int, std::wstring>> m_Alternatives;
+ std::pair<std::wstring, int> m_Archive;
+ std::vector<std::pair<int, std::pair<std::wstring, int>>> m_Alternatives;
DirectoryEntry *m_Parent;
mutable FILETIME m_FileTime;
@@ -142,6 +142,8 @@ public:
void addFile(FileEntry::Index index) { m_Files.insert(index); }
void removeFile(FileEntry::Index index);
+ bool containsArchive(std::wstring archiveName);
+
private:
FilesOrigin(int ID, const std::wstring &name, const std::wstring &path, int priority,
@@ -221,7 +223,7 @@ public:
// add files to this directory (and subdirectories) from the specified origin. That origin may exist or not
void addFromOrigin(const std::wstring &originName, const std::wstring &directory, int priority);
- void addFromBSA(const std::wstring &originName, std::wstring &directory, const std::wstring &fileName, int priority);
+ void addFromBSA(const std::wstring &originName, std::wstring &directory, const std::wstring &fileName, int priority, int order);
void propagateOrigin(int origin);
@@ -253,6 +255,8 @@ public:
*/
const FileEntry::Ptr findFile(const std::wstring &name) const;
+ bool containsArchive(std::wstring archiveName);
+
/** search through this directory and all subdirectories for a file by the specified name (relative path).
if directory is not nullptr, the referenced variable will be set to the path containing the file */
const FileEntry::Ptr searchFile(const std::wstring &path, const DirectoryEntry **directory) const;
@@ -297,7 +301,7 @@ private:
DirectoryEntry(const DirectoryEntry &reference);
DirectoryEntry &operator=(const DirectoryEntry &reference);
- void insert(const std::wstring &fileName, FilesOrigin &origin, FILETIME fileTime, const std::wstring &archive) {
+ void insert(const std::wstring &fileName, FilesOrigin &origin, FILETIME fileTime, const std::wstring &archive, int order) {
std::wstring fileNameLower = ToLower(fileName);
auto iter = m_Files.find(fileNameLower);
FileEntry::Ptr file;
@@ -308,12 +312,12 @@ private:
// TODO this has been observed to cause a crash, no clue why
m_Files[fileNameLower] = file->getIndex();
}
- file->addOrigin(origin.getID(), fileTime, archive);
+ file->addOrigin(origin.getID(), fileTime, archive, order);
origin.addFile(file->getIndex());
}
void addFiles(FilesOrigin &origin, wchar_t *buffer, int bufferOffset);
- void addFiles(FilesOrigin &origin, BSA::Folder::Ptr archiveFolder, FILETIME &fileTime, const std::wstring &archiveName);
+ void addFiles(FilesOrigin &origin, BSA::Folder::Ptr archiveFolder, FILETIME &fileTime, const std::wstring &archiveName, int order);
DirectoryEntry *getSubDirectory(const std::wstring &name, bool create, int originID = -1);
diff --git a/src/syncoverwritedialog.cpp b/src/syncoverwritedialog.cpp
index f03e29c5..7c341567 100644
--- a/src/syncoverwritedialog.cpp
+++ b/src/syncoverwritedialog.cpp
@@ -98,8 +98,8 @@ void SyncOverwriteDialog::readTree(const QString &path, DirectoryEntry *director
bool ignore;
int origin = entry->getOrigin(ignore);
addToComboBox(combo, ToQString(m_DirectoryStructure->getOriginByID(origin).getName()), origin);
- const std::vector<std::pair<int, std::wstring>> &alternatives = entry->getAlternatives();
- for (std::vector<std::pair<int, std::wstring>>::const_iterator iter = alternatives.begin(); iter != alternatives.end(); ++iter) {
+ const std::vector<std::pair<int, std::pair<std::wstring, int>>> &alternatives = entry->getAlternatives();
+ for (std::vector<std::pair<int, std::pair<std::wstring, int>>>::const_iterator iter = alternatives.begin(); iter != alternatives.end(); ++iter) {
addToComboBox(combo, ToQString(m_DirectoryStructure->getOriginByID(iter->first).getName()), iter->first);
}
combo->setCurrentIndex(combo->count() - 1);
diff --git a/src/version.rc b/src/version.rc
index 83a2eb5a..3e03e22a 100644
--- a/src/version.rc
+++ b/src/version.rc
@@ -1,37 +1,37 @@
-#include "Winver.h"
-
-// If VS_FF_PRERELEASE is not set, MO labels the build as a release and uses VER_FILEVERSION to determine version number.
-// Otherwise, if letters are used in VER_FILEVERSION_STR, uses the full MOBase::VersionInfo parser
-// Otherwise, uses the numbers from VER_FILEVERSION and sets the release type as pre-alpha
-#define VER_FILEVERSION 2,1,7
-#define VER_FILEVERSION_STR "2.1.7alpha6\0"
-
-VS_VERSION_INFO VERSIONINFO
-FILEVERSION VER_FILEVERSION
-PRODUCTVERSION VER_FILEVERSION
-FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
-FILEFLAGS VS_FF_PRERELEASE
-FILEOS VOS__WINDOWS32
-FILETYPE VFT_APP
-FILESUBTYPE (0)
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904B0"
- BEGIN
- VALUE "FileVersion", VER_FILEVERSION_STR
- VALUE "CompanyName", "Mod Organizer 2 Team\0"
- VALUE "FileDescription", "Mod Organizer 2 GUI\0"
- VALUE "OriginalFilename", "ModOrganizer.exe\0"
- VALUE "InternalName", "ModOrganizer2\0"
- VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2018 Mod Organizer 2 contributors\0"
- VALUE "ProductName", "Mod Organizer 2\0"
- VALUE "ProductVersion", VER_FILEVERSION_STR
- END
- END
-
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x0409L, 1200
- END
-END
+#include "Winver.h"
+
+// If VS_FF_PRERELEASE is not set, MO labels the build as a release and uses VER_FILEVERSION to determine version number.
+// Otherwise, if letters are used in VER_FILEVERSION_STR, uses the full MOBase::VersionInfo parser
+// Otherwise, uses the numbers from VER_FILEVERSION and sets the release type as pre-alpha
+#define VER_FILEVERSION 2,2,0
+#define VER_FILEVERSION_STR "2.2.0dev\0"
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION VER_FILEVERSION
+PRODUCTVERSION VER_FILEVERSION
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+FILEFLAGS VS_FF_PRERELEASE
+FILEOS VOS__WINDOWS32
+FILETYPE VFT_APP
+FILESUBTYPE (0)
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileVersion", VER_FILEVERSION_STR
+ VALUE "CompanyName", "Mod Organizer 2 Team\0"
+ VALUE "FileDescription", "Mod Organizer 2 GUI\0"
+ VALUE "OriginalFilename", "ModOrganizer.exe\0"
+ VALUE "InternalName", "ModOrganizer2\0"
+ VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2018 Mod Organizer 2 contributors\0"
+ VALUE "ProductName", "Mod Organizer 2\0"
+ VALUE "ProductVersion", VER_FILEVERSION_STR
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409L, 1200
+ END
+END