diff options
| author | LostDragonist <lost.dragonist@gmail.com> | 2018-12-30 16:27:43 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-12-30 16:27:43 -0600 |
| commit | b2ca83366a4794990b39bcc02861ae120d40cb09 (patch) | |
| tree | a646dbcfb20a1289179508649c7431036e06e85b /src | |
| parent | 4436d376a8d426867f217b03838570a424b09c5f (diff) | |
| parent | 71091f679dd1625b96e6d88d781a93fe6f14d210 (diff) | |
Merge pull request #601 from Project579/archive_conflicts_2
Archive conflicts Updating to Lastest Develop
Diffstat (limited to 'src')
35 files changed, 1642 insertions, 824 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3f004ddc..a084bae0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,6 +92,7 @@ SET(organizer_SRCS eventfilter.cpp moshortcut.cpp listdialog.cpp + lcdnumber.cpp shared/windows_error.cpp shared/error_report.cpp @@ -187,6 +188,7 @@ SET(organizer_HDRS descriptionpage.h moshortcut.h listdialog.h + lcdnumber.h shared/windows_error.h shared/error_report.h diff --git a/src/downloadlist.cpp b/src/downloadlist.cpp index 1e31973d..77c5973b 100644 --- a/src/downloadlist.cpp +++ b/src/downloadlist.cpp @@ -106,8 +106,7 @@ void DownloadList::update(int row) if (row < 0) {
emit endResetModel();
} else if (row < this->rowCount()) {
-#pragma message("updating only the one column is a hack")
- emit dataChanged(this->index(row, 2, QModelIndex()), this->index(row, 2, QModelIndex()));
+ emit dataChanged(this->index(row, 0, QModelIndex()), this->index(row, this->columnCount(QModelIndex())-1, QModelIndex()));
} else {
qCritical("invalid row %d in download list, update failed", row);
}
diff --git a/src/downloadlistwidget.cpp b/src/downloadlistwidget.cpp index 34a90534..c62d774c 100644 --- a/src/downloadlistwidget.cpp +++ b/src/downloadlistwidget.cpp @@ -120,8 +120,8 @@ void DownloadListWidgetDelegate::paintPendingDownload(int downloadIndex) const void DownloadListWidgetDelegate::paintRegularDownload(int downloadIndex) const
{
QString name = m_MetaDisplay ? m_Manager->getDisplayName(downloadIndex) : m_Manager->getFileName(downloadIndex);
- if (name.length() > 53) {
- name.truncate(50);
+ if (name.length() > 120) {
+ name.truncate(120);
name.append("...");
}
m_NameLabel->setText(name);
diff --git a/src/downloadlistwidget.ui b/src/downloadlistwidget.ui index 9e238509..112ca231 100644 --- a/src/downloadlistwidget.ui +++ b/src/downloadlistwidget.ui @@ -53,7 +53,7 @@ </property>
<property name="maximumSize">
<size>
- <width>323</width>
+ <width>16777215</width>
<height>16777215</height>
</size>
</property>
@@ -69,7 +69,7 @@ </property>
<property name="sizeHint" stdset="0">
<size>
- <width>40</width>
+ <width>10</width>
<height>20</height>
</size>
</property>
@@ -84,12 +84,12 @@ </item>
<item>
<widget class="QLabel" name="label_2">
+ <property name="visible">
+ <bool>false</bool>
+ </property>
<property name="text">
<string notr="true">KB</string>
</property>
- <property name="visible">
- <bool>false</bool>
- </property>
</widget>
</item>
</layout>
diff --git a/src/downloadlistwidgetcompact.cpp b/src/downloadlistwidgetcompact.cpp index fcf93754..644578de 100644 --- a/src/downloadlistwidgetcompact.cpp +++ b/src/downloadlistwidgetcompact.cpp @@ -119,8 +119,8 @@ void DownloadListWidgetCompactDelegate::paintPendingDownload(int downloadIndex) void DownloadListWidgetCompactDelegate::paintRegularDownload(int downloadIndex) const
{
QString name = m_MetaDisplay ? m_Manager->getDisplayName(downloadIndex) : m_Manager->getFileName(downloadIndex);
- if (name.length() > 53) {
- name.truncate(50);
+ if (name.length() > 100) {
+ name.truncate(100);
name.append("...");
}
m_NameLabel->setText(name);
diff --git a/src/downloadlistwidgetcompact.ui b/src/downloadlistwidgetcompact.ui index a3fa958c..ab634fb5 100644 --- a/src/downloadlistwidgetcompact.ui +++ b/src/downloadlistwidgetcompact.ui @@ -38,7 +38,7 @@ <item>
<widget class="QLabel" name="nameLabel">
<property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
diff --git a/src/helper.cpp b/src/helper.cpp index b7fc866c..59a2d3d1 100644 --- a/src/helper.cpp +++ b/src/helper.cpp @@ -26,6 +26,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <Windows.h>
#include <QDir>
+#include <QApplication>
using MOBase::reportError;
@@ -33,7 +34,7 @@ using MOBase::reportError; namespace Helper {
-static bool helperExec(LPCWSTR moDirectory, LPCWSTR commandLine)
+static bool helperExec(LPCWSTR moDirectory, LPCWSTR commandLine, BOOL async)
{
wchar_t fileName[MAX_PATH];
_snwprintf(fileName, MAX_PATH, L"%ls\\helper.exe", moDirectory);
@@ -51,7 +52,16 @@ static bool helperExec(LPCWSTR moDirectory, LPCWSTR commandLine) ::ShellExecuteExW(&execInfo);
- if ((execInfo.hProcess == 0) || (::WaitForSingleObject(execInfo.hProcess, INFINITE) != WAIT_OBJECT_0)) {
+ if (execInfo.hProcess == 0) {
+ reportError(QObject::tr("helper failed"));
+ return false;
+ }
+
+ if (async) {
+ return true;
+ }
+
+ if (::WaitForSingleObject(execInfo.hProcess, INFINITE) != WAIT_OBJECT_0) {
reportError(QObject::tr("helper failed"));
return false;
}
@@ -76,7 +86,7 @@ bool init(const std::wstring &moPath, const std::wstring &dataPath) _snwprintf(commandLine, 32768, L"init \"%ls\" \"%ls\"",
dataPath.c_str(), userName);
- bool res = helperExec(moPath.c_str(), commandLine);
+ bool res = helperExec(moPath.c_str(), commandLine, FALSE);
delete [] commandLine;
return res;
@@ -89,7 +99,23 @@ bool backdateBSAs(const std::wstring &moPath, const std::wstring &dataPath) _snwprintf(commandLine, 32768, L"backdateBSA \"%ls\"",
dataPath.c_str());
- bool res = helperExec(moPath.c_str(), commandLine);
+ bool res = helperExec(moPath.c_str(), commandLine, FALSE);
+ delete [] commandLine;
+
+ return res;
+}
+
+
+bool adminLaunch(const std::wstring &moPath, const std::wstring &moFile, const std::wstring &workingDir)
+{
+ wchar_t *commandLine = new wchar_t[32768];
+ _snwprintf(commandLine, 32768, L"adminLaunch %d \"%ls\" \"%ls\"",
+ ::GetCurrentProcessId(),
+ moFile.c_str(),
+ workingDir.c_str()
+ );
+
+ bool res = helperExec(moPath.c_str(), commandLine, TRUE);
delete [] commandLine;
return res;
diff --git a/src/helper.h b/src/helper.h index cd4b7883..f6667a84 100644 --- a/src/helper.h +++ b/src/helper.h @@ -26,7 +26,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. /**
* @brief Convenience functions to work with the external helper program.
- *
+ *
* The mo_helper program is used to make changes on the system that require administrative
* rights, so that ModOrganizer itself can run without special privileges
**/
@@ -34,7 +34,7 @@ namespace Helper { /**
* @brief initialise the specified directory for use with mod organizer.
- *
+ *
* This will create all required sub-directories and give the user running ModOrganizer
* write-access
*
@@ -50,6 +50,14 @@ bool init(const std::wstring &moPath, const std::wstring &dataPath); **/
bool backdateBSAs(const std::wstring &moPath, const std::wstring &dataPath);
+/**
+ * @brief waits for the current process to exit and restarts it as an administrator
+ * @param moPath absolute path to the modOrganizer base directory
+ * @param moFile file name of modOrganizer
+ * @param workingDir current working directory
+ **/
+bool adminLaunch(const std::wstring &moPath, const std::wstring &moFile, const std::wstring &workingDir);
+
}
diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 64e58358..76b1e086 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -677,7 +677,14 @@ void InstallationManager::postInstallCleanup() // TODO: this doesn't yet remove directories. Also, the files may be left there if this point isn't reached for (const QString &tempFile : m_TempFilesToDelete) { QFileInfo fileInfo(QDir::tempPath() + "/" + tempFile); - QFile::remove(fileInfo.absoluteFilePath()); + if (fileInfo.exists()) { + if (!fileInfo.isReadable() || !fileInfo.isWritable()) { + QFile::setPermissions(fileInfo.absoluteFilePath(), QFile::ReadOther | QFile::WriteOther); + } + if (!QFile::remove(fileInfo.absoluteFilePath())) { + qWarning() << "Unable to delete " << fileInfo.absoluteFilePath(); + } + } directoriesToRemove.insert(fileInfo.absolutePath()); } diff --git a/src/lcdnumber.cpp b/src/lcdnumber.cpp new file mode 100644 index 00000000..3191b434 --- /dev/null +++ b/src/lcdnumber.cpp @@ -0,0 +1,37 @@ +/* +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "lcdnumber.h" + +#include <QToolTip> +#include <QTimer> + +LCDNumber::LCDNumber(QWidget *parent) + : QLCDNumber(parent) +{ +} + +void LCDNumber::mousePressEvent(QMouseEvent *event) +{ + m_toolTipPosition = mapToGlobal(event->pos()); + QTimer::singleShot(100, this, SLOT(showToolTip())); +} + +void LCDNumber::showToolTip() +{ + QToolTip::showText(m_toolTipPosition, toolTip()); +} diff --git a/src/lcdnumber.h b/src/lcdnumber.h new file mode 100644 index 00000000..2f8e0454 --- /dev/null +++ b/src/lcdnumber.h @@ -0,0 +1,35 @@ +/* +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QLCDNumber> +#include <QMouseEvent> +#include <QWidget> + +class LCDNumber : public QLCDNumber +{ + Q_OBJECT + +public: + LCDNumber(QWidget *parent = nullptr); + void mousePressEvent(QMouseEvent *event); + +public slots: + void showToolTip(); + +private: + QPoint m_toolTipPosition; +}; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 73a40f46..6f49822a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -245,8 +245,6 @@ MainWindow::MainWindow(QSettings &initSettings statusBar()->clearMessage();
statusBar()->hide();
- ui->actionEndorseMO->setVisible(false);
-
updateProblemsButton();
// Setup toolbar
@@ -262,6 +260,10 @@ MainWindow::MainWindow(QSettings &initSettings actionToToolButton(ui->actionHelp);
createHelpWidget();
+ actionToToolButton(ui->actionEndorseMO);
+ createEndorseWidget();
+ ui->actionEndorseMO->setVisible(false);
+
for (QAction *action : ui->toolBar->actions()) {
if (action->isSeparator()) {
// insert spacers
@@ -285,14 +287,17 @@ MainWindow::MainWindow(QSettings &initSettings ui->modList->setItemDelegateForColumn(ModList::COL_FLAGS, new ModFlagIconDelegate(ui->modList));
ui->modList->setItemDelegateForColumn(ModList::COL_CONTENT, contentDelegate);
ui->modList->header()->installEventFilter(m_OrganizerCore.modList());
+ connect(ui->modList->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(modListSectionResized(int, int, int)));
bool modListAdjusted = registerWidgetState(ui->modList->objectName(), ui->modList->header(), "mod_list_state");
if (modListAdjusted) {
// hack: force the resize-signal to be triggered because restoreState doesn't seem to do that
- int sectionSize = ui->modList->header()->sectionSize(ModList::COL_CONTENT);
- ui->modList->header()->resizeSection(ModList::COL_CONTENT, sectionSize + 1);
- ui->modList->header()->resizeSection(ModList::COL_CONTENT, sectionSize);
+ for (int column = 0; column <= ModList::COL_LASTCOLUMN; ++column) {
+ int sectionSize = ui->modList->header()->sectionSize(column);
+ ui->modList->header()->resizeSection(column, sectionSize + 1);
+ ui->modList->header()->resizeSection(column, sectionSize);
+ }
} else {
// hide these columns by default
ui->modList->header()->setSectionHidden(ModList::COL_CONTENT, true);
@@ -362,6 +367,7 @@ MainWindow::MainWindow(QSettings &initSettings connect(ui->modList->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(modlistSelectionChanged(QModelIndex,QModelIndex)));
connect(m_ModListSortProxy, SIGNAL(filterActive(bool)), this, SLOT(modFilterActive(bool)));
+ connect(m_ModListSortProxy, SIGNAL(layoutChanged()), this, SLOT(updateModCount()));
connect(ui->modFilterEdit, SIGNAL(textChanged(QString)), m_ModListSortProxy, SLOT(updateFilter(QString)));
connect(ui->espFilterEdit, SIGNAL(textChanged(QString)), m_PluginListSortProxy, SLOT(updateFilter(QString)));
@@ -468,17 +474,25 @@ MainWindow::MainWindow(QSettings &initSettings // set the name of the widget to the name of the action to allow styling
ui->toolBar->widgetForAction(action)->setObjectName(action->objectName());
}
+ emit updatePluginCount();
+ emit updateModCount();
}
MainWindow::~MainWindow()
{
- cleanup();
+ try {
+ cleanup();
- m_PluginContainer.setUserInterface(nullptr, nullptr);
- m_OrganizerCore.setUserInterface(nullptr, nullptr);
- m_IntegratedBrowser.close();
- delete ui;
+ m_PluginContainer.setUserInterface(nullptr, nullptr);
+ m_OrganizerCore.setUserInterface(nullptr, nullptr);
+ m_IntegratedBrowser.close();
+ delete ui;
+ } catch (std::exception &e) {
+ QMessageBox::critical(nullptr, tr("Crash on exit"),
+ tr("MO crashed while exiting. Some settings may not be saved.\n\nError: %1").arg(e.what()),
+ QMessageBox::Ok);
+ }
}
@@ -709,6 +723,25 @@ void MainWindow::about() }
+void MainWindow::createEndorseWidget()
+{
+ QToolButton *toolBtn = qobject_cast<QToolButton*>(ui->toolBar->widgetForAction(ui->actionEndorseMO));
+ QMenu *buttonMenu = toolBtn->menu();
+ if (buttonMenu == nullptr) {
+ return;
+ }
+ buttonMenu->clear();
+
+ QAction *endorseAction = new QAction(tr("Endorse"), buttonMenu);
+ connect(endorseAction, SIGNAL(triggered()), this, SLOT(on_actionEndorseMO_triggered()));
+ buttonMenu->addAction(endorseAction);
+
+ QAction *wontEndorseAction = new QAction(tr("Won't Endorse"), buttonMenu);
+ connect(wontEndorseAction, SIGNAL(triggered()), this, SLOT(wontEndorse()));
+ buttonMenu->addAction(wontEndorseAction);
+}
+
+
void MainWindow::createHelpWidget()
{
QToolButton *toolBtn = qobject_cast<QToolButton*>(ui->toolBar->widgetForAction(ui->actionHelp));
@@ -775,13 +808,17 @@ void MainWindow::createHelpWidget() void MainWindow::modFilterActive(bool filterActive)
{
+ ui->clearFiltersButton->setVisible(filterActive);
if (filterActive) {
// m_OrganizerCore.modList()->setOverwriteMarkers(std::set<unsigned int>(), std::set<unsigned int>());
ui->modList->setStyleSheet("QTreeView { border: 2px ridge #f00; }");
+ ui->activeModsCounter->setStyleSheet("QLCDNumber { border: 2px ridge #f00; }");
} else if (ui->groupCombo->currentIndex() != 0) {
ui->modList->setStyleSheet("QTreeView { border: 2px ridge #337733; }");
+ ui->activeModsCounter->setStyleSheet("");
} else {
ui->modList->setStyleSheet("");
+ ui->activeModsCounter->setStyleSheet("");
}
}
@@ -789,9 +826,12 @@ void MainWindow::espFilterChanged(const QString &filter) {
if (!filter.isEmpty()) {
ui->espList->setStyleSheet("QTreeView { border: 2px ridge #f00; }");
+ ui->activePluginsCounter->setStyleSheet("QLCDNumber { border: 2px ridge #f00; }");
} else {
ui->espList->setStyleSheet("");
+ ui->activePluginsCounter->setStyleSheet("");
}
+ updatePluginCount();
}
void MainWindow::downloadFilterChanged(const QString &filter)
@@ -1167,6 +1207,8 @@ void MainWindow::activateSelectedProfile() refreshSaveList();
m_OrganizerCore.refreshModList();
+ updateModCount();
+ updatePluginCount();
}
void MainWindow::on_profileBox_currentIndexChanged(int index)
@@ -1211,9 +1253,11 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) }
}
-void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly)
+void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon)
{
bool isDirectory = true;
+ //QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder);
+ //QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File);
std::wostringstream temp;
temp << directorySoFar << "\\" << directoryEntry.getName();
@@ -1226,11 +1270,11 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director columns.append("");
if (!(*current)->isEmpty()) {
QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns);
- directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder));
+ directoryChild->setData(0, Qt::DecorationRole, *folderIcon);
directoryChild->setData(0, Qt::UserRole + 3, isDirectory);
if (conflictsOnly || !m_showArchiveData) {
- updateTo(directoryChild, temp.str(), **current, conflictsOnly);
+ updateTo(directoryChild, temp.str(), **current, conflictsOnly, fileIcon, folderIcon);
if (directoryChild->childCount() != 0) {
subTree->addChild(directoryChild);
}
@@ -1249,7 +1293,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director }
else {
QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns);
- directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder));
+ directoryChild->setData(0, Qt::DecorationRole, *folderIcon);
directoryChild->setData(0, Qt::UserRole + 3, isDirectory);
subTree->addChild(directoryChild);
}
@@ -1298,7 +1342,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director fileChild->setFont(1, font);
}
fileChild->setData(0, Qt::UserRole, ToQString(current->getFullPath()));
- fileChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::File));
+ fileChild->setData(0, Qt::DecorationRole, *fileIcon);
fileChild->setData(0, Qt::UserRole + 3, isDirectory);
fileChild->setData(0, Qt::UserRole + 1, isArchive);
fileChild->setData(1, Qt::UserRole, source);
@@ -1348,7 +1392,9 @@ void MainWindow::expandDataTreeItem(QTreeWidgetItem *item) std::wstring virtualPath = (path + L"\\").substr(6) + ToWString(item->text(0));
DirectoryEntry *dir = m_OrganizerCore.directoryStructure()->findSubDirectoryRecursive(virtualPath);
if (dir != nullptr) {
- updateTo(item, path, *dir, conflictsOnly);
+ QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder);
+ QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File);
+ updateTo(item, path, *dir, conflictsOnly, &fileIcon, &folderIcon);
} else {
qWarning("failed to update view of %ls", path.c_str());
}
@@ -1423,12 +1469,14 @@ void MainWindow::refreshDataTree() {
QCheckBox *conflictsBox = findChild<QCheckBox*>("conflictsCheckBox");
QTreeWidget *tree = findChild<QTreeWidget*>("dataTree");
+ QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder);
+ QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File);
tree->clear();
QStringList columns("data");
columns.append("");
QTreeWidgetItem *subTree = new QTreeWidgetItem(columns);
subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder));
- updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked());
+ updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked(), &fileIcon, &folderIcon);
tree->insertTopLevelItem(0, subTree);
subTree->setExpanded(true);
}
@@ -1437,7 +1485,8 @@ void MainWindow::refreshDataTreeKeepExpandedNodes() {
QCheckBox *conflictsBox = findChild<QCheckBox*>("conflictsCheckBox");
QTreeWidget *tree = findChild<QTreeWidget*>("dataTree");
-
+ QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder);
+ QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File);
QStringList expandedNodes;
QTreeWidgetItemIterator it1(tree, QTreeWidgetItemIterator::NotHidden | QTreeWidgetItemIterator::HasChildren);
while (*it1) {
@@ -1453,7 +1502,7 @@ void MainWindow::refreshDataTreeKeepExpandedNodes() columns.append("");
QTreeWidgetItem *subTree = new QTreeWidgetItem(columns);
subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder));
- updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked());
+ updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked(), &fileIcon, &folderIcon);
tree->insertTopLevelItem(0, subTree);
subTree->setExpanded(true);
QTreeWidgetItemIterator it2(tree, QTreeWidgetItemIterator::HasChildren);
@@ -2187,6 +2236,11 @@ void MainWindow::directory_refreshed() statusBar()->hide();
}
+void MainWindow::esplist_changed()
+{
+ emit updatePluginCount();
+}
+
void MainWindow::modorder_changed()
{
for (unsigned int i = 0; i < m_OrganizerCore.currentProfile()->numMods(); ++i) {
@@ -2458,6 +2512,7 @@ void MainWindow::restoreBackup_clicked() void MainWindow::modlistChanged(const QModelIndex&, int)
{
m_OrganizerCore.currentProfile()->writeModlist();
+ emit updateModCount();
}
void MainWindow::modlistSelectionChanged(const QModelIndex ¤t, const QModelIndex&)
@@ -2496,6 +2551,12 @@ void MainWindow::modListSortIndicatorChanged(int, Qt::SortOrder) ui->modList->verticalScrollBar()->repaint();
}
+void MainWindow::modListSectionResized(int logicalIndex, int oldSize, int newSize)
+{
+ bool enabled = (newSize != 0);
+ qobject_cast<ModListSortProxy *>(ui->modList->model())->setColumnVisible(logicalIndex, enabled);
+}
+
void MainWindow::removeMod_clicked()
{
try {
@@ -2612,16 +2673,49 @@ void MainWindow::endorseMod(ModInfo::Ptr mod) void MainWindow::endorse_clicked()
{
- endorseMod(ModInfo::getByIndex(m_ContextRow));
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ if (selection->hasSelection() && selection->selectedRows().count() > 1) {
+ if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->loggedIn()) {
+ MessageDialog::showMessage(tr("Endorsing multiple mods will take a while. Please wait..."), this);
+ for (QModelIndex idx : selection->selectedRows()) {
+ ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(true);
+ }
+ }
+ else {
+ QString username, password;
+ if (m_OrganizerCore.settings().getNexusLogin(username, password)) {
+ MessageDialog::showMessage(tr("Endorsing multiple mods will take a while. Please wait..."), this);
+ for (QModelIndex idx : selection->selectedRows()) {
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
+ m_OrganizerCore.doAfterLogin(boost::bind(&MainWindow::endorseMod, this, modInfo));
+ }
+ NexusInterface::instance(&m_PluginContainer)->getAccessManager()->login(username, password);
+ } else {
+ MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
+ return;
+ }
+ }
+ }
+ else {
+ endorseMod(ModInfo::getByIndex(m_ContextRow));
+ }
}
void MainWindow::dontendorse_clicked()
{
- ModInfo::getByIndex(m_ContextRow)->setNeverEndorse();
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ if (selection->hasSelection() && selection->selectedRows().count() > 1) {
+ for (QModelIndex idx : selection->selectedRows()) {
+ ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->setNeverEndorse();
+ }
+ }
+ else {
+ ModInfo::getByIndex(m_ContextRow)->setNeverEndorse();
+ }
}
-void MainWindow::unendorse_clicked()
+void MainWindow::unendorseMod(ModInfo::Ptr mod)
{
QString username, password;
if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->loggedIn()) {
@@ -2636,6 +2730,37 @@ void MainWindow::unendorse_clicked() }
}
+
+void MainWindow::unendorse_clicked()
+{
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ if (selection->hasSelection() && selection->selectedRows().count() > 1) {
+ if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->loggedIn()) {
+ MessageDialog::showMessage(tr("Unendorsing multiple mods will take a while. Please wait..."), this);
+ for (QModelIndex idx : selection->selectedRows()) {
+ ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(false);
+ }
+ }
+ else {
+ QString username, password;
+ if (m_OrganizerCore.settings().getNexusLogin(username, password)) {
+ MessageDialog::showMessage(tr("Unendorsing multiple mods will take a while. Please wait..."), this);
+ for (QModelIndex idx : selection->selectedRows()) {
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
+ m_OrganizerCore.doAfterLogin(boost::bind(&MainWindow::unendorseMod, this, modInfo));
+ }
+ NexusInterface::instance(&m_PluginContainer)->getAccessManager()->login(username, password);
+ } else {
+ MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
+ return;
+ }
+ }
+ }
+ else {
+ unendorseMod(ModInfo::getByIndex(m_ContextRow));
+ }
+}
+
void MainWindow::loginFailed(const QString &error)
{
qDebug("login failed: %s", qPrintable(error));
@@ -2870,12 +2995,33 @@ void MainWindow::markConverted_clicked() void MainWindow::visitOnNexus_clicked()
{
- int modID = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole).toInt();
- QString gameName = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole + 4).toString();
- if (modID > 0) {
- linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName));
- } else {
- MessageDialog::showMessage(tr("Nexus ID for this Mod is unknown"), this);
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ if (selection->hasSelection() && selection->selectedRows().count() > 1) {
+ int count = selection->selectedRows().count();
+ if (count > 10) {
+ if (QMessageBox::question(this, tr("Opening Nexus Links"),
+ tr("You are trying to open %1 links to Nexus Mods. Are you sure you want to do this?").arg(count),
+ QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) {
+ return;
+ }
+ }
+
+ for (QModelIndex idx : selection->selectedRows()) {
+ int modID = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(idx.data(Qt::UserRole + 1).toInt(), 0), Qt::UserRole).toInt();
+ QString gameName = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(idx.data(Qt::UserRole + 1).toInt(), 0), Qt::UserRole + 4).toString();
+ if (modID > 0) {
+ linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName));
+ }
+ }
+ }
+ else {
+ int modID = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole).toInt();
+ QString gameName = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole + 4).toString();
+ if (modID > 0) {
+ linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName));
+ } else {
+ MessageDialog::showMessage(tr("Nexus ID for this Mod is unknown"), this);
+ }
}
}
@@ -2977,23 +3123,165 @@ void MainWindow::search_activated() ui->modFilterEdit->setSelection(0, INT_MAX);
}
- if (ui->espList->hasFocus() || ui->espFilterEdit->hasFocus()) {
+ else if (ui->espList->hasFocus() || ui->espFilterEdit->hasFocus()) {
ui->espFilterEdit->setFocus();
ui->espFilterEdit->setSelection(0, INT_MAX);
}
+
+ else if (ui->downloadView->hasFocus() || ui->downloadFilterEdit->hasFocus()) {
+ ui->downloadFilterEdit->setFocus();
+ ui->downloadFilterEdit->setSelection(0, INT_MAX);
+ }
}
void MainWindow::searchClear_activated()
{
- if (ui->modFilterEdit->hasFocus()) {
+ if (ui->modList->hasFocus() || ui->modFilterEdit->hasFocus()) {
ui->modFilterEdit->clear();
ui->modList->setFocus();
}
- if (ui->espFilterEdit->hasFocus()) {
+ else if (ui->espList->hasFocus() || ui->espFilterEdit->hasFocus()) {
ui->espFilterEdit->clear();
ui->espList->setFocus();
}
+
+ else if (ui->downloadView->hasFocus() || ui->downloadFilterEdit->hasFocus()) {
+ ui->downloadFilterEdit->clear();
+ ui->downloadView->setFocus();
+ }
+}
+
+void MainWindow::updateModCount()
+{
+ int activeCount = 0;
+ int visActiveCount = 0;
+ int backupCount = 0;
+ int visBackupCount = 0;
+ int foreignCount = 0;
+ int visForeignCount = 0;
+ int separatorCount = 0;
+ int visSeparatorCount = 0;
+ int regularCount = 0;
+ int visRegularCount = 0;
+
+ QStringList allMods = m_OrganizerCore.modList()->allMods();
+
+ auto hasFlag = [](std::vector<ModInfo::EFlag> flags, ModInfo::EFlag filter) {
+ return std::find(flags.begin(), flags.end(), filter) != flags.end();
+ };
+
+ bool isEnabled;
+ bool isVisible;
+ for (QString mod : allMods) {
+ int modIndex = ModInfo::getIndex(mod);
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex);
+ std::vector<ModInfo::EFlag> modFlags = modInfo->getFlags();
+ isEnabled = m_OrganizerCore.currentProfile()->modEnabled(modIndex);
+ isVisible = m_ModListSortProxy->filterMatchesMod(modInfo, isEnabled);
+
+ for (auto flag : modFlags) {
+ switch (flag) {
+ case ModInfo::FLAG_BACKUP: backupCount++;
+ if (isVisible)
+ visBackupCount++;
+ break;
+ case ModInfo::FLAG_FOREIGN: foreignCount++;
+ if (isVisible)
+ visForeignCount++;
+ break;
+ case ModInfo::FLAG_SEPARATOR: separatorCount++;
+ if (isVisible)
+ visSeparatorCount++;
+ break;
+ }
+ }
+
+ if (!hasFlag(modFlags, ModInfo::FLAG_BACKUP) &&
+ !hasFlag(modFlags, ModInfo::FLAG_FOREIGN) &&
+ !hasFlag(modFlags, ModInfo::FLAG_SEPARATOR) &&
+ !hasFlag(modFlags, ModInfo::FLAG_OVERWRITE)) {
+ if (isEnabled) {
+ activeCount++;
+ if (isVisible)
+ visActiveCount++;
+ }
+ if (isVisible)
+ visRegularCount++;
+ regularCount++;
+ }
+ }
+
+ ui->activeModsCounter->display(visActiveCount);
+ ui->activeModsCounter->setToolTip(tr("<table cellspacing=\"5\">"
+ "<tr><th>Type</th><th>All</th><th>Visible</th>"
+ "<tr><td>Enabled mods: </td><td align=right>%1 / %2</td><td align=right>%3 / %4</td></tr>"
+ "<tr><td>Unmanaged/DLCs: </td><td align=right>%5</td><td align=right>%6</td></tr>"
+ "<tr><td>Mod backups: </td><td align=right>%7</td><td align=right>%8</td></tr>"
+ "<tr><td>Separators: </td><td align=right>%9</td><td align=right>%10</td></tr>"
+ "</table>")
+ .arg(activeCount)
+ .arg(regularCount)
+ .arg(visActiveCount)
+ .arg(visRegularCount)
+ .arg(foreignCount)
+ .arg(visForeignCount)
+ .arg(backupCount)
+ .arg(visBackupCount)
+ .arg(separatorCount)
+ .arg(visSeparatorCount)
+ );
+}
+
+void MainWindow::updatePluginCount()
+{
+ int activeMasterCount = 0;
+ int activeLightMasterCount = 0;
+ int activeRegularCount = 0;
+ int masterCount = 0;
+ int lightMasterCount = 0;
+ int regularCount = 0;
+ int activeVisibleCount = 0;
+
+ PluginList *list = m_OrganizerCore.pluginList();
+ QString filter = ui->espFilterEdit->text();
+
+ for (QString plugin : list->pluginNames()) {
+ bool active = list->isEnabled(plugin);
+ bool visible = m_PluginListSortProxy->filterMatchesPlugin(plugin);
+ if (list->isMaster(plugin)) {
+ masterCount++;
+ activeMasterCount += active;
+ activeVisibleCount += visible && active;
+ } else if (list->isLight(plugin) || list->isLightFlagged(plugin)) {
+ lightMasterCount++;
+ activeLightMasterCount += active;
+ activeVisibleCount += visible && active;
+ } else {
+ regularCount++;
+ activeRegularCount += active;
+ activeVisibleCount += visible && active;
+ }
+ }
+
+ int activeCount = activeMasterCount + activeLightMasterCount + activeRegularCount;
+ int totalCount = masterCount + lightMasterCount + regularCount;
+
+ ui->activePluginsCounter->display(activeVisibleCount);
+ ui->activePluginsCounter->setToolTip(tr("<table cellspacing=\"4\">"
+ "<tr><th>Type</th><th>Active</th><th>Total</th></tr>"
+ "<tr><td>Active plugins:</td><td align=right>%1</td><td align=right>%2</td></tr>"
+ "<tr><td>Active ESMs:</td><td align=right>%3</td><td align=right>%4</td></tr>"
+ "<tr><td>Active ESPs:</td><td align=right>%7</td><td align=right>%8</td></tr>"
+ "<tr><td>Active ESMs+ESPs:</td><td align=right>%9</td><td align=right>%10</td></tr>"
+ "<tr><td>Active ESLs:</td><td align=right>%5</td><td align=right>%6</td></tr>"
+ "</table>")
+ .arg(activeCount).arg(totalCount)
+ .arg(activeMasterCount).arg(masterCount)
+ .arg(activeLightMasterCount).arg(lightMasterCount)
+ .arg(activeRegularCount).arg(regularCount)
+ .arg(activeMasterCount+activeRegularCount).arg(masterCount+regularCount)
+ );
}
void MainWindow::information_clicked()
@@ -3242,7 +3530,17 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index) else {
try {
m_ContextRow = m_ModListSortProxy->mapToSource(index).row();
- displayModInformation(sourceIdx.row());
+ sourceIdx.column();
+ int tab = -1;
+ switch (sourceIdx.column()) {
+ case ModList::COL_NOTES: tab = ModInfoDialog::TAB_NOTES; break;
+ case ModList::COL_VERSION: tab = ModInfoDialog::TAB_NEXUS; break;
+ case ModList::COL_MODID: tab = ModInfoDialog::TAB_NEXUS; break;
+ case ModList::COL_GAME: tab = ModInfoDialog::TAB_NEXUS; break;
+ case ModList::COL_CATEGORY: tab = ModInfoDialog::TAB_CATEGORIES; break;
+ default: tab = -1;
+ }
+ displayModInformation(sourceIdx.row(), tab);
// workaround to cancel the editor that might have opened because of
// selection-click
ui->modList->closePersistentEditor(index);
@@ -3262,7 +3560,9 @@ void MainWindow::openOriginInformation_clicked() {
try {
QItemSelectionModel *selection = ui->espList->selectionModel();
- if (selection->hasSelection() && selection->selectedRows().count() > 0) {
+ //we don't want to open multiple modinfodialogs.
+ /*if (selection->hasSelection() && selection->selectedRows().count() > 0) {
+
for (QModelIndex idx : selection->selectedRows()) {
QString fileName = idx.data().toString();
ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName)));
@@ -3273,16 +3573,15 @@ void MainWindow::openOriginInformation_clicked() }
}
}
- else {
- QModelIndex idx = selection->currentIndex();
- QString fileName = idx.data().toString();
+ else {}*/
+ QModelIndex idx = selection->currentIndex();
+ QString fileName = idx.data().toString();
- ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName)));
- std::vector<ModInfo::EFlag> flags = modInfo->getFlags();
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName)));
+ std::vector<ModInfo::EFlag> flags = modInfo->getFlags();
- if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) {
- displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName)));
- }
+ if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) {
+ displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName)));
}
}
catch (const std::exception &e) {
@@ -3665,7 +3964,11 @@ void MainWindow::disableVisibleMods() void MainWindow::openInstanceFolder()
{
- ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getBaseDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ QString dataPath = qApp->property("dataPath").toString();
+ ::ShellExecuteW(nullptr, L"explore", ToWString(dataPath).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+
+ //opens BaseDirectory instead
+ //::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getBaseDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
}
void MainWindow::openLogsFolder()
@@ -3691,6 +3994,17 @@ void MainWindow::openProfileFolder() ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
}
+void MainWindow::openIniFolder()
+{
+ if (m_OrganizerCore.currentProfile()->localSettingsEnabled())
+ {
+ ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ }
+ else {
+ ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.managedGame()->documentsDirectory().absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ }
+}
+
void MainWindow::openDownloadsFolder()
{
::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getDownloadDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
@@ -3890,6 +4204,8 @@ QMenu *MainWindow::openFolderMenu() FolderMenu->addAction(tr("Open MyGames folder"), this, SLOT(openMyGamesFolder()));
+ FolderMenu->addAction(tr("Open INIs folder"), this, SLOT(openIniFolder()));
+
FolderMenu->addSeparator();
FolderMenu->addAction(tr("Open Instance folder"), this, SLOT(openInstanceFolder()));
@@ -4033,14 +4349,14 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Change versioning scheme"), this, SLOT(changeVersioningScheme()));
}
- if (info->updateAvailable() || info->downgradeAvailable()) {
- if (info->updateIgnored()) {
- menu->addAction(tr("Un-ignore update"), this, SLOT(unignoreUpdate()));
- } else {
- menu->addAction(tr("Ignore update"), this, SLOT(ignoreUpdate()));
+ if (info->updateIgnored()) {
+ menu->addAction(tr("Un-ignore update"), this, SLOT(unignoreUpdate()));
+ }
+ else {
+ if (info->updateAvailable() || info->downgradeAvailable()) {
+ menu->addAction(tr("Ignore update"), this, SLOT(ignoreUpdate()));
}
}
-
menu->addSeparator();
menu->addAction(tr("Enable selected"), this, SLOT(enableSelectedMods_clicked()));
@@ -4057,7 +4373,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addSeparator();
- if (info->getNexusID() > 0) {
+ if (info->getNexusID() > 0 && Settings::instance().endorsementIntegration()) {
switch (info->endorsedState()) {
case ModInfo::ENDORSED_TRUE: {
menu->addAction(tr("Un-Endorse"), this, SLOT(unendorse_clicked()));
@@ -4134,8 +4450,6 @@ void MainWindow::on_categoriesList_itemSelectionChanged() m_ModListSortProxy->setCategoryFilter(categories);
m_ModListSortProxy->setContentFilter(content);
ui->clickBlankButton->setEnabled(categories.size() > 0 || content.size() >0);
- //ui->clearFiltersButton->setStyleSheet("border:5px solid #ff0000;");
- ui->clearFiltersButton->setVisible(categories.size() > 0 || content.size() > 0);
if (indices.count() == 0) {
ui->currentCategoryLabel->setText(QString("(%1)").arg(tr("<All>")));
@@ -4423,11 +4737,9 @@ void MainWindow::installTranslator(const QString &name) QTranslator *translator = new QTranslator(this);
QString fileName = name + "_" + m_CurrentLanguage;
if (!translator->load(fileName, qApp->applicationDirPath() + "/translations")) {
- if ((m_CurrentLanguage != "en-US")
- && (m_CurrentLanguage != "en_US")
- && (m_CurrentLanguage != "en-GB")) {
+ if (m_CurrentLanguage.compare("en", Qt::CaseInsensitive)) {
qDebug("localization file %s not found", qPrintable(fileName));
- } // we don't actually expect localization files for english
+ } // we don't actually expect localization files for English
}
qApp->installTranslator(translator);
@@ -4820,7 +5132,16 @@ void MainWindow::motdReceived(const QString &motd) void MainWindow::notEndorsedYet()
{
- ui->actionEndorseMO->setVisible(true);
+ if (!Settings::instance().directInterface().value("wont_endorse_MO", false).toBool()) {
+ ui->actionEndorseMO->setVisible(true);
+ }
+}
+
+
+void MainWindow::wontEndorse()
+{
+ Settings::instance().directInterface().setValue("wont_endorse_MO", true);
+ ui->actionEndorseMO->setVisible(false);
}
@@ -4951,7 +5272,9 @@ void MainWindow::nxmUpdatesAvailable(const std::vector<int> &modIDs, QVariant us if (game
&& result["id"].toInt() == game->nexusModOrganizerID()
&& result["game_id"].toInt() == game->nexusGameID()) {
- if (!result["voted_by_user"].toBool()) {
+ if (!result["voted_by_user"].toBool() &&
+ Settings::instance().endorsementIntegration() &&
+ !Settings::instance().directInterface().value("wont_endorse_MO", false).toBool()) {
ui->actionEndorseMO->setVisible(true);
}
} else {
@@ -4975,7 +5298,8 @@ void MainWindow::nxmUpdatesAvailable(const std::vector<int> &modIDs, QVariant us (*iter)->setNewestVersion(result["version"].toString());
(*iter)->setNexusDescription(result["description"].toString());
if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->loggedIn() &&
- result.contains("voted_by_user")) {
+ result.contains("voted_by_user") &&
+ Settings::instance().endorsementIntegration()) {
// don't use endorsement info if we're not logged in or if the response doesn't contain it
(*iter)->setIsEndorsed(result["voted_by_user"].toBool());
}
@@ -5933,6 +6257,7 @@ void MainWindow::on_clickBlankButton_clicked() void MainWindow::on_clearFiltersButton_clicked()
{
+ ui->modFilterEdit->clear();
deselectFilters();
}
diff --git a/src/mainwindow.h b/src/mainwindow.h index ad88c42c..63d140e0 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -162,6 +162,7 @@ public slots: void displayColumnSelection(const QPoint &pos);
void modorder_changed();
+ void esplist_changed();
void refresher_progress(int percent);
void directory_refreshed();
@@ -211,7 +212,7 @@ private: void startSteam();
- void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly);
+ void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon);
bool refreshProfiles(bool selectProfile = true);
void refreshExecutablesList();
void installMod(QString fileName = "");
@@ -250,6 +251,7 @@ private: // remove invalid category-references from mods
void fixCategories();
+ void createEndorseWidget();
void createHelpWidget();
bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName);
@@ -483,6 +485,7 @@ private slots: void motdReceived(const QString &motd);
void notEndorsedYet();
+ void wontEndorse();
void originModified(int originID);
@@ -516,6 +519,7 @@ private slots: void resumeDownload(int downloadIndex);
void endorseMod(ModInfo::Ptr mod);
+ void unendorseMod(ModInfo::Ptr mod);
void cancelModListEditor();
void lockESPIndex();
@@ -531,6 +535,7 @@ private slots: void openDownloadsFolder();
void openModsFolder();
void openProfileFolder();
+ void openIniFolder();
void openGameFolder();
void openMyGamesFolder();
void startExeAction();
@@ -578,6 +583,7 @@ private slots: void modlistSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous);
void modListSortIndicatorChanged(int column, Qt::SortOrder order);
+ void modListSectionResized(int logicalIndex, int oldSize, int newSize);
void modlistSelectionsChanged(const QItemSelection ¤t);
void esplistSelectionsChanged(const QItemSelection ¤t);
@@ -585,6 +591,9 @@ private slots: void search_activated();
void searchClear_activated();
+ void updateModCount();
+ void updatePluginCount();
+
private slots: // ui slots
// actions
void on_actionAdd_Profile_triggered();
diff --git a/src/mainwindow.ui b/src/mainwindow.ui index c6b43be0..972d9513 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -179,7 +179,7 @@ <number>2</number>
</property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="0,1,0,0,0,0,0">
+ <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="0,1,0,0,0,0,0,0,0">
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
@@ -295,6 +295,35 @@ p, li { white-space: pre-wrap; } </property>
</widget>
</item>
+ <item>
+ <widget class="QLabel" name="activeModslabel">
+ <property name="text">
+ <string>Active:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="LCDNumber" name="activeModsCounter">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>26</height>
+ </size>
+ </property>
+ <property name="whatsThis">
+ <string>This provides statistics about the mod list. The total number of active mod is normally displayed. Other statistics may be accessed with the tooltip of this counter.</string>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="digitCount">
+ <number>5</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
<item>
@@ -448,7 +477,7 @@ p, li { white-space: pre-wrap; } <bool>false</bool>
</property>
<attribute name="headerDefaultSectionSize">
- <number>20</number>
+ <number>35</number>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>true</bool>
@@ -612,7 +641,7 @@ p, li { white-space: pre-wrap; } </size>
</property>
<property name="placeholderText">
- <string>Namefilter</string>
+ <string>Filter</string>
</property>
</widget>
</item>
@@ -890,6 +919,35 @@ p, li { white-space: pre-wrap; } </property>
</widget>
</item>
+ <item>
+ <widget class="QLabel" name="activePluginsLabel">
+ <property name="text">
+ <string>Active:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="LCDNumber" name="activePluginsCounter">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>26</height>
+ </size>
+ </property>
+ <property name="whatsThis">
+ <string>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.</string>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="digitCount">
+ <number>4</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
<item>
@@ -1002,7 +1060,7 @@ p, li { white-space: pre-wrap; } <string/>
</property>
<property name="placeholderText">
- <string>Namefilter</string>
+ <string>Filter</string>
</property>
</widget>
</item>
@@ -1220,7 +1278,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all save games for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html></string>
</property>
@@ -1361,7 +1419,7 @@ p, li { white-space: pre-wrap; } <item>
<widget class="MOBase::LineEditClear" name="downloadFilterEdit">
<property name="placeholderText">
- <string>Namefilter</string>
+ <string>Filter</string>
</property>
</widget>
</item>
@@ -1643,6 +1701,11 @@ Right now this has very limited functionality</string> <extends>QTreeView</extends>
<header>pluginlistview.h</header>
</customwidget>
+ <customwidget>
+ <class>LCDNumber</class>
+ <extends>QLCDNumber</extends>
+ <header>lcdnumber.h</header>
+ </customwidget>
</customwidgets>
<resources>
<include location="resources.qrc"/>
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index d1d8d82a..02ace33f 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -115,7 +115,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ui->commentsEdit->setText(modInfo->comments());
ui->notesEdit->setText(modInfo->notes());
- ui->descriptionView->setPage(new DescriptionPage);
+ ui->descriptionView->setPage(new DescriptionPage());
connect(&m_ThumbnailMapper, SIGNAL(mapped(const QString&)), this, SIGNAL(thumbnailClickedSignal(const QString&)));
connect(this, SIGNAL(thumbnailClickedSignal(const QString&)), this, SLOT(thumbnailClicked(const QString&)));
@@ -171,10 +171,8 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ui->tabWidget->setTabEnabled(TAB_CONFLICTS, m_Origin != nullptr);
- if (ui->tabWidget->currentIndex() == TAB_NEXUS) {
- activateNexusTab();
- }
+ ui->endorseBtn->setVisible(Settings::instance().endorsementIntegration());
ui->endorseBtn->setEnabled((m_ModInfo->endorsedState() == ModInfo::ENDORSED_FALSE) ||
(m_ModInfo->endorsedState() == ModInfo::ENDORSED_NEVER));
@@ -185,6 +183,10 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo break;
}
}
+
+ if (ui->tabWidget->currentIndex() == TAB_NEXUS) {
+ activateNexusTab();
+ }
}
@@ -936,7 +938,7 @@ void ModInfoDialog::activateNexusTab() void ModInfoDialog::on_tabWidget_currentChanged(int index)
{
- if (m_RealTabPos[index] == TAB_NEXUS) {
+ if (index == TAB_NEXUS || m_RealTabPos[index] == TAB_NEXUS) {
activateNexusTab();
}
}
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 6a52d3df..548e3178 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -4,6 +4,7 @@ #include "messagedialog.h" #include "report.h" #include "scriptextender.h" +#include "settings.h" #include <QApplication> #include <QDirIterator> @@ -466,7 +467,9 @@ void ModInfoRegular::ignoreUpdate(bool ignore) std::vector<ModInfo::EFlag> ModInfoRegular::getFlags() const { std::vector<ModInfo::EFlag> result = ModInfoWithConflictInfo::getFlags(); - if ((m_NexusID > 0) && (endorsedState() == ENDORSED_FALSE)) { + if ((m_NexusID > 0) && + (endorsedState() == ENDORSED_FALSE) && + Settings::instance().endorsementIntegration()) { result.push_back(ModInfo::FLAG_NOTENDORSED); } if (!isValid() && !m_Validated) { diff --git a/src/modlist.cpp b/src/modlist.cpp index 757fedb2..0b66a663 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -167,7 +167,7 @@ QString ModList::getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const 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("Alternate game source");
+ case ModInfo::FLAG_ALTERNATE_GAME: return tr("This mod targets a different game");
default: return "";
}
}
@@ -981,7 +981,6 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa if (row == -1) {
row = parent.row();
}
-
ModInfo::Ptr modInfo = ModInfo::getByIndex(row);
QDir modDirectory(modInfo->absolutePath());
QDir gameDirectory(Settings::instance().getOverwriteDirectory());
@@ -993,12 +992,14 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa QString overwriteName = ModInfo::getByIndex(overwriteIndex)->name();
for (const QUrl &url : mimeData->urls()) {
+ qDebug("URL drop requested: %s", qPrintable(url.toLocalFile()));
if (!url.isLocalFile()) {
+ qDebug("URL drop ignored: Not a local file.");
continue;
}
QString relativePath = gameDirectory.relativeFilePath(url.toLocalFile());
if (relativePath.startsWith("..")) {
- qDebug("%s drop ignored", qPrintable(url.toLocalFile()));
+ qDebug("URL drop ignored: relative path starts with ..");
continue;
}
source.append(url.toLocalFile());
@@ -1007,7 +1008,10 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa }
if (source.count() != 0) {
- shellMove(source, target);
+ if (!shellMove(source, target)) {
+ qDebug("Move failed %lu",::GetLastError());
+ return false;
+ }
}
return true;
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index 8cf4bb9c..aaf93f5a 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -39,10 +39,6 @@ ModListSortProxy::ModListSortProxy(Profile* profile, QObject *parent) , m_FilterActive(false)
, m_FilterMode(FILTER_AND)
{
- m_EnabledColumns.set(ModList::COL_FLAGS);
- m_EnabledColumns.set(ModList::COL_NAME);
- m_EnabledColumns.set(ModList::COL_VERSION);
- m_EnabledColumns.set(ModList::COL_PRIORITY);
setDynamicSortFilter(true); // this seems to work without dynamicsortfilter
// but I don't know why. This should be necessary
}
@@ -218,9 +214,25 @@ bool ModListSortProxy::lessThan(const QModelIndex &left, lt = comp < 0;
}
} break;
+ case ModList::COL_NOTES: {
+ QString leftComments = leftMod->comments();
+ QString rightComments = rightMod->comments();
+ if (leftComments != rightComments) {
+ if (leftComments.isEmpty()) {
+ lt = sortOrder() == Qt::DescendingOrder;
+ } else if (rightComments.isEmpty()) {
+ lt = sortOrder() == Qt::AscendingOrder;
+ } else {
+ lt = leftComments < rightComments;
+ }
+ }
+ } break;
case ModList::COL_PRIORITY: {
// nop, already compared by priority
} break;
+ default: {
+ qWarning() << "Sorting is not defined for column " << left.column();
+ } break;
}
return lt;
}
@@ -345,8 +357,53 @@ bool ModListSortProxy::filterMatchesModOr(ModInfo::Ptr info, bool enabled) const bool ModListSortProxy::filterMatchesMod(ModInfo::Ptr info, bool enabled) const
{
- if (!m_CurrentFilter.isEmpty() &&
- !info->name().contains(m_CurrentFilter, Qt::CaseInsensitive)) {
+ bool display = true;
+ if (!m_CurrentFilter.isEmpty()) {
+ display = false;
+
+ // Search by name
+ if (!display &&
+ m_EnabledColumns[ModList::COL_NAME] &&
+ info->name().contains(m_CurrentFilter, Qt::CaseInsensitive)) {
+ display = true;
+ }
+
+ // Search by notes
+ if (!display &&
+ m_EnabledColumns[ModList::COL_NOTES] &&
+ info->comments().contains(m_CurrentFilter, Qt::CaseInsensitive)) {
+ display = true;
+ }
+
+ // Search by Nexus ID
+ if (!display &&
+ m_EnabledColumns[ModList::COL_MODID]) {
+ bool ok;
+ int filterID = m_CurrentFilter.toInt(&ok);
+ if (ok) {
+ int modID = info->getNexusID();
+ while (modID > 0) {
+ if (modID == filterID) {
+ display = true;
+ break;
+ }
+ modID = (int)(modID / 10);
+ }
+ }
+ }
+
+ // Search by categories
+ if (!display &&
+ m_EnabledColumns[ModList::COL_CATEGORY]) {
+ for (auto category : info->categories()) {
+ if (category.contains(m_CurrentFilter, Qt::CaseInsensitive)) {
+ display = true;
+ break;
+ }
+ }
+ }
+ }
+ if (!display) {
return false;
}
@@ -357,6 +414,11 @@ bool ModListSortProxy::filterMatchesMod(ModInfo::Ptr info, bool enabled) const }
}
+void ModListSortProxy::setColumnVisible(int column, bool visible)
+{
+ m_EnabledColumns[column] = visible;
+}
+
void ModListSortProxy::setFilterMode(ModListSortProxy::FilterMode mode)
{
if (m_FilterMode != mode) {
diff --git a/src/modlistsortproxy.h b/src/modlistsortproxy.h index b3c01fea..5fe8d9d6 100644 --- a/src/modlistsortproxy.h +++ b/src/modlistsortproxy.h @@ -60,6 +60,7 @@ public: virtual void setSourceModel(QAbstractItemModel *sourceModel) override;
+
/**
* @brief enable all mods visible under the current filter
**/
@@ -94,6 +95,13 @@ public: return rowCount(parent) > 0;
}
+ /**
+ * @brief sets whether a column is visible
+ * @param column the index of the column
+ * @param visible the visibility of the column
+ */
+ void setColumnVisible(int column, bool visible);
+
public slots:
void updateFilter(const QString &filter);
diff --git a/src/organizer.pro b/src/organizer.pro index 582fde9f..df42db40 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -92,7 +92,8 @@ SOURCES += \ modinfobackup.cpp \
modinfooverwrite.cpp \
modinfoforeign.cpp \
- listdialog.cpp
+ listdialog.cpp \
+ lcdnumber.cpp
HEADERS += \
@@ -169,7 +170,8 @@ HEADERS += \ modinfobackup.h \
modinfooverwrite.h \
modinfoforeign.h \
- listdialog.h
+ listdialog.h \
+ lcdnumber.h
FORMS += \
transfersavesdialog.ui \
diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 550f7d5c..c91a966b 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1386,58 +1386,58 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="699"/> + <location filename="installationmanager.cpp" line="706"/> <source>File format "%1" not supported</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="861"/> + <location filename="installationmanager.cpp" line="868"/> <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="872"/> + <location filename="installationmanager.cpp" line="879"/> <source>no error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="875"/> + <location filename="installationmanager.cpp" line="882"/> <source>7z.dll not found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="878"/> + <location filename="installationmanager.cpp" line="885"/> <source>7z.dll isn't valid</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="881"/> + <location filename="installationmanager.cpp" line="888"/> <source>archive not found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="884"/> + <location filename="installationmanager.cpp" line="891"/> <source>failed to open archive</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="887"/> + <location filename="installationmanager.cpp" line="894"/> <source>unsupported archive type</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="890"/> + <location filename="installationmanager.cpp" line="897"/> <source>internal library error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="893"/> + <location filename="installationmanager.cpp" line="900"/> <source>archive invalid</source> <translation type="unfinished"></translation> </message> <message> - <location filename="installationmanager.cpp" line="897"/> + <location filename="installationmanager.cpp" line="904"/> <source>unknown archive error</source> <translation type="unfinished"></translation> </message> @@ -1512,17 +1512,17 @@ This is likely due to a corrupted or incompatible download or unrecognized archi <translation type="unfinished"></translation> </message> <message> - <location filename="../../uibase/src/textviewer.cpp" line="130"/> + <location filename="../../uibase/src/textviewer.cpp" line="142"/> <source>failed to write to %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../uibase/src/textviewer.cpp" line="161"/> + <location filename="../../uibase/src/textviewer.cpp" line="178"/> <source>file not found: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../uibase/src/textviewer.cpp" line="186"/> + <location filename="../../uibase/src/textviewer.cpp" line="203"/> <source>Save</source> <translation type="unfinished"></translation> </message> @@ -1547,7 +1547,7 @@ This is likely due to a corrupted or incompatible download or unrecognized archi <name>MainWindow</name> <message> <location filename="mainwindow.ui" line="46"/> - <location filename="mainwindow.ui" line="596"/> + <location filename="mainwindow.ui" line="625"/> <source>Categories</source> <translation type="unfinished"></translation> </message> @@ -1613,61 +1613,68 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="mainwindow.ui" line="273"/> - <location filename="mainwindow.ui" line="859"/> + <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="879"/> - <location filename="mainwindow.cpp" line="4057"/> + <location filename="mainwindow.ui" line="911"/> + <location filename="mainwindow.cpp" line="4372"/> <source>Create Backup</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="403"/> + <location filename="mainwindow.ui" line="301"/> + <location filename="mainwindow.ui" line="925"/> + <source>Active:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.ui" line="314"/> + <source>This provides statistics about the mod list. The total number of active mod 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="432"/> <source>List of available mods.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="406"/> + <location filename="mainwindow.ui" line="435"/> <source>This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="494"/> + <location filename="mainwindow.ui" line="523"/> + <location filename="mainwindow.ui" line="644"/> + <location filename="mainwindow.ui" line="1063"/> + <location filename="mainwindow.ui" line="1422"/> <source>Filter</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="551"/> + <location filename="mainwindow.ui" line="580"/> <source>Clear all Filters</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="591"/> + <location filename="mainwindow.ui" line="620"/> <source>No groups</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="601"/> + <location filename="mainwindow.ui" line="630"/> <source>Nexus IDs</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="615"/> - <location filename="mainwindow.ui" line="1002"/> - <location filename="mainwindow.ui" line="1361"/> - <source>Namefilter</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="mainwindow.ui" line="650"/> + <location filename="mainwindow.ui" line="679"/> <source>Pick a program to run.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="653"/> + <location filename="mainwindow.ui" line="682"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -1677,12 +1684,12 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="701"/> + <location filename="mainwindow.ui" line="730"/> <source>Run program</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="704"/> + <location filename="mainwindow.ui" line="733"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -1691,17 +1698,17 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="714"/> + <location filename="mainwindow.ui" line="743"/> <source>Run</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="755"/> + <location filename="mainwindow.ui" line="784"/> <source>Create a shortcut in your start menu or on the desktop to the specified program</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="758"/> + <location filename="mainwindow.ui" line="787"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -1710,27 +1717,32 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="765"/> + <location filename="mainwindow.ui" line="794"/> <source>Shortcut</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="815"/> + <location filename="mainwindow.ui" line="844"/> <source>Plugins</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="835"/> + <location filename="mainwindow.ui" line="867"/> <source>Sort</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="941"/> + <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="1002"/> <source>List of available esp/esm files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="944"/> + <location filename="mainwindow.ui" line="1005"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -1739,27 +1751,27 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1015"/> + <location filename="mainwindow.ui" line="1076"/> <source>Archives</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1035"/> + <location filename="mainwindow.ui" line="1096"/> <source><html><head/><body><p>BSAs / BA2s are bundles of game assets (textures, scripts, etc.). By default, the engine loads these bundles in a separate step from loose files. <p>Their load order is specified by the priority of the corresponding plugin (right pane, plugins tab).</p><p>If there is a matching plugin, the game will load them no matter what.</p></body></html></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1038"/> + <location filename="mainwindow.ui" line="1099"/> <source><html><head/><body><p>Currently detected archives. (<a href="#"><span style=" text-decoration: underline; color:#0000ff;">What is an archive?</span></a>)</p></body></html></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1053"/> + <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="1056"/> + <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 "compete" 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! @@ -1767,236 +1779,236 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1090"/> + <location filename="mainwindow.ui" line="1151"/> <source>Data</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1108"/> + <location filename="mainwindow.ui" line="1169"/> <source>refresh data-directory overview</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1111"/> + <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="1114"/> - <location filename="mainwindow.ui" line="1257"/> - <location filename="mainwindow.cpp" line="3932"/> - <location filename="mainwindow.cpp" line="4856"/> + <location filename="mainwindow.ui" line="1175"/> + <location filename="mainwindow.ui" line="1318"/> + <location filename="mainwindow.cpp" line="4247"/> + <location filename="mainwindow.cpp" line="5176"/> <source>Refresh</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1130"/> + <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="1143"/> + <location filename="mainwindow.ui" line="1204"/> <source>File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1148"/> + <location filename="mainwindow.ui" line="1209"/> <source>Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1160"/> - <location filename="mainwindow.ui" line="1163"/> + <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="1166"/> + <location filename="mainwindow.ui" line="1227"/> <source>Show only conflicts</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1173"/> - <location filename="mainwindow.ui" line="1179"/> + <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="1182"/> + <location filename="mainwindow.ui" line="1243"/> <source>Show files from Archives</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1192"/> + <location filename="mainwindow.ui" line="1253"/> <source>Saves</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1216"/> + <location filename="mainwindow.ui" line="1277"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all save games for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1236"/> + <location filename="mainwindow.ui" line="1297"/> <source>Downloads</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1254"/> + <location filename="mainwindow.ui" line="1315"/> <source>Refresh downloads view</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1285"/> + <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="1341"/> + <location filename="mainwindow.ui" line="1402"/> <source>Show Hidden</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1406"/> + <location filename="mainwindow.ui" line="1467"/> <source>Tool Bar</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1449"/> + <location filename="mainwindow.ui" line="1510"/> <source>Install Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1452"/> + <location filename="mainwindow.ui" line="1513"/> <source>Install &Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1455"/> + <location filename="mainwindow.ui" line="1516"/> <source>Install a new mod from an archive</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1458"/> + <location filename="mainwindow.ui" line="1519"/> <source>Ctrl+M</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1467"/> + <location filename="mainwindow.ui" line="1528"/> <source>Profiles</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1470"/> + <location filename="mainwindow.ui" line="1531"/> <source>&Profiles</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1473"/> + <location filename="mainwindow.ui" line="1534"/> <source>Configure Profiles</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1476"/> + <location filename="mainwindow.ui" line="1537"/> <source>Ctrl+P</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1485"/> + <location filename="mainwindow.ui" line="1546"/> <source>Executables</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1488"/> + <location filename="mainwindow.ui" line="1549"/> <source>&Executables</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1491"/> + <location filename="mainwindow.ui" line="1552"/> <source>Configure the executables that can be started through Mod Organizer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1494"/> + <location filename="mainwindow.ui" line="1555"/> <source>Ctrl+E</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1503"/> - <location filename="mainwindow.ui" line="1509"/> + <location filename="mainwindow.ui" line="1564"/> + <location filename="mainwindow.ui" line="1570"/> <source>Tools</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1506"/> + <location filename="mainwindow.ui" line="1567"/> <source>&Tools</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1512"/> + <location filename="mainwindow.ui" line="1573"/> <source>Ctrl+I</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1521"/> + <location filename="mainwindow.ui" line="1582"/> <source>Settings</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1524"/> + <location filename="mainwindow.ui" line="1585"/> <source>&Settings</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1527"/> + <location filename="mainwindow.ui" line="1588"/> <source>Configure settings and workarounds</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1530"/> + <location filename="mainwindow.ui" line="1591"/> <source>Ctrl+S</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1539"/> + <location filename="mainwindow.ui" line="1600"/> <source>Nexus</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1542"/> + <location filename="mainwindow.ui" line="1603"/> <source>Search nexus network for more mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1545"/> + <location filename="mainwindow.ui" line="1606"/> <source>Ctrl+N</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1557"/> - <location filename="mainwindow.cpp" line="4796"/> + <location filename="mainwindow.ui" line="1618"/> + <location filename="mainwindow.cpp" line="5107"/> <source>Update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1560"/> + <location filename="mainwindow.ui" line="1621"/> <source>Mod Organizer is up-to-date</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1572"/> - <location filename="mainwindow.cpp" line="659"/> + <location filename="mainwindow.ui" line="1633"/> + <location filename="mainwindow.cpp" line="672"/> <source>No Problems</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1575"/> + <location filename="mainwindow.ui" line="1636"/> <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! @@ -2004,830 +2016,887 @@ Right now this has very limited functionality</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1587"/> - <location filename="mainwindow.ui" line="1590"/> + <location filename="mainwindow.ui" line="1648"/> + <location filename="mainwindow.ui" line="1651"/> <source>Help</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1593"/> + <location filename="mainwindow.ui" line="1654"/> <source>Ctrl+H</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1602"/> + <location filename="mainwindow.ui" line="1663"/> <source>Endorse MO</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1605"/> - <location filename="mainwindow.cpp" line="4879"/> + <location filename="mainwindow.ui" line="1666"/> + <location filename="mainwindow.cpp" line="5199"/> <source>Endorse Mod Organizer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1610"/> + <location filename="mainwindow.ui" line="1671"/> <source>Copy Log to Clipboard</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1619"/> + <location filename="mainwindow.ui" line="1680"/> <source>Change Game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.ui" line="1622"/> + <location filename="mainwindow.ui" line="1683"/> <source>Open the Instance selection dialog to manage a different Game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="330"/> + <location filename="mainwindow.cpp" line="334"/> <source>Toolbar</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="331"/> + <location filename="mainwindow.cpp" line="335"/> <source>Desktop</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="332"/> + <location filename="mainwindow.cpp" line="336"/> <source>Start Menu</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="357"/> + <location filename="mainwindow.cpp" line="361"/> <source>There is no supported sort mechanism for this game. You will probably have to use a third-party tool.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="647"/> + <location filename="mainwindow.cpp" line="492"/> + <source>Crash on exit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="493"/> + <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="660"/> <source>Problems</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="648"/> + <location filename="mainwindow.cpp" line="661"/> <source>There are potential problems with your setup</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="660"/> + <location filename="mainwindow.cpp" line="673"/> <source>Everything seems to be in order</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="722"/> + <location filename="mainwindow.cpp" line="739"/> + <source>Won't Endorse</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="754"/> <source>Help on UI</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="726"/> + <location filename="mainwindow.cpp" line="758"/> <source>Documentation Wiki</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="730"/> + <location filename="mainwindow.cpp" line="762"/> <source>Report Issue</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="734"/> + <location filename="mainwindow.cpp" line="766"/> <source>Tutorials</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="773"/> + <location filename="mainwindow.cpp" line="805"/> <source>About</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="774"/> + <location filename="mainwindow.cpp" line="806"/> <source>About Qt</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="826"/> + <location filename="mainwindow.cpp" line="865"/> <source>Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="827"/> + <location filename="mainwindow.cpp" line="866"/> <source>Please enter a name for the new profile</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="835"/> + <location filename="mainwindow.cpp" line="874"/> <source>failed to create profile: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="879"/> + <location filename="mainwindow.cpp" line="918"/> <source>Show tutorial?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="880"/> + <location filename="mainwindow.cpp" line="919"/> <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 "Help"-menu.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="916"/> + <location filename="mainwindow.cpp" line="955"/> <source>Downloads in progress</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="917"/> + <location filename="mainwindow.cpp" line="956"/> <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="1034"/> + <location filename="mainwindow.cpp" line="1073"/> <source>Plugin "%1" failed: %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1036"/> + <location filename="mainwindow.cpp" line="1075"/> <source>Plugin "%1" failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1114"/> + <location filename="mainwindow.cpp" line="1153"/> <source>Browse Mod Page</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1312"/> + <location filename="mainwindow.cpp" line="1355"/> <source>Also in: <br></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1323"/> + <location filename="mainwindow.cpp" line="1366"/> <source>No conflict</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1406"/> + <location filename="mainwindow.cpp" line="1451"/> <source><Edit...></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1681"/> + <location filename="mainwindow.cpp" line="1729"/> <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="1743"/> + <location filename="mainwindow.cpp" line="1791"/> <source>Activating Network Proxy</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1804"/> + <location filename="mainwindow.cpp" line="1852"/> <source>Notice: Your current MO version (%1) is lower than the previous version (%2).<br>The GUI may not downgrade gracefully, so you may experience oddities.<br>However, there should be no serious issues.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1908"/> + <location filename="mainwindow.cpp" line="1956"/> <source>Choose Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1909"/> + <location filename="mainwindow.cpp" line="1957"/> <source>Mod Archive</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2084"/> + <location filename="mainwindow.cpp" line="2132"/> <source>Start Tutorial?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2085"/> + <location filename="mainwindow.cpp" line="2133"/> <source>You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2253"/> + <location filename="mainwindow.cpp" line="2306"/> <source>failed to spawn notepad.exe: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2293"/> + <location filename="mainwindow.cpp" line="2346"/> <source>failed to change origin name: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2317"/> + <location filename="mainwindow.cpp" line="2370"/> <source>failed to move "%1" from mod "%2" to "%3": %4</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2341"/> + <location filename="mainwindow.cpp" line="2394"/> <source><Contains %1></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2376"/> + <location filename="mainwindow.cpp" line="2429"/> <source><Checked></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2377"/> + <location filename="mainwindow.cpp" line="2430"/> <source><Unchecked></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2378"/> + <location filename="mainwindow.cpp" line="2431"/> <source><Update></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2379"/> + <location filename="mainwindow.cpp" line="2432"/> <source><Mod Backup></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2380"/> + <location filename="mainwindow.cpp" line="2433"/> <source><Managed by MO></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2381"/> + <location filename="mainwindow.cpp" line="2434"/> <source><Managed outside MO></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2382"/> + <location filename="mainwindow.cpp" line="2435"/> <source><No category></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2383"/> + <location filename="mainwindow.cpp" line="2436"/> <source><Conflicted></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2384"/> + <location filename="mainwindow.cpp" line="2437"/> <source><Not Endorsed></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2430"/> + <location filename="mainwindow.cpp" line="2483"/> <source>failed to rename mod: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2443"/> + <location filename="mainwindow.cpp" line="2496"/> <source>Overwrite?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2444"/> + <location filename="mainwindow.cpp" line="2497"/> <source>This will replace the existing mod "%1". Continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2447"/> + <location filename="mainwindow.cpp" line="2500"/> <source>failed to remove mod "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2451"/> - <location filename="mainwindow.cpp" line="4628"/> - <location filename="mainwindow.cpp" line="4652"/> + <location filename="mainwindow.cpp" line="2504"/> + <location filename="mainwindow.cpp" line="4939"/> + <location filename="mainwindow.cpp" line="4963"/> <source>failed to rename "%1" to "%2"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2515"/> - <location filename="mainwindow.cpp" line="3653"/> - <location filename="mainwindow.cpp" line="3661"/> - <location filename="mainwindow.cpp" line="4182"/> + <location filename="mainwindow.cpp" line="2575"/> + <location filename="mainwindow.cpp" line="3951"/> + <location filename="mainwindow.cpp" line="3959"/> + <location filename="mainwindow.cpp" line="4495"/> <source>Confirm</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2516"/> + <location filename="mainwindow.cpp" line="2576"/> <source>Remove the following mods?<br><ul>%1</ul></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2529"/> + <location filename="mainwindow.cpp" line="2589"/> <source>failed to remove mod: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2561"/> - <location filename="mainwindow.cpp" line="2564"/> - <location filename="mainwindow.cpp" line="2574"/> + <location filename="mainwindow.cpp" line="2621"/> + <location filename="mainwindow.cpp" line="2624"/> + <location filename="mainwindow.cpp" line="2634"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2561"/> + <location filename="mainwindow.cpp" line="2621"/> <source>Installation file no longer exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2565"/> + <location filename="mainwindow.cpp" line="2625"/> <source>Mods installed with old versions of MO can't be reinstalled in this way.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2575"/> + <location filename="mainwindow.cpp" line="2635"/> <source>Failed to create backup.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2592"/> + <location filename="mainwindow.cpp" line="2652"/> <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="2608"/> - <location filename="mainwindow.cpp" line="2635"/> + <location filename="mainwindow.cpp" line="2668"/> + <location filename="mainwindow.cpp" line="2694"/> + <location filename="mainwindow.cpp" line="2728"/> + <location filename="mainwindow.cpp" line="2754"/> <source>You need to be logged in with Nexus to endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2691"/> + <location filename="mainwindow.cpp" line="2679"/> + <location filename="mainwindow.cpp" line="2687"/> + <source>Endorsing multiple mods will take a while. Please wait...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="2739"/> + <location filename="mainwindow.cpp" line="2747"/> + <source>Unendorsing multiple mods will take a while. Please wait...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="2815"/> <source>Failed to display overwrite dialog: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2879"/> + <location filename="mainwindow.cpp" line="3002"/> + <source>Opening Nexus Links</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="3003"/> + <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="3023"/> <source>Nexus ID for this Mod is unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2889"/> + <location filename="mainwindow.cpp" line="3034"/> <source>Web page for this mod is unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3016"/> - <location filename="mainwindow.cpp" line="3153"/> - <location filename="mainwindow.cpp" line="3994"/> + <location filename="mainwindow.cpp" line="3216"/> + <source><table cellspacing="5"><tr><th>Type</th><th>All</th><th>Visible</th><tr><td>Enabled mods:&emsp;</td><td align=right>%1 / %2</td><td align=right>%3 / %4</td></tr><tr><td>Unmanaged/DLCs:&emsp;</td><td align=right>%5</td><td align=right>%6</td></tr><tr><td>Mod backups:&emsp;</td><td align=right>%7</td><td align=right>%8</td></tr><tr><td>Separators:&emsp;</td><td align=right>%9</td><td align=right>%10</td></tr></table></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="3271"/> + <source><table cellspacing="4"><tr><th>Type</th><th>Active</th><th>Total</th></tr><tr><td>Active plugins:</td><td align=right>%1</td><td align=right>%2</td></tr><tr><td>Active ESMs:</td><td align=right>%3</td><td align=right>%4</td></tr><tr><td>Active ESPs:</td><td align=right>%7</td><td align=right>%8</td></tr><tr><td>Active ESMs+ESPs:</td><td align=right>%9</td><td align=right>%10</td></tr><tr><td>Active ESLs:</td><td align=right>%5</td><td align=right>%6</td></tr></table></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="3303"/> + <location filename="mainwindow.cpp" line="3440"/> + <location filename="mainwindow.cpp" line="4309"/> <source>Create Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3017"/> + <location filename="mainwindow.cpp" line="3304"/> <source>This will create an empty mod. Please enter a name:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3026"/> - <location filename="mainwindow.cpp" line="3163"/> + <location filename="mainwindow.cpp" line="3313"/> + <location filename="mainwindow.cpp" line="3450"/> <source>A mod with this name already exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3054"/> + <location filename="mainwindow.cpp" line="3341"/> <source>Create Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3055"/> + <location filename="mainwindow.cpp" line="3342"/> <source>This will create a new separator. Please enter a name:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3062"/> + <location filename="mainwindow.cpp" line="3349"/> <source>A separator with this name already exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3154"/> + <location filename="mainwindow.cpp" line="3441"/> <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="3195"/> - <location filename="mainwindow.cpp" line="5196"/> + <location filename="mainwindow.cpp" line="3482"/> + <location filename="mainwindow.cpp" line="5519"/> <source>Are you sure?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3196"/> + <location filename="mainwindow.cpp" line="3483"/> <source>About to recursively delete: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3547"/> + <location filename="mainwindow.cpp" line="3845"/> <source>Not logged in, endorsement information will be wrong</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3555"/> + <location filename="mainwindow.cpp" line="3853"/> <source>Continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3556"/> + <location filename="mainwindow.cpp" line="3854"/> <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="3576"/> - <location filename="mainwindow.cpp" line="4764"/> + <location filename="mainwindow.cpp" line="3874"/> + <location filename="mainwindow.cpp" line="5075"/> <source>Sorry</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3577"/> + <location filename="mainwindow.cpp" line="3875"/> <source>I don't know a versioning scheme where %1 is newer than %2.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3653"/> + <location filename="mainwindow.cpp" line="3951"/> <source>Really enable all visible mods?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3661"/> + <location filename="mainwindow.cpp" line="3959"/> <source>Really disable all visible mods?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3726"/> + <location filename="mainwindow.cpp" line="4039"/> <source>Export to csv</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3729"/> + <location filename="mainwindow.cpp" line="4042"/> <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="3732"/> + <location filename="mainwindow.cpp" line="4045"/> <source>Select what mods you want export:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3733"/> + <location filename="mainwindow.cpp" line="4046"/> <source>All installed mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3734"/> + <location filename="mainwindow.cpp" line="4047"/> <source>Only active (checked) mods from your current profile</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3735"/> + <location filename="mainwindow.cpp" line="4048"/> <source>All currently visible mods in the mod list</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3756"/> + <location filename="mainwindow.cpp" line="4069"/> <source>Choose what Columns to export:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3759"/> + <location filename="mainwindow.cpp" line="4072"/> <source>Mod_Priority</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3761"/> + <location filename="mainwindow.cpp" line="4074"/> <source>Mod_Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3763"/> + <location filename="mainwindow.cpp" line="4076"/> <source>Mod_Status</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3764"/> + <location filename="mainwindow.cpp" line="4077"/> <source>Primary_Category</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3765"/> + <location filename="mainwindow.cpp" line="4078"/> <source>Nexus_ID</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3766"/> + <location filename="mainwindow.cpp" line="4079"/> <source>Mod_Nexus_URL</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3767"/> + <location filename="mainwindow.cpp" line="4080"/> <source>Mod_Version</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3768"/> + <location filename="mainwindow.cpp" line="4081"/> <source>Install_Date</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3769"/> + <location filename="mainwindow.cpp" line="4082"/> <source>Download_File_Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3871"/> + <location filename="mainwindow.cpp" line="4184"/> <source>export failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3890"/> + <location filename="mainwindow.cpp" line="4203"/> <source>Open Game folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3892"/> + <location filename="mainwindow.cpp" line="4205"/> <source>Open MyGames folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3896"/> + <location filename="mainwindow.cpp" line="4207"/> + <source>Open INIs folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="mainwindow.cpp" line="4211"/> <source>Open Instance folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3898"/> + <location filename="mainwindow.cpp" line="4213"/> <source>Open Mods folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3900"/> + <location filename="mainwindow.cpp" line="4215"/> <source>Open Profile folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3902"/> + <location filename="mainwindow.cpp" line="4217"/> <source>Open Downloads folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3906"/> + <location filename="mainwindow.cpp" line="4221"/> <source>Open MO2 Install folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3908"/> + <location filename="mainwindow.cpp" line="4223"/> <source>Open MO2 Plugins folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3910"/> + <location filename="mainwindow.cpp" line="4225"/> <source>Open MO2 Logs folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3919"/> + <location filename="mainwindow.cpp" line="4234"/> <source>Install Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3921"/> + <location filename="mainwindow.cpp" line="4236"/> <source>Create empty mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3923"/> + <location filename="mainwindow.cpp" line="4238"/> <source>Create Separator</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3927"/> + <location filename="mainwindow.cpp" line="4242"/> <source>Enable all visible</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3928"/> + <location filename="mainwindow.cpp" line="4243"/> <source>Disable all visible</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3930"/> + <location filename="mainwindow.cpp" line="4245"/> <source>Check all for update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3934"/> + <location filename="mainwindow.cpp" line="4249"/> <source>Export to csv...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3946"/> - <location filename="mainwindow.cpp" line="3962"/> + <location filename="mainwindow.cpp" line="4261"/> + <location filename="mainwindow.cpp" line="4277"/> <source>Send to</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3947"/> - <location filename="mainwindow.cpp" line="3963"/> + <location filename="mainwindow.cpp" line="4262"/> + <location filename="mainwindow.cpp" line="4278"/> <source>Top</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3948"/> - <location filename="mainwindow.cpp" line="3964"/> + <location filename="mainwindow.cpp" line="4263"/> + <location filename="mainwindow.cpp" line="4279"/> <source>Bottom</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3949"/> - <location filename="mainwindow.cpp" line="3965"/> + <location filename="mainwindow.cpp" line="4264"/> + <location filename="mainwindow.cpp" line="4280"/> <source>Priority...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3950"/> + <location filename="mainwindow.cpp" line="4265"/> <source>Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3986"/> + <location filename="mainwindow.cpp" line="4301"/> <source>All Mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3993"/> + <location filename="mainwindow.cpp" line="4308"/> <source>Sync to Mods...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3995"/> + <location filename="mainwindow.cpp" line="4310"/> <source>Clear Overwrite...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3997"/> - <location filename="mainwindow.cpp" line="4098"/> + <location filename="mainwindow.cpp" line="4312"/> + <location filename="mainwindow.cpp" line="4413"/> <source>Open in Explorer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3999"/> + <location filename="mainwindow.cpp" line="4314"/> <source>Restore Backup</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4000"/> + <location filename="mainwindow.cpp" line="4315"/> <source>Remove Backup...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4003"/> - <location filename="mainwindow.cpp" line="4022"/> + <location filename="mainwindow.cpp" line="4318"/> + <location filename="mainwindow.cpp" line="4337"/> <source>Change Categories</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4007"/> - <location filename="mainwindow.cpp" line="4027"/> + <location filename="mainwindow.cpp" line="4322"/> + <location filename="mainwindow.cpp" line="4342"/> <source>Primary Category</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4011"/> + <location filename="mainwindow.cpp" line="4326"/> <source>Rename Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4012"/> + <location filename="mainwindow.cpp" line="4327"/> <source>Remove Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4015"/> + <location filename="mainwindow.cpp" line="4330"/> <source>Select Color...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4017"/> + <location filename="mainwindow.cpp" line="4332"/> <source>Reset Color</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4034"/> + <location filename="mainwindow.cpp" line="4349"/> <source>Change versioning scheme</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4039"/> + <location filename="mainwindow.cpp" line="4353"/> <source>Un-ignore update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4041"/> + <location filename="mainwindow.cpp" line="4357"/> <source>Ignore update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4047"/> - <location filename="mainwindow.cpp" line="5307"/> + <location filename="mainwindow.cpp" line="4362"/> + <location filename="mainwindow.cpp" line="5630"/> <source>Enable selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4048"/> - <location filename="mainwindow.cpp" line="5308"/> + <location filename="mainwindow.cpp" line="4363"/> + <location filename="mainwindow.cpp" line="5631"/> <source>Disable selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4054"/> + <location filename="mainwindow.cpp" line="4369"/> <source>Rename Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4055"/> + <location filename="mainwindow.cpp" line="4370"/> <source>Reinstall Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4056"/> + <location filename="mainwindow.cpp" line="4371"/> <source>Remove Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4064"/> + <location filename="mainwindow.cpp" line="4379"/> <source>Un-Endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4067"/> - <location filename="mainwindow.cpp" line="4071"/> + <location filename="mainwindow.cpp" line="735"/> + <location filename="mainwindow.cpp" line="4382"/> + <location filename="mainwindow.cpp" line="4386"/> <source>Endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4068"/> + <location filename="mainwindow.cpp" line="4383"/> <source>Won't endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4074"/> + <location filename="mainwindow.cpp" line="4389"/> <source>Endorsement state unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4085"/> + <location filename="mainwindow.cpp" line="4400"/> <source>Ignore missing data</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4089"/> + <location filename="mainwindow.cpp" line="4404"/> <source>Mark as converted/working</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4093"/> + <location filename="mainwindow.cpp" line="4408"/> <source>Visit on Nexus</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4095"/> + <location filename="mainwindow.cpp" line="4410"/> <source>Visit web page</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4102"/> + <location filename="mainwindow.cpp" line="4417"/> <source>Information...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4109"/> - <location filename="mainwindow.cpp" line="5355"/> + <location filename="mainwindow.cpp" line="4424"/> + <location filename="mainwindow.cpp" line="5678"/> <source>Exception: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4111"/> - <location filename="mainwindow.cpp" line="5357"/> + <location filename="mainwindow.cpp" line="4426"/> + <location filename="mainwindow.cpp" line="5680"/> <source>Unknown exception</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4142"/> + <location filename="mainwindow.cpp" line="4455"/> <source><All></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4144"/> + <location filename="mainwindow.cpp" line="4457"/> <source><Multiple></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4179"/> + <location filename="mainwindow.cpp" line="4492"/> <source>%1 more</source> <translation type="unfinished"></translation> </message> <message numerus="yes"> - <location filename="mainwindow.cpp" line="4183"/> + <location filename="mainwindow.cpp" line="4496"/> <source>Are you sure you want to remove the following %n save(s)?<br><ul>%1</ul><br>Removed saves will be sent to the Recycle Bin.</source> <translation type="unfinished"> <numerusform></numerusform> @@ -2835,12 +2904,12 @@ You can also use online editors and converters instead.</source> </translation> </message> <message> - <location filename="mainwindow.cpp" line="4228"/> + <location filename="mainwindow.cpp" line="4541"/> <source>Enable Mods...</source> <translation type="unfinished"></translation> </message> <message numerus="yes"> - <location filename="mainwindow.cpp" line="4243"/> + <location filename="mainwindow.cpp" line="4556"/> <source>Delete %n save(s)</source> <translation type="unfinished"> <numerusform></numerusform> @@ -2848,22 +2917,22 @@ You can also use online editors and converters instead.</source> </translation> </message> <message> - <location filename="mainwindow.cpp" line="4285"/> + <location filename="mainwindow.cpp" line="4598"/> <source>failed to remove %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4307"/> + <location filename="mainwindow.cpp" line="4620"/> <source>failed to create %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4337"/> + <location filename="mainwindow.cpp" line="4650"/> <source>Restarting MO</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4338"/> + <location filename="mainwindow.cpp" line="4651"/> <source>Changing the managed game directory requires restarting MO. Any pending downloads will be paused. @@ -2871,335 +2940,335 @@ Click OK to restart MO now.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4358"/> + <location filename="mainwindow.cpp" line="4671"/> <source>Can't change download directory while downloads are in progress!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4500"/> + <location filename="mainwindow.cpp" line="4811"/> <source>failed to write to file %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4506"/> + <location filename="mainwindow.cpp" line="4817"/> <source>%1 written</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4547"/> + <location filename="mainwindow.cpp" line="4858"/> <source>Select binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4547"/> + <location filename="mainwindow.cpp" line="4858"/> <source>Binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4573"/> + <location filename="mainwindow.cpp" line="4884"/> <source>Enter Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4574"/> + <location filename="mainwindow.cpp" line="4885"/> <source>Please enter a name for the executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4588"/> + <location filename="mainwindow.cpp" line="4899"/> <source>Not an executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4588"/> + <location filename="mainwindow.cpp" line="4899"/> <source>This is not a recognized executable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4613"/> - <location filename="mainwindow.cpp" line="4638"/> + <location filename="mainwindow.cpp" line="4924"/> + <location filename="mainwindow.cpp" line="4949"/> <source>Replace file?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4613"/> + <location filename="mainwindow.cpp" line="4924"/> <source>There already is a hidden version of this file. Replace it?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4616"/> - <location filename="mainwindow.cpp" line="4641"/> + <location filename="mainwindow.cpp" line="4927"/> + <location filename="mainwindow.cpp" line="4952"/> <source>File operation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4616"/> - <location filename="mainwindow.cpp" line="4641"/> + <location filename="mainwindow.cpp" line="4927"/> + <location filename="mainwindow.cpp" line="4952"/> <source>Failed to remove "%1". Maybe you lack the required file permissions?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4638"/> + <location filename="mainwindow.cpp" line="4949"/> <source>There already is a visible version of this file. Replace it?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4682"/> - <location filename="mainwindow.cpp" line="5968"/> + <location filename="mainwindow.cpp" line="4993"/> + <location filename="mainwindow.cpp" line="6292"/> <source>Set Priority</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4682"/> + <location filename="mainwindow.cpp" line="4993"/> <source>Set the priority of the selected plugins</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4731"/> + <location filename="mainwindow.cpp" line="5042"/> <source>file not found: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4744"/> + <location filename="mainwindow.cpp" line="5055"/> <source>failed to generate preview for %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4764"/> + <location filename="mainwindow.cpp" line="5075"/> <source>Sorry, can't preview anything. This function currently does not support extracting from bsas.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4798"/> + <location filename="mainwindow.cpp" line="5109"/> <source>Update available</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4836"/> + <location filename="mainwindow.cpp" line="5156"/> <source>Open/Execute</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4837"/> + <location filename="mainwindow.cpp" line="5157"/> <source>Add as Executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4841"/> + <location filename="mainwindow.cpp" line="5161"/> <source>Preview</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4847"/> + <location filename="mainwindow.cpp" line="5167"/> <source>Un-Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4849"/> + <location filename="mainwindow.cpp" line="5169"/> <source>Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4855"/> + <location filename="mainwindow.cpp" line="5175"/> <source>Write To File...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4880"/> + <location filename="mainwindow.cpp" line="5200"/> <source>Do you want to endorse Mod Organizer on %1 now?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5005"/> + <location filename="mainwindow.cpp" line="5328"/> <source>Thank you!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5005"/> + <location filename="mainwindow.cpp" line="5328"/> <source>Thank you for your endorsement!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5040"/> + <location filename="mainwindow.cpp" line="5363"/> <source>Request to Nexus failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5055"/> - <location filename="mainwindow.cpp" line="5117"/> + <location filename="mainwindow.cpp" line="5378"/> + <location filename="mainwindow.cpp" line="5440"/> <source>failed to read %1: %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5067"/> - <location filename="mainwindow.cpp" line="5545"/> + <location filename="mainwindow.cpp" line="5390"/> + <location filename="mainwindow.cpp" line="5868"/> <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5067"/> + <location filename="mainwindow.cpp" line="5390"/> <source>failed to extract %1 (errorcode %2)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5099"/> + <location filename="mainwindow.cpp" line="5422"/> <source>Extract BSA</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5128"/> + <location filename="mainwindow.cpp" line="5451"/> <source>This archive contains invalid hashes. Some files may be broken.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5174"/> + <location filename="mainwindow.cpp" line="5497"/> <source>Extract...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5197"/> + <location filename="mainwindow.cpp" line="5520"/> <source>This will restart MO, continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5244"/> + <location filename="mainwindow.cpp" line="5567"/> <source>Edit Categories...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5245"/> + <location filename="mainwindow.cpp" line="5568"/> <source>Deselect filter</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5296"/> + <location filename="mainwindow.cpp" line="5619"/> <source>Remove</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5312"/> + <location filename="mainwindow.cpp" line="5635"/> <source>Enable all</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5313"/> + <location filename="mainwindow.cpp" line="5636"/> <source>Disable all</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5334"/> + <location filename="mainwindow.cpp" line="5657"/> <source>Unlock load order</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5337"/> + <location filename="mainwindow.cpp" line="5660"/> <source>Lock load order</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5341"/> + <location filename="mainwindow.cpp" line="5664"/> <source>Open Origin in Explorer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5348"/> + <location filename="mainwindow.cpp" line="5671"/> <source>Open Origin Info...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5491"/> + <location filename="mainwindow.cpp" line="5814"/> <source>depends on missing "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5495"/> + <location filename="mainwindow.cpp" line="5818"/> <source>incompatible with "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5521"/> + <location filename="mainwindow.cpp" line="5844"/> <source>Please wait while LOOT is running</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5618"/> + <location filename="mainwindow.cpp" line="5941"/> <source>loot failed. Exit code was: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5640"/> + <location filename="mainwindow.cpp" line="5963"/> <source>failed to start loot</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5643"/> + <location filename="mainwindow.cpp" line="5966"/> <source>failed to run loot: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5647"/> + <location filename="mainwindow.cpp" line="5970"/> <source>Errors occured</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5694"/> + <location filename="mainwindow.cpp" line="6017"/> <source>Backup of load order created</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5704"/> + <location filename="mainwindow.cpp" line="6027"/> <source>Choose backup to restore</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5717"/> + <location filename="mainwindow.cpp" line="6040"/> <source>No Backups</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5717"/> + <location filename="mainwindow.cpp" line="6040"/> <source>There are no backups to restore</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5738"/> - <location filename="mainwindow.cpp" line="5760"/> + <location filename="mainwindow.cpp" line="6061"/> + <location filename="mainwindow.cpp" line="6083"/> <source>Restore failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5739"/> - <location filename="mainwindow.cpp" line="5761"/> + <location filename="mainwindow.cpp" line="6062"/> + <location filename="mainwindow.cpp" line="6084"/> <source>Failed to restore the backup. Errorcode: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5750"/> + <location filename="mainwindow.cpp" line="6073"/> <source>Backup of modlist created</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5856"/> + <location filename="mainwindow.cpp" line="6179"/> <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="5858"/> + <location filename="mainwindow.cpp" line="6181"/> <source>Overwrite</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5859"/> + <location filename="mainwindow.cpp" line="6182"/> <source>Rename new file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5860"/> + <location filename="mainwindow.cpp" line="6183"/> <source>Ignore file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5968"/> + <location filename="mainwindow.cpp" line="6292"/> <source>Set the priority of the selected mods</source> <translation type="unfinished"></translation> </message> @@ -3630,273 +3699,273 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="228"/> + <location filename="modinfodialog.cpp" line="230"/> <source>&Delete</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="229"/> + <location filename="modinfodialog.cpp" line="231"/> <source>&Rename</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="230"/> + <location filename="modinfodialog.cpp" line="232"/> <source>&Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="231"/> + <location filename="modinfodialog.cpp" line="233"/> <source>&Unhide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="232"/> + <location filename="modinfodialog.cpp" line="234"/> <source>&Open</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="233"/> + <location filename="modinfodialog.cpp" line="235"/> <source>&New Folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="498"/> - <location filename="modinfodialog.cpp" line="513"/> + <location filename="modinfodialog.cpp" line="500"/> + <location filename="modinfodialog.cpp" line="515"/> <source>Save changes?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="498"/> - <location filename="modinfodialog.cpp" line="513"/> + <location filename="modinfodialog.cpp" line="500"/> + <location filename="modinfodialog.cpp" line="515"/> <source>Save changes to "%1"?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="703"/> + <location filename="modinfodialog.cpp" line="705"/> <source>File Exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="703"/> + <location filename="modinfodialog.cpp" line="705"/> <source>A file with that name exists, please enter a new one</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="720"/> + <location filename="modinfodialog.cpp" line="722"/> <source>failed to move file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="745"/> + <location filename="modinfodialog.cpp" line="747"/> <source>failed to create directory "optional"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="789"/> - <location filename="modinfodialog.cpp" line="1513"/> + <location filename="modinfodialog.cpp" line="791"/> + <location filename="modinfodialog.cpp" line="1515"/> <source>Info requested, please wait</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="843"/> + <location filename="modinfodialog.cpp" line="845"/> <source>Main</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="844"/> + <location filename="modinfodialog.cpp" line="846"/> <source>Update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="845"/> + <location filename="modinfodialog.cpp" line="847"/> <source>Optional</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="846"/> + <location filename="modinfodialog.cpp" line="848"/> <source>Old</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="847"/> + <location filename="modinfodialog.cpp" line="849"/> <source>Misc</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="848"/> + <location filename="modinfodialog.cpp" line="850"/> <source>Unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="859"/> + <location filename="modinfodialog.cpp" line="861"/> <source>Current Version: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="863"/> + <location filename="modinfodialog.cpp" line="865"/> <source>No update available</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="906"/> + <location filename="modinfodialog.cpp" line="908"/> <source>(description incomplete, please visit nexus)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="921"/> + <location filename="modinfodialog.cpp" line="923"/> <source><a href="%1">Visit on Nexus</a></source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1014"/> + <location filename="modinfodialog.cpp" line="1016"/> <source>Failed to delete %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1030"/> - <location filename="modinfodialog.cpp" line="1036"/> - <location filename="modinfodialog.cpp" line="1055"/> - <location filename="modinfodialog.cpp" line="1060"/> + <location filename="modinfodialog.cpp" line="1032"/> + <location filename="modinfodialog.cpp" line="1038"/> + <location filename="modinfodialog.cpp" line="1057"/> + <location filename="modinfodialog.cpp" line="1062"/> <source>Confirm</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1030"/> - <location filename="modinfodialog.cpp" line="1055"/> + <location filename="modinfodialog.cpp" line="1032"/> + <location filename="modinfodialog.cpp" line="1057"/> <source>Are sure you want to delete "%1"?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1036"/> - <location filename="modinfodialog.cpp" line="1060"/> + <location filename="modinfodialog.cpp" line="1038"/> + <location filename="modinfodialog.cpp" line="1062"/> <source>Are sure you want to delete the selected files?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1134"/> - <location filename="modinfodialog.cpp" line="1140"/> + <location filename="modinfodialog.cpp" line="1136"/> + <location filename="modinfodialog.cpp" line="1142"/> <source>New Folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1146"/> + <location filename="modinfodialog.cpp" line="1148"/> <source>Failed to create "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1250"/> - <location filename="modinfodialog.cpp" line="1274"/> + <location filename="modinfodialog.cpp" line="1252"/> + <location filename="modinfodialog.cpp" line="1276"/> <source>Replace file?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1250"/> + <location filename="modinfodialog.cpp" line="1252"/> <source>There already is a hidden version of this file. Replace it?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1253"/> - <location filename="modinfodialog.cpp" line="1277"/> + <location filename="modinfodialog.cpp" line="1255"/> + <location filename="modinfodialog.cpp" line="1279"/> <source>File operation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1253"/> - <location filename="modinfodialog.cpp" line="1277"/> + <location filename="modinfodialog.cpp" line="1255"/> + <location filename="modinfodialog.cpp" line="1279"/> <source>Failed to remove "%1". Maybe you lack the required file permissions?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1264"/> - <location filename="modinfodialog.cpp" line="1287"/> + <location filename="modinfodialog.cpp" line="1266"/> + <location filename="modinfodialog.cpp" line="1289"/> <source>failed to rename %1 to %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1274"/> + <location filename="modinfodialog.cpp" line="1276"/> <source>There already is a visible version of this file. Replace it?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1350"/> + <location filename="modinfodialog.cpp" line="1352"/> <source>Select binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1350"/> + <location filename="modinfodialog.cpp" line="1352"/> <source>Binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1422"/> + <location filename="modinfodialog.cpp" line="1424"/> <source>file not found: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1435"/> + <location filename="modinfodialog.cpp" line="1437"/> <source>failed to generate preview for %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1451"/> + <location filename="modinfodialog.cpp" line="1453"/> <source>Sorry</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1451"/> + <location filename="modinfodialog.cpp" line="1453"/> <source>Sorry, can't preview anything. This function currently does not support extracting from bsas.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1465"/> + <location filename="modinfodialog.cpp" line="1467"/> <source>Un-Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1467"/> + <location filename="modinfodialog.cpp" line="1469"/> <source>Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1470"/> - <location filename="modinfodialog.cpp" line="1490"/> + <location filename="modinfodialog.cpp" line="1472"/> + <location filename="modinfodialog.cpp" line="1492"/> <source>Open/Execute</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1474"/> - <location filename="modinfodialog.cpp" line="1494"/> + <location filename="modinfodialog.cpp" line="1476"/> + <location filename="modinfodialog.cpp" line="1496"/> <source>Preview</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1542"/> + <location filename="modinfodialog.cpp" line="1544"/> <source>Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1542"/> + <location filename="modinfodialog.cpp" line="1544"/> <source>Please enter a name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1546"/> - <location filename="modinfodialog.cpp" line="1549"/> + <location filename="modinfodialog.cpp" line="1548"/> + <location filename="modinfodialog.cpp" line="1551"/> <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1546"/> + <location filename="modinfodialog.cpp" line="1548"/> <source>Invalid name. Must be a valid file name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1549"/> + <location filename="modinfodialog.cpp" line="1551"/> <source>A tweak by that name exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1563"/> + <location filename="modinfodialog.cpp" line="1565"/> <source>Create Tweak</source> <translation type="unfinished"></translation> </message> @@ -3935,18 +4004,18 @@ p, li { white-space: pre-wrap; } <context> <name>ModInfoRegular</name> <message> - <location filename="modinforegular.cpp" line="178"/> - <location filename="modinforegular.cpp" line="181"/> + <location filename="modinforegular.cpp" line="179"/> + <location filename="modinforegular.cpp" line="182"/> <source>failed to write %1/meta.ini: error %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinforegular.cpp" line="560"/> + <location filename="modinforegular.cpp" line="563"/> <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="564"/> + <location filename="modinforegular.cpp" line="567"/> <source>Categories: <br></source> <translation type="unfinished"></translation> </message> @@ -4053,192 +4122,203 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="modlist.cpp" line="162"/> - <source>Loose files overwrite another archive</source> + <source>Overwritten loose files</source> + <oldsource>Loose files overwrite another archive</oldsource> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="163"/> - <source>Overwritten loose files</source> + <source>Loose files Overwrites & Overwritten</source> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="164"/> - <source>Loose files Overwrites & Overwritten</source> + <source>Redundant</source> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="165"/> - <source>Redundant</source> + <source>Overwrites an archive with loose files</source> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="166"/> - <source>Overwrites an archive with loose files</source> + <source>Archive is overwritten by loose files</source> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="167"/> - <source>Archive is overwritten by loose files</source> + <source>Overwrites another archive file</source> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="168"/> - <source>Overwrites another archive file</source> + <source>Overwritten by another archive file</source> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="169"/> - <source>Overwritten by another archive file</source> + <source>Archive files overwrites & overwritten</source> <translation type="unfinished"></translation> </message> <message> <location filename="modlist.cpp" line="170"/> - <source>Archive files overwrites & overwritten</source> + <source>This mod targets a different game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="171"/> - <source>Alternate game source</source> + <location filename="modlist.cpp" line="262"/> + <source>Non-MO</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="263"/> - <source>Non-MO</source> + <location filename="modlist.cpp" line="294"/> + <source>invalid</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="295"/> - <source>invalid</source> + <location filename="modlist.cpp" line="456"/> + <source>installed version: "%1", newest version: "%2"</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="modlist.cpp" line="458"/> + <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 "upgrade".</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="modlist.cpp" line="466"/> + <source>Categories: <br></source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="498"/> + <location filename="modlist.cpp" line="497"/> <source>Invalid name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="503"/> + <location filename="modlist.cpp" line="502"/> <source>Name is already in use by another mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1062"/> + <location filename="modlist.cpp" line="1058"/> <source>drag&drop failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1141"/> + <location filename="modlist.cpp" line="1137"/> <source>Confirm</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1142"/> + <location filename="modlist.cpp" line="1138"/> <source>Are you sure you want to remove "%1"?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1207"/> + <location filename="modlist.cpp" line="1203"/> <source>Flags</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1208"/> + <location filename="modlist.cpp" line="1204"/> <source>Content</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1209"/> + <location filename="modlist.cpp" line="1205"/> <source>Mod Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1210"/> + <location filename="modlist.cpp" line="1206"/> <source>Version</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1211"/> + <location filename="modlist.cpp" line="1207"/> <source>Priority</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1212"/> + <location filename="modlist.cpp" line="1208"/> <source>Category</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1213"/> + <location filename="modlist.cpp" line="1209"/> <source>Source Game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1214"/> + <location filename="modlist.cpp" line="1210"/> <source>Nexus ID</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1215"/> + <location filename="modlist.cpp" line="1211"/> <source>Installation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1216"/> + <location filename="modlist.cpp" line="1212"/> <source>Notes</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1217"/> - <location filename="modlist.cpp" line="1253"/> + <location filename="modlist.cpp" line="1213"/> + <location filename="modlist.cpp" line="1249"/> <source>unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1225"/> + <location filename="modlist.cpp" line="1221"/> <source>Name of your mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1226"/> + <location filename="modlist.cpp" line="1222"/> <source>Version of the mod (if available)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1227"/> + <location filename="modlist.cpp" line="1223"/> <source>Installation priority of your mod. The higher, the more "important" it is and thus overwrites files from mods with lower priority.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1229"/> + <location filename="modlist.cpp" line="1225"/> <source>Category of the mod.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1230"/> + <location filename="modlist.cpp" line="1226"/> <source>The source game which was the origin of this mod.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1231"/> + <location filename="modlist.cpp" line="1227"/> <source>Id of the mod as used on Nexus.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1232"/> + <location filename="modlist.cpp" line="1228"/> <source>Emblemes to highlight things that might require attention.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1233"/> + <location filename="modlist.cpp" line="1229"/> <source>Depicts the content of the mod:<br><table cellspacing=7><tr><td><img src=":/MO/gui/content/plugin" width=32/></td><td>Game plugins (esp/esm/esl)</td></tr><tr><td><img src=":/MO/gui/content/interface" width=32/></td><td>Interface</td></tr><tr><td><img src=":/MO/gui/content/mesh" width=32/></td><td>Meshes</td></tr><tr><td><img src=":/MO/gui/content/bsa" width=32/></td><td>BSA</td></tr><tr><td><img src=":/MO/gui/content/texture" width=32/></td><td>Textures</td></tr><tr><td><img src=":/MO/gui/content/sound" width=32/></td><td>Sounds</td></tr><tr><td><img src=":/MO/gui/content/music" width=32/></td><td>Music</td></tr><tr><td><img src=":/MO/gui/content/string" width=32/></td><td>Strings</td></tr><tr><td><img src=":/MO/gui/content/script" width=32/></td><td>Scripts (Papyrus)</td></tr><tr><td><img src=":/MO/gui/content/skse" width=32/></td><td>Script Extender plugins</td></tr><tr><td><img src=":/MO/gui/content/skyproc" width=32/></td><td>SkyProc Patcher</td></tr><tr><td><img src=":/MO/gui/content/menu" width=32/></td><td>Mod Configuration Menu</td></tr><tr><td><img src=":/MO/gui/content/inifile" width=32/></td><td>INI files</td></tr><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table></source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1251"/> + <location filename="modlist.cpp" line="1247"/> <source>Time this mod was installed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modlist.cpp" line="1252"/> + <location filename="modlist.cpp" line="1248"/> <source>User notes about the mod</source> <translation type="unfinished"></translation> </message> @@ -4246,7 +4326,7 @@ p, li { white-space: pre-wrap; } <context> <name>ModListSortProxy</name> <message> - <location filename="modlistsortproxy.cpp" line="404"/> + <location filename="modlistsortproxy.cpp" line="466"/> <source>Drag&Drop is only supported when sorting by priority</source> <translation type="unfinished"></translation> </message> @@ -4365,182 +4445,182 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="695"/> - <location filename="organizercore.cpp" line="706"/> + <location filename="organizercore.cpp" line="699"/> + <location filename="organizercore.cpp" line="710"/> <source>Download started</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="709"/> + <location filename="organizercore.cpp" line="713"/> <source>Download failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="985"/> - <location filename="organizercore.cpp" line="1043"/> + <location filename="organizercore.cpp" line="989"/> + <location filename="organizercore.cpp" line="1047"/> <source>Installation successful</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="993"/> - <location filename="organizercore.cpp" line="1053"/> + <location filename="organizercore.cpp" line="997"/> + <location filename="organizercore.cpp" line="1057"/> <source>Configure Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="994"/> - <location filename="organizercore.cpp" line="1054"/> + <location filename="organizercore.cpp" line="998"/> + <location filename="organizercore.cpp" line="1058"/> <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="1006"/> - <location filename="organizercore.cpp" line="1064"/> + <location filename="organizercore.cpp" line="1010"/> + <location filename="organizercore.cpp" line="1068"/> <source>mod "%1" not found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1009"/> - <location filename="organizercore.cpp" line="1071"/> + <location filename="organizercore.cpp" line="1013"/> + <location filename="organizercore.cpp" line="1075"/> <source>Installation cancelled</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1010"/> - <location filename="organizercore.cpp" line="1072"/> + <location filename="organizercore.cpp" line="1014"/> + <location filename="organizercore.cpp" line="1076"/> <source>The mod was not installed completely.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1276"/> + <location filename="organizercore.cpp" line="1283"/> <source>Executable "%1" not found</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1304"/> + <location filename="organizercore.cpp" line="1311"/> <source>Start Steam?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1305"/> + <location filename="organizercore.cpp" line="1312"/> <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="1334"/> + <location filename="organizercore.cpp" line="1341"/> <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1342"/> + <location filename="organizercore.cpp" line="1349"/> <source>Windows Event Log Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1343"/> + <location filename="organizercore.cpp" line="1350"/> <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="1355"/> + <location filename="organizercore.cpp" line="1362"/> <source>Blacklisted Executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1356"/> + <location filename="organizercore.cpp" line="1363"/> <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="1445"/> + <location filename="organizercore.cpp" line="1452"/> <source>No profile set</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1734"/> + <location filename="organizercore.cpp" line="1741"/> <source>Failed to refresh list of esps: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1827"/> + <location filename="organizercore.cpp" line="1834"/> <source>Multiple esps/esls activated, please check that they don't conflict.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1902"/> + <location filename="organizercore.cpp" line="1909"/> <source>Download?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="1903"/> + <location filename="organizercore.cpp" line="1910"/> <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="2039"/> + <location filename="organizercore.cpp" line="2046"/> <source>failed to update mod list: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2046"/> - <location filename="organizercore.cpp" line="2063"/> + <location filename="organizercore.cpp" line="2053"/> + <location filename="organizercore.cpp" line="2070"/> <source>login successful</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2070"/> + <location filename="organizercore.cpp" line="2077"/> <source>Login failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2071"/> + <location filename="organizercore.cpp" line="2078"/> <source>Login failed, try again?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2080"/> + <location filename="organizercore.cpp" line="2087"/> <source>login failed: %1. Download will not be associated with an account</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2088"/> + <location filename="organizercore.cpp" line="2095"/> <source>login failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2098"/> + <location filename="organizercore.cpp" line="2105"/> <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="2151"/> + <location filename="organizercore.cpp" line="2158"/> <source>MO1 "Script Extender" load mechanism has left hook.dll in your game folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2154"/> - <location filename="organizercore.cpp" line="2170"/> + <location filename="organizercore.cpp" line="2161"/> + <location filename="organizercore.cpp" line="2177"/> <source>Description missing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2163"/> + <location filename="organizercore.cpp" line="2170"/> <source><a href="%1">hook.dll</a> 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 "Script Extender", 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="2197"/> + <location filename="organizercore.cpp" line="2204"/> <source>failed to save load order: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="organizercore.cpp" line="2269"/> + <location filename="organizercore.cpp" line="2276"/> <source>The designated write target "%1" is not enabled.</source> <translation type="unfinished"></translation> </message> @@ -4687,94 +4767,94 @@ Continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="221"/> + <location filename="pluginlist.cpp" line="224"/> <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="294"/> + <location filename="pluginlist.cpp" line="297"/> <source>esp not found: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="342"/> - <location filename="pluginlist.cpp" line="354"/> + <location filename="pluginlist.cpp" line="345"/> + <location filename="pluginlist.cpp" line="357"/> <source>Confirm</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="342"/> + <location filename="pluginlist.cpp" line="345"/> <source>Really enable all plugins?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="354"/> + <location filename="pluginlist.cpp" line="357"/> <source>Really disable all plugins?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="459"/> + <location filename="pluginlist.cpp" line="462"/> <source>The file containing locked plugin indices is broken</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="955"/> <location filename="pluginlist.cpp" line="959"/> + <location filename="pluginlist.cpp" line="963"/> <source><b>Origin</b>: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="956"/> + <location filename="pluginlist.cpp" line="960"/> <source><br><b><i>This plugin can't be disabled (enforced by the game).</i></b></source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="961"/> + <location filename="pluginlist.cpp" line="965"/> <source>Author</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="964"/> + <location filename="pluginlist.cpp" line="968"/> <source>Description</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="967"/> + <location filename="pluginlist.cpp" line="971"/> <source>Missing Masters</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="974"/> + <location filename="pluginlist.cpp" line="978"/> <source>Enabled Masters</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="977"/> + <location filename="pluginlist.cpp" line="981"/> <source>Loads Archives</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="978"/> + <location filename="pluginlist.cpp" line="982"/> <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="983"/> + <location filename="pluginlist.cpp" line="987"/> <source>Loads INI settings</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="984"/> + <location filename="pluginlist.cpp" line="988"/> <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="988"/> + <location filename="pluginlist.cpp" line="992"/> <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="1163"/> + <location filename="pluginlist.cpp" line="1167"/> <source>failed to restore load order for %1</source> <translation type="unfinished"></translation> </message> @@ -4782,7 +4862,7 @@ Continue?</source> <context> <name>PluginListSortProxy</name> <message> - <location filename="pluginlistsortproxy.cpp" line="120"/> + <location filename="pluginlistsortproxy.cpp" line="119"/> <source>Drag&Drop is only supported when sorting by priority or mod index</source> <translation type="unfinished"></translation> </message> @@ -4836,12 +4916,12 @@ p, li { white-space: pre-wrap; } <context> <name>Profile</name> <message> - <location filename="profile.cpp" line="78"/> + <location filename="profile.cpp" line="80"/> <source>invalid profile name %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="profile.cpp" line="82"/> + <location filename="profile.cpp" line="84"/> <source>failed to create %1</source> <translation type="unfinished"></translation> </message> @@ -4891,12 +4971,34 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="profile.cpp" line="753"/> - <source>Delete savegames?</source> + <source>Delete profile-specific save games?</source> + <oldsource>Delete savegames?</oldsource> <translation type="unfinished"></translation> </message> <message> <location filename="profile.cpp" line="754"/> - <source>Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames)</source> + <source>Do you want to delete the profile-specific save games? (If you select "No", the save games will show up again if you re-enable profile-specific save games)</source> + <oldsource>Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames)</oldsource> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="profile.cpp" line="784"/> + <source>Missing profile-specific game INI files!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="profile.cpp" line="785"/> + <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.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="profile.cpp" line="800"/> + <source>Delete profile-specific game INI files?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="profile.cpp" line="801"/> + <source>Do you want to delete the profile-specific game INI files? (If you select "No", the INI files will be used again if you re-enable profile-specific game INI files.)</source> <translation type="unfinished"></translation> </message> </context> @@ -4953,17 +5055,20 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="profilesdialog.ui" line="38"/> - <source><html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html></source> + <source><html><head/><body><p>If checked, save games are stored locally to this profile and will not appear when starting with a different profile.</p></body></html></source> + <oldsource><html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html></oldsource> <translation type="unfinished"></translation> </message> <message> <location filename="profilesdialog.ui" line="41"/> - <source>If checked, savegames are local to this profile and will not appear when starting with a different profile.</source> + <source>If checked, save games are local to this profile and will not appear when starting with a different profile.</source> + <oldsource>If checked, savegames are local to this profile and will not appear when starting with a different profile.</oldsource> <translation type="unfinished"></translation> </message> <message> <location filename="profilesdialog.ui" line="44"/> - <source>Use profile-specific Savegames</source> + <source>Use profile-specific Save Games</source> + <oldsource>Use profile-specific Savegames</oldsource> <translation type="unfinished"></translation> </message> <message> @@ -5114,7 +5219,7 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="profilesdialog.cpp" line="194"/> - <source>Are you sure you want to remove this profile (including local savegames if any)?</source> + <source>Are you sure you want to remove this profile (including profile-specific save games, if any)?</source> <translation type="unfinished"></translation> </message> <message> @@ -5149,12 +5254,31 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>QApplication</name> + <message> + <location filename="../../uibase/src/registry.cpp" line="36"/> + <source>INI file is read-only</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../uibase/src/registry.cpp" line="37"/> + <location filename="../../uibase/src/textviewer.cpp" line="133"/> + <source>Mod Organizer is attempting to write to "%1" which is currently set to read-only. Clear the read-only flag to allow the write?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../uibase/src/textviewer.cpp" line="132"/> + <source>File is read-only</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QObject</name> <message> <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="733"/> + <location filename="organizercore.cpp" line="737"/> <source>Error</source> <translation type="unfinished"></translation> </message> @@ -5254,12 +5378,13 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="helper.cpp" line="55"/> + <location filename="helper.cpp" line="56"/> + <location filename="helper.cpp" line="65"/> <source>helper failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="helper.cpp" line="71"/> + <location filename="helper.cpp" line="81"/> <source>failed to determine account name</source> <translation type="unfinished"></translation> </message> @@ -5394,7 +5519,7 @@ If the folder was still in use, restart MO and try again.</source> </message> <message> <location filename="instancemanager.cpp" line="267"/> - <location filename="profile.cpp" line="66"/> + <location filename="profile.cpp" line="68"/> <source>failed to create %1</source> <translation type="unfinished"></translation> </message> @@ -5474,7 +5599,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="734"/> + <location filename="organizercore.cpp" line="738"/> <source>Failed to create "%1". Your user account probably lacks permission.</source> <translation type="unfinished"></translation> </message> @@ -5516,7 +5641,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="1101"/> + <location filename="settings.cpp" line="1109"/> <source>Mod Organizer</source> <translation type="unfinished"></translation> </message> @@ -5531,18 +5656,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="892"/> + <location filename="mainwindow.cpp" line="931"/> <source>Please use "Help" from the toolbar to get usage instructions to all elements</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1370"/> - <location filename="mainwindow.cpp" line="4457"/> + <location filename="mainwindow.cpp" line="1415"/> + <location filename="mainwindow.cpp" line="4768"/> <source><Manage...></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1382"/> + <location filename="mainwindow.cpp" line="1427"/> <source>failed to parse profile %1: %2</source> <translation type="unfinished"></translation> </message> @@ -5578,12 +5703,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="535"/> + <location filename="pluginlist.cpp" line="538"/> <source>failed to access %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="pluginlist.cpp" line="549"/> + <location filename="pluginlist.cpp" line="552"/> <source>failed to set file time %1</source> <translation type="unfinished"></translation> </message> @@ -5593,37 +5718,39 @@ If the folder was still in use, restart MO and try again.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settings.cpp" line="1108"/> + <location filename="settings.cpp" line="1116"/> <source>Script Extender</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settings.cpp" line="1115"/> + <location filename="settings.cpp" line="1123"/> <source>Proxy DLL</source> <translation type="unfinished"></translation> </message> <message> - <location filename="spawn.cpp" line="146"/> + <location filename="spawn.cpp" line="147"/> <source>failed to spawn "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="spawn.cpp" line="153"/> + <location filename="spawn.cpp" line="152"/> <source>Elevation required</source> <translation type="unfinished"></translation> </message> <message> - <location filename="spawn.cpp" line="154"/> + <location filename="spawn.cpp" line="153"/> <source>This process requires elevation to run. This is a potential security risk so I highly advice you to investigate if "%1" can be installed to work without elevation. -Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe to make changes to the system)</source> +Restart Mod Organizer as an elevated process? +You will be asked if you want to allow helper.exe to make changes to the system. You will need to relaunch the process above manually.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="spawn.cpp" line="169"/> + <location filename="spawn.cpp" line="164"/> + <location filename="spawn.cpp" line="178"/> <source>failed to spawn "%1": %2</source> <translation type="unfinished"></translation> </message> @@ -5812,28 +5939,28 @@ Select Show Details option to see the full change-log.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settings.cpp" line="500"/> - <location filename="settings.cpp" line="519"/> + <location filename="settings.cpp" line="505"/> + <location filename="settings.cpp" line="524"/> <source>attempt to store setting for unknown plugin "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settings.cpp" line="882"/> + <location filename="settings.cpp" line="887"/> <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settings.cpp" line="883"/> + <location filename="settings.cpp" line="888"/> <source>Failed to create "%1", you may not have the necessary permission. path remains unchanged.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settings.cpp" line="1154"/> + <location filename="settings.cpp" line="1162"/> <source>Restart Mod Organizer?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settings.cpp" line="1155"/> + <location filename="settings.cpp" line="1163"/> <source>In order to reset the window geometries, MO must be restarted. Restart it now?</source> <translation type="unfinished"></translation> @@ -6102,13 +6229,13 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="settingsdialog.ui" line="475"/> - <location filename="settingsdialog.ui" line="661"/> + <location filename="settingsdialog.ui" line="675"/> <source>Username</source> <translation type="unfinished"></translation> </message> <message> <location filename="settingsdialog.ui" line="489"/> - <location filename="settingsdialog.ui" line="671"/> + <location filename="settingsdialog.ui" line="685"/> <source>Password</source> <translation type="unfinished"></translation> </message> @@ -6123,112 +6250,117 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="542"/> + <location filename="settingsdialog.ui" line="544"/> <source>Disable automatic internet features</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="545"/> + <location filename="settingsdialog.ui" line="547"/> <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="548"/> + <location filename="settingsdialog.ui" line="550"/> <source>Offline Mode</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="555"/> + <location filename="settingsdialog.ui" line="557"/> <source>Use a proxy for network connections.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="558"/> + <location filename="settingsdialog.ui" line="560"/> <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="561"/> + <location filename="settingsdialog.ui" line="563"/> <source>Use HTTP Proxy (Uses System Settings)</source> <translation type="unfinished"></translation> </message> <message> <location filename="settingsdialog.ui" line="570"/> + <source>Endorsement Integration</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="settingsdialog.ui" line="584"/> <source>Associate with "Download with manager" links</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="599"/> + <location filename="settingsdialog.ui" line="613"/> <source>Known Servers (updated on download)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="620"/> + <location filename="settingsdialog.ui" line="634"/> <source>Preferred Servers (Drag & Drop)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="655"/> + <location filename="settingsdialog.ui" line="669"/> <source>Steam</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="701"/> + <location filename="settingsdialog.ui" line="715"/> <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="728"/> + <location filename="settingsdialog.ui" line="742"/> <source>Plugins</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="753"/> + <location filename="settingsdialog.ui" line="767"/> <source>Author:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="767"/> + <location filename="settingsdialog.ui" line="781"/> <source>Version:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="781"/> + <location filename="settingsdialog.ui" line="795"/> <source>Description:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="819"/> + <location filename="settingsdialog.ui" line="833"/> <source>Key</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="824"/> + <location filename="settingsdialog.ui" line="838"/> <source>Value</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="836"/> + <location filename="settingsdialog.ui" line="850"/> <source>Blacklisted Plugins (use <del> to remove):</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="847"/> + <location filename="settingsdialog.ui" line="861"/> <source>Workarounds</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="855"/> + <location filename="settingsdialog.ui" line="869"/> <source>Steam App ID</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="875"/> + <location filename="settingsdialog.ui" line="889"/> <source>The Steam AppID for your game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="878"/> + <location filename="settingsdialog.ui" line="892"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -6244,17 +6376,17 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="909"/> + <location filename="settingsdialog.ui" line="923"/> <source>Load Mechanism</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="929"/> + <location filename="settingsdialog.ui" line="943"/> <source>Select loading mechanism. See help for details.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="932"/> + <location filename="settingsdialog.ui" line="946"/> <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. @@ -6265,17 +6397,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="949"/> + <location filename="settingsdialog.ui" line="963"/> <source>NMM Version</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="969"/> + <location filename="settingsdialog.ui" line="983"/> <source>The Version of Nexus Mod Manager to impersonate.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="972"/> + <location filename="settingsdialog.ui" line="986"/> <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'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's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6284,28 +6416,28 @@ tl;dr-version: If Nexus-features don't work, insert the current version num <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="996"/> + <location filename="settingsdialog.ui" line="1010"/> <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="999"/> + <location filename="settingsdialog.ui" line="1013"/> <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="1003"/> + <location filename="settingsdialog.ui" line="1017"/> <source>Force-enable game files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1013"/> + <location filename="settingsdialog.ui" line="1027"/> <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="1016"/> + <location filename="settingsdialog.ui" line="1030"/> <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't be resolved correctly. @@ -6313,51 +6445,51 @@ 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="1022"/> + <location filename="settingsdialog.ui" line="1036"/> <source>Display mods installed outside MO</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1035"/> + <location filename="settingsdialog.ui" line="1049"/> <source>Enforces that inactive ESPs and ESMs are never loaded.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1038"/> + <location filename="settingsdialog.ui" line="1052"/> <source>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.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1042"/> + <location filename="settingsdialog.ui" line="1056"/> <source>Hide inactive ESPs/ESMs</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1049"/> - <location filename="settingsdialog.ui" line="1052"/> + <location filename="settingsdialog.ui" line="1063"/> + <location filename="settingsdialog.ui" line="1066"/> <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="1055"/> + <location filename="settingsdialog.ui" line="1069"/> <source>Lock GUI when running executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1067"/> - <location filename="settingsdialog.ui" line="1071"/> + <location filename="settingsdialog.ui" line="1081"/> + <location filename="settingsdialog.ui" line="1085"/> <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="1075"/> + <location filename="settingsdialog.ui" line="1089"/> <source>Back-date BSAs</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1086"/> + <location filename="settingsdialog.ui" line="1100"/> <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 @@ -6366,22 +6498,22 @@ programs you are intentionally running.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1093"/> + <location filename="settingsdialog.ui" line="1107"/> <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="1096"/> + <location filename="settingsdialog.ui" line="1110"/> <source>Configure Executables Blacklist</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1106"/> + <location filename="settingsdialog.ui" line="1120"/> <source>Enable parsing of Archives Archives, has effects on perfromance.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1109"/> + <location filename="settingsdialog.ui" line="1123"/> <source> By default Mod Organizer will parse Archive files to calculate conflicts between themselves and loose files, this process has a noticeable cost in performance. This feature should not be confused from the one offered by ModOrganizer 1, ModOrganizer 2 will only show conflicts with archives NOT load them into the game or program. @@ -6391,43 +6523,43 @@ programs you are intentionally running.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1117"/> + <location filename="settingsdialog.ui" line="1131"/> <source>Enable parsing of Archives</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1127"/> - <location filename="settingsdialog.ui" line="1130"/> + <location filename="settingsdialog.ui" line="1141"/> + <location filename="settingsdialog.ui" line="1144"/> <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="1133"/> + <location filename="settingsdialog.ui" line="1147"/> <source>Reset Window Geometries</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1156"/> + <location filename="settingsdialog.ui" line="1170"/> <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="1167"/> + <location filename="settingsdialog.ui" line="1181"/> <source>Diagnostics</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1175"/> + <location filename="settingsdialog.ui" line="1189"/> <source>Max Dumps To Keep</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1195"/> + <location filename="settingsdialog.ui" line="1209"/> <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="1198"/> + <location filename="settingsdialog.ui" line="1212"/> <source> Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6435,12 +6567,12 @@ programs you are intentionally running.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1210"/> + <location filename="settingsdialog.ui" line="1224"/> <source>Hint: right click link and copy link location</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1213"/> + <location filename="settingsdialog.ui" line="1227"/> <source> Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. @@ -6450,17 +6582,17 @@ programs you are intentionally running.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1230"/> + <location filename="settingsdialog.ui" line="1244"/> <source>Crash Dumps</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1237"/> + <location filename="settingsdialog.ui" line="1251"/> <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="1240"/> + <location filename="settingsdialog.ui" line="1254"/> <source> Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6471,37 +6603,37 @@ programs you are intentionally running.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1250"/> + <location filename="settingsdialog.ui" line="1264"/> <source>None</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1255"/> + <location filename="settingsdialog.ui" line="1269"/> <source>Mini (recommended)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1260"/> + <location filename="settingsdialog.ui" line="1274"/> <source>Data</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1265"/> + <location filename="settingsdialog.ui" line="1279"/> <source>Full</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1293"/> + <location filename="settingsdialog.ui" line="1307"/> <source>Log Level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1300"/> + <location filename="settingsdialog.ui" line="1314"/> <source>Decides the amount of data printed to "ModOrganizer.log"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1303"/> + <location filename="settingsdialog.ui" line="1317"/> <source> Decides the amount of data printed to "ModOrganizer.log". "Debug" 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 "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6509,22 +6641,22 @@ programs you are intentionally running.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1310"/> + <location filename="settingsdialog.ui" line="1324"/> <source>Debug</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1315"/> + <location filename="settingsdialog.ui" line="1329"/> <source>Info (recommended)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1320"/> + <location filename="settingsdialog.ui" line="1334"/> <source>Warning</source> <translation type="unfinished"></translation> </message> <message> - <location filename="settingsdialog.ui" line="1325"/> + <location filename="settingsdialog.ui" line="1339"/> <source>Error</source> <translation type="unfinished"></translation> </message> @@ -6707,7 +6839,8 @@ Example: <name>TransferSavesDialog</name> <message> <location filename="transfersavesdialog.ui" line="14"/> - <source>Transfer Savegames</source> + <source>Transfer Save Games</source> + <oldsource>Transfer Savegames</oldsource> <translation type="unfinished"></translation> </message> <message> diff --git a/src/organizercore.cpp b/src/organizercore.cpp index acce25dc..80dad96b 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -560,6 +560,10 @@ void OrganizerCore::setUserInterface(IUserInterface *userInterface, SLOT(fileMoved(QString, QString, QString)));
connect(&m_ModList, SIGNAL(modorder_changed()), widget,
SLOT(modorder_changed()));
+ connect(&m_PluginList, SIGNAL(writePluginsList()), widget,
+ SLOT(esplist_changed()));
+ connect(&m_PluginList, SIGNAL(esplist_changed()), widget,
+ SLOT(esplist_changed()));
connect(&m_DownloadManager, SIGNAL(showMessage(QString)), widget,
SLOT(showMessage(QString)));
}
@@ -1093,8 +1097,9 @@ QString OrganizerCore::resolvePath(const QString &fileName) const QStringList OrganizerCore::listDirectories(const QString &directoryName) const
{
QStringList result;
- DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(
- ToWString(directoryName));
+ DirectoryEntry *dir = m_DirectoryStructure;
+ if (!directoryName.isEmpty())
+ dir = dir->findSubDirectoryRecursive(ToWString(directoryName));
if (dir != nullptr) {
std::vector<DirectoryEntry *>::iterator current, end;
dir->getSubDirectories(current, end);
@@ -1110,8 +1115,9 @@ QStringList OrganizerCore::findFiles( const std::function<bool(const QString &)> &filter) const
{
QStringList result;
- DirectoryEntry *dir
- = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(path));
+ DirectoryEntry *dir = m_DirectoryStructure;
+ if (!path.isEmpty())
+ dir = dir->findSubDirectoryRecursive(ToWString(path));
if (dir != nullptr) {
std::vector<FileEntry::Ptr> files = dir->getFiles();
foreach (FileEntry::Ptr file, files) {
@@ -1150,8 +1156,9 @@ QList<MOBase::IOrganizer::FileInfo> OrganizerCore::findFileInfos( const
{
QList<IOrganizer::FileInfo> result;
- DirectoryEntry *dir
- = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(path));
+ DirectoryEntry *dir = m_DirectoryStructure;
+ if (!path.isEmpty())
+ dir = dir->findSubDirectoryRecursive(ToWString(path));
if (dir != nullptr) {
std::vector<FileEntry::Ptr> files = dir->getFiles();
foreach (FileEntry::Ptr file, files) {
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 04e39abf..2f70cd27 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -181,15 +181,16 @@ void PluginList::refresh(const QString &profileName }
QString filename = ToQString(current->getName());
- availablePlugins.append(filename.toLower());
-
- if (m_ESPsByName.find(filename.toLower()) != m_ESPsByName.end()) {
- continue;
- }
-
QString extension = filename.right(3).toLower();
if ((extension == "esp") || (extension == "esm") || (extension == "esl")) {
+
+ availablePlugins.append(filename.toLower());
+
+ if (m_ESPsByName.find(filename.toLower()) != m_ESPsByName.end()) {
+ continue;
+ }
+
bool forceEnabled = Settings::instance().forceEnableCoreFiles() &&
std::find(primaryPlugins.begin(), primaryPlugins.end(), filename.toLower()) != primaryPlugins.end();
@@ -202,10 +203,12 @@ void PluginList::refresh(const QString &profileName bool hasIni = baseDirectory.findFile(ToWString(iniPath)).get() != nullptr;
std::set<QString> loadedArchives;
- QString originPath = QString::fromWCharArray(origin.getPath().c_str());
- QDir dir(QDir::toNativeSeparators(originPath));
- for (QString filename : dir.entryList(QStringList() << QFileInfo(filename).baseName() + "*.bsa" << QFileInfo(filename).baseName() + "*.ba2")) {
- loadedArchives.insert(filename);
+ for (FileEntry::Ptr archiveCandidate : files) {
+ QString candidateName = ToQString(archiveCandidate->getName());
+ if (candidateName.contains(QRegExp(QFileInfo(filename).baseName() + "*.bsa", Qt::CaseInsensitive, QRegExp::Wildcard)) ||
+ candidateName.contains(QRegExp(QFileInfo(filename).baseName() + "*.ba2", Qt::CaseInsensitive, QRegExp::Wildcard))) {
+ loadedArchives.insert(candidateName);
+ }
}
QString originName = ToQString(origin.getName());
@@ -846,6 +849,7 @@ void PluginList::generatePluginIndexes() m_ESPs[i].m_Index = QString("%1").arg(l - numESLs - numSkipped, 2, 16, QChar('0')).toUpper();
}
}
+ emit esplist_changed();
}
diff --git a/src/pluginlistsortproxy.cpp b/src/pluginlistsortproxy.cpp index e09e64a5..1e131c4d 100644 --- a/src/pluginlistsortproxy.cpp +++ b/src/pluginlistsortproxy.cpp @@ -72,8 +72,7 @@ void PluginListSortProxy::updateFilter(const QString &filter) bool PluginListSortProxy::filterAcceptsRow(int row, const QModelIndex&) const
{
- return m_CurrentFilter.isEmpty() ||
- sourceModel()->data(sourceModel()->index(row, 0)).toString().contains(m_CurrentFilter, Qt::CaseInsensitive);
+ return filterMatchesPlugin(sourceModel()->data(sourceModel()->index(row, 0)).toString());
}
@@ -137,3 +136,10 @@ bool PluginListSortProxy::dropMimeData(const QMimeData *data, Qt::DropAction act sourceIndex.parent());
}
+
+bool PluginListSortProxy::filterMatchesPlugin(const QString &plugin) const
+{
+ return m_CurrentFilter.isEmpty() ||
+ plugin.contains(m_CurrentFilter, Qt::CaseInsensitive);
+}
+
diff --git a/src/pluginlistsortproxy.h b/src/pluginlistsortproxy.h index 89f60e70..03b079e2 100644 --- a/src/pluginlistsortproxy.h +++ b/src/pluginlistsortproxy.h @@ -46,6 +46,8 @@ public: virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
+ bool filterMatchesPlugin(const QString &plugin) const;
+
public slots:
void updateFilter(const QString &filter);
diff --git a/src/profile.cpp b/src/profile.cpp index 821be4b4..d1741311 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -29,6 +29,8 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <safewritefile.h> #include <bsainvalidation.h> #include <dataarchives.h> +#include "util.h" +#include "registry.h" #include <QApplication> #include <QFile> // for QFile @@ -85,7 +87,6 @@ Profile::Profile(const QString &name, IPluginGame const *gamePlugin, bool useDef m_Directory = QDir(fullPath); m_Settings = new QSettings(m_Directory.absoluteFilePath("settings.ini"), QSettings::IniFormat); - findProfileSettings(); try { // create files. Needs to happen after m_Directory was set! @@ -101,6 +102,7 @@ Profile::Profile(const QString &name, IPluginGame const *gamePlugin, bool useDef } gamePlugin->initializeProfile(fullPath, settings); + findProfileSettings(); } catch (...) { // clean up in case of an error shellDelete(QStringList(profileBase.absoluteFilePath(fixedName))); @@ -171,10 +173,8 @@ void Profile::findProfileSettings() if (m_Directory.exists(backupFile)) { storeSetting("LocalSettings", false); m_Directory.rename(backupFile, getIniFileName()); - } else if (m_Directory.exists(getIniFileName())) { - storeSetting("LocalSettings", true); } else { - storeSetting("LocalSettings", false); + storeSetting("LocalSettings", true); } } @@ -281,7 +281,7 @@ void Profile::createTweakedIniFile() mergeTweak(getProfileTweaks(), tweakedIni); bool error = false; - if (!::WritePrivateProfileStringW(L"Archive", L"bInvalidateOlderFiles", L"1", ToWString(tweakedIni).c_str())) { + if (!MOBase::WriteRegistryValue(L"Archive", L"bInvalidateOlderFiles", L"1", ToWString(tweakedIni).c_str())) { error = true; } @@ -683,7 +683,7 @@ void Profile::mergeTweak(const QString &tweakName, const QString &tweakedIni) co //TODO this treats everything as strings but how could I differentiate the type? ::GetPrivateProfileStringW(iter->c_str(), keyIter->c_str(), nullptr, buffer.data(), bufferSize, ToWString(tweakName).c_str()); - ::WritePrivateProfileStringW(iter->c_str(), keyIter->c_str(), + MOBase::WriteRegistryValue(iter->c_str(), keyIter->c_str(), buffer.data(), tweakedIniW.c_str()); } } @@ -750,9 +750,9 @@ bool Profile::enableLocalSaves(bool enable) } } else { QMessageBox::StandardButton res = QMessageBox::question( - QApplication::activeModalWidget(), tr("Delete savegames?"), - tr("Do you want to delete local savegames? (If you select \"No\", the " - "save games will show up again if you re-enable local savegames)"), + QApplication::activeModalWidget(), tr("Delete profile-specific save games?"), + tr("Do you want to delete the profile-specific save games? (If you select \"No\", the " + "save games will show up again if you re-enable profile-specific save games)"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel); if (res == QMessageBox::Yes) { @@ -770,11 +770,50 @@ bool Profile::enableLocalSaves(bool enable) bool Profile::localSettingsEnabled() const { - return setting("LocalSettings", false).toBool(); + bool enabled = setting("LocalSettings", false).toBool(); + if (enabled) { + bool reinitConfig = false; + for (QString file : m_GamePlugin->iniFiles()) { + if (!QFile::exists(m_Directory.filePath(file))) { + qWarning("missing %s in %s", qPrintable(file), qPrintable(m_Directory.path())); + reinitConfig = true; + } + } + if (reinitConfig) { + QMessageBox::StandardButton res = QMessageBox::warning( + QApplication::activeModalWidget(), tr("Missing profile-specific game INI files!"), + tr("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.") + ); + m_GamePlugin->initializeProfile(m_Directory, IPluginGame::CONFIGURATION); + } + } + return enabled; } bool Profile::enableLocalSettings(bool enable) { + if (enable) { + m_GamePlugin->initializeProfile(m_Directory.absolutePath(), IPluginGame::CONFIGURATION); + } else { + QMessageBox::StandardButton res = QMessageBox::question( + QApplication::activeModalWidget(), tr("Delete profile-specific game INI files?"), + tr("Do you want to delete the profile-specific game INI files? (If you select \"No\", the " + "INI files will be used again if you re-enable profile-specific game INI files.)"), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, + QMessageBox::Cancel); + if (res == QMessageBox::Yes) { + QStringList filesToDelete; + for (QString file : m_GamePlugin->iniFiles()) { + filesToDelete << m_Directory.absoluteFilePath(file); + } + shellDelete(filesToDelete, true); + } else if (res == QMessageBox::No) { + // No action + } else { + return false; + } + } storeSetting("LocalSettings", enable); return true; } diff --git a/src/profilesdialog.cpp b/src/profilesdialog.cpp index ed54f33c..17844357 100644 --- a/src/profilesdialog.cpp +++ b/src/profilesdialog.cpp @@ -191,7 +191,7 @@ void ProfilesDialog::on_removeProfileButton_clicked() return;
}
- QMessageBox confirmBox(QMessageBox::Question, tr("Confirm"), tr("Are you sure you want to remove this profile (including local savegames if any)?"),
+ QMessageBox confirmBox(QMessageBox::Question, tr("Confirm"), tr("Are you sure you want to remove this profile (including profile-specific save games, if any)?"),
QMessageBox::Yes | QMessageBox::No, this);
if (confirmBox.exec() == QMessageBox::Yes) {
diff --git a/src/profilesdialog.ui b/src/profilesdialog.ui index d33e2283..f040faed 100644 --- a/src/profilesdialog.ui +++ b/src/profilesdialog.ui @@ -35,13 +35,13 @@ p, li { white-space: pre-wrap; } <item>
<widget class="QCheckBox" name="localSavesBox">
<property name="toolTip">
- <string><html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html></string>
+ <string><html><head/><body><p>If checked, save games are stored locally to this profile and will not appear when starting with a different profile.</p></body></html></string>
</property>
<property name="whatsThis">
- <string>If checked, savegames are local to this profile and will not appear when starting with a different profile.</string>
+ <string>If checked, save games are local to this profile and will not appear when starting with a different profile.</string>
</property>
<property name="text">
- <string>Use profile-specific Savegames</string>
+ <string>Use profile-specific Save Games</string>
</property>
</widget>
</item>
diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 7c0682bf..d26ca96c 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -327,10 +327,10 @@ void SelfUpdater::installUpdate() const QString mopath
= QDir::fromNativeSeparators(qApp->property("dataPath").toString());
- const std::wstring params = L"/DIR=" + qApp->applicationDirPath().toStdWString();
+ std::wstring parameters = ToWString("/DIR=\"" + qApp->applicationDirPath() + "\" ");
HINSTANCE res = ::ShellExecuteW(
- nullptr, L"open", m_UpdateFile.fileName().toStdWString().c_str(), params.c_str(),
+ nullptr, L"open", m_UpdateFile.fileName().toStdWString().c_str(), parameters.c_str(),
nullptr, SW_SHOW);
if (res > (HINSTANCE)32) {
diff --git a/src/settings.cpp b/src/settings.cpp index 74c95ebf..2bad749f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -459,6 +459,11 @@ bool Settings::useProxy() const return m_Settings.value("Settings/use_proxy", false).toBool(); } +bool Settings::endorsementIntegration() const +{ + return m_Settings.value("Settings/endorsement_integration", true).toBool(); +} + bool Settings::displayForeign() const { return m_Settings.value("Settings/display_foreign", true).toBool(); @@ -946,6 +951,7 @@ Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog) , m_knownServersList(dialog.findChild<QListWidget *>("knownServersList")) , m_preferredServersList( dialog.findChild<QListWidget *>("preferredServersList")) + , m_endorsementBox(dialog.findChild<QCheckBox *>("endorsementBox")) { if (parent->automaticLoginEnabled()) { m_loginCheckBox->setChecked(true); @@ -955,6 +961,7 @@ Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog) m_offlineBox->setChecked(parent->offlineMode()); m_proxyBox->setChecked(parent->useProxy()); + m_endorsementBox->setChecked(parent->endorsementIntegration()); // display server preferences m_Settings.beginGroup("Servers"); @@ -996,6 +1003,7 @@ void Settings::NexusTab::update() } m_Settings.setValue("Settings/offline_mode", m_offlineBox->isChecked()); m_Settings.setValue("Settings/use_proxy", m_proxyBox->isChecked()); + m_Settings.setValue("Settings/endorsement_integration", m_endorsementBox->isChecked()); // store server preference m_Settings.beginGroup("Servers"); diff --git a/src/settings.h b/src/settings.h index 3694bfad..4a932da7 100644 --- a/src/settings.h +++ b/src/settings.h @@ -271,6 +271,11 @@ public: bool useProxy() const; /** + * @return true if endorsement integration is enabled + */ + bool endorsementIntegration() const; + + /** * @return true if the user wants to see non-official plugins installed outside MO in his mod list */ bool displayForeign() const; @@ -475,6 +480,7 @@ private: QCheckBox *m_proxyBox; QListWidget *m_knownServersList; QListWidget *m_preferredServersList; + QCheckBox *m_endorsementBox; }; /** Display/store the configuration in the 'steam' tab of the settings dialogue */ diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 51f35683..832fa71a 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -537,30 +537,44 @@ p, li { white-space: pre-wrap; } </widget>
</item>
<item>
- <widget class="QCheckBox" name="offlineBox">
- <property name="statusTip">
- <string>Disable automatic internet features</string>
- </property>
- <property name="whatsThis">
- <string>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)</string>
- </property>
- <property name="text">
- <string>Offline Mode</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="proxyBox">
- <property name="statusTip">
- <string>Use a proxy for network connections.</string>
- </property>
- <property name="whatsThis">
- <string>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.</string>
- </property>
- <property name="text">
- <string>Use HTTP Proxy (Uses System Settings)</string>
- </property>
- </widget>
+ <layout class="QGridLayout" name="gridLayout_8">
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="offlineBox">
+ <property name="statusTip">
+ <string>Disable automatic internet features</string>
+ </property>
+ <property name="whatsThis">
+ <string>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)</string>
+ </property>
+ <property name="text">
+ <string>Offline Mode</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="proxyBox">
+ <property name="statusTip">
+ <string>Use a proxy for network connections.</string>
+ </property>
+ <property name="whatsThis">
+ <string>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.</string>
+ </property>
+ <property name="text">
+ <string>Use HTTP Proxy (Uses System Settings)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="endorsementBox">
+ <property name="text">
+ <string>Endorsement Integration</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
@@ -1368,8 +1382,6 @@ programs you are intentionally running.</string> <tabstop>usernameEdit</tabstop>
<tabstop>passwordEdit</tabstop>
<tabstop>clearCacheButton</tabstop>
- <tabstop>offlineBox</tabstop>
- <tabstop>proxyBox</tabstop>
<tabstop>associateButton</tabstop>
<tabstop>knownServersList</tabstop>
<tabstop>preferredServersList</tabstop>
diff --git a/src/shared/util.cpp b/src/shared/util.cpp index b65ed071..ed7c434e 100644 --- a/src/shared/util.cpp +++ b/src/shared/util.cpp @@ -211,7 +211,7 @@ MOBase::VersionInfo createVersionInfo() {
VS_FIXEDFILEINFO version = GetFileVersion(QApplication::applicationFilePath().toStdWString());
- if (version.dwFileFlags | VS_FF_PRERELEASE)
+ if (version.dwFileFlags & VS_FF_PRERELEASE)
{
// Pre-release builds need annotating
QString versionString = QString::fromStdWString(GetFileVersionString(QApplication::applicationFilePath().toStdWString()));
diff --git a/src/spawn.cpp b/src/spawn.cpp index f92387d5..f8a7bb5f 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -26,6 +26,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <Shellapi.h>
#include <appconfig.h>
#include <windows_error.h>
+#include "helper.h"
#include <QApplication>
#include <QMessageBox>
@@ -148,23 +149,31 @@ HANDLE startBinary(const QFileInfo &binary, }
} catch (const windows_error &e) {
if (e.getErrorCode() == ERROR_ELEVATION_REQUIRED) {
- // TODO: check if this is really correct. Are all settings updated that the secondary instance may use?
-
- if (QMessageBox::question(nullptr, QObject::tr("Elevation required"),
+ if (QMessageBox::question(QApplication::activeModalWidget(), QObject::tr("Elevation required"),
QObject::tr("This process requires elevation to run.\n"
"This is a potential security risk so I highly advice you to investigate if\n"
"\"%1\"\n"
"can be installed to work without elevation.\n\n"
- "Start elevated anyway? "
- "(you will be asked if you want to allow ModOrganizer.exe to make changes to the system)").arg(
+ "Restart Mod Organizer as an elevated process?\n"
+ "You will be asked if you want to allow helper.exe to make changes to the system. "
+ "You will need to relaunch the process above manually.").arg(
QDir::toNativeSeparators(binary.absoluteFilePath())),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
- ::ShellExecuteW(nullptr, L"runas", ToWString(QCoreApplication::applicationFilePath()).c_str(),
- (std::wstring(L"\"") + binaryName + L"\" " + ToWString(arguments)).c_str(), currentDirectoryName.c_str(), SW_SHOWNORMAL);
- return INVALID_HANDLE_VALUE;
- } else {
- return INVALID_HANDLE_VALUE;
+ WCHAR cwd[MAX_PATH];
+ if (!GetCurrentDirectory(MAX_PATH, cwd)) {
+ reportError(QObject::tr("failed to spawn \"%1\": %2").arg(binary.fileName()).arg(::GetLastError()));
+ cwd[0] = L'\0';
+ }
+ if (!Helper::adminLaunch(
+ qApp->applicationDirPath().toStdWString(),
+ qApp->applicationFilePath().toStdWString(),
+ std::wstring(cwd))) {
+ return INVALID_HANDLE_VALUE;
+ }
+ qApp->exit(0);
}
+ return INVALID_HANDLE_VALUE;
+
} else {
reportError(QObject::tr("failed to spawn \"%1\": %2").arg(binary.fileName()).arg(e.what()));
return INVALID_HANDLE_VALUE;
diff --git a/src/transfersavesdialog.ui b/src/transfersavesdialog.ui index 1fcad54d..8bc23088 100644 --- a/src/transfersavesdialog.ui +++ b/src/transfersavesdialog.ui @@ -11,7 +11,7 @@ </rect>
</property>
<property name="windowTitle">
- <string>Transfer Savegames</string>
+ <string>Transfer Save Games</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
|
