summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/aboutdialog.ui8
-rw-r--r--src/downloadlistwidget.cpp4
-rw-r--r--src/editexecutablesdialog.cpp53
-rw-r--r--src/editexecutablesdialog.h10
-rw-r--r--src/editexecutablesdialog.ui37
-rw-r--r--src/forcedloaddialog.cpp77
-rw-r--r--src/forcedloaddialog.h34
-rw-r--r--src/forcedloaddialog.ui117
-rw-r--r--src/forcedloaddialogwidget.cpp108
-rw-r--r--src/forcedloaddialogwidget.h41
-rw-r--r--src/forcedloaddialogwidget.ui113
-rw-r--r--src/installationmanager.cpp3
-rw-r--r--src/mainwindow.cpp108
-rw-r--r--src/mainwindow.h1
-rw-r--r--src/mainwindow.ui26
-rw-r--r--src/modinfodialog.cpp12
-rw-r--r--src/modinfodialog.h1
-rw-r--r--src/modinfodialog.ui17
-rw-r--r--src/modinforegular.cpp1
-rw-r--r--src/modlist.cpp6
-rw-r--r--src/modlistsortproxy.cpp112
-rw-r--r--src/organizer.pro12
-rw-r--r--src/organizer_en.ts1143
-rw-r--r--src/organizercore.cpp37
-rw-r--r--src/organizercore.h8
-rw-r--r--src/overwriteinfodialog.cpp2
-rw-r--r--src/pluginlist.cpp2
-rw-r--r--src/pluginlistsortproxy.cpp35
-rw-r--r--src/profile.cpp140
-rw-r--r--src/profile.h14
-rw-r--r--src/selfupdater.cpp5
-rw-r--r--src/settings.cpp7
-rw-r--r--src/settings.h4
-rw-r--r--src/settingsdialog.cpp6
-rw-r--r--src/shared/leaktrace.cpp13
-rw-r--r--src/spawn.cpp2
-rw-r--r--src/stylesheets/Paper Automata.qss138
-rw-r--r--src/stylesheets/Paper Dark by 6788.qss101
-rw-r--r--src/stylesheets/Paper Light by 6788.qss98
-rw-r--r--src/stylesheets/Paper/Dark/check.svg10
-rw-r--r--src/stylesheets/Paper/Dark/highlight.svg205
-rw-r--r--src/stylesheets/Parchment v1.1 by Bob.qss587
-rw-r--r--src/stylesheets/Parchment/checkbox-alt-checked.pngbin0 -> 301 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox-alt-unchecked-hover.pngbin0 -> 283 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox-alt-unchecked.pngbin0 -> 253 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox-checked-disabled.pngbin0 -> 309 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox-checked-hover.pngbin0 -> 339 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox-checked.pngbin0 -> 319 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox-disabled.pngbin0 -> 259 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox-hover.pngbin0 -> 339 bytes
-rw-r--r--src/stylesheets/Parchment/checkbox.pngbin0 -> 259 bytes
-rw-r--r--src/usvfsconnector.cpp18
-rw-r--r--src/usvfsconnector.h3
-rw-r--r--src/version.rc74
55 files changed, 2772 insertions, 787 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4c883cf5..5cbd5aa9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -92,6 +92,8 @@ SET(organizer_SRCS
moshortcut.cpp
listdialog.cpp
lcdnumber.cpp
+ forcedloaddialog.cpp
+ forcedloaddialogwidget.cpp
shared/windows_error.cpp
shared/error_report.cpp
@@ -187,6 +189,8 @@ SET(organizer_HDRS
moshortcut.h
listdialog.h
lcdnumber.h
+ forcedloaddialog.h
+ forcedloaddialogwidget.h
shared/windows_error.h
shared/error_report.h
@@ -226,6 +230,8 @@ SET(organizer_UIS
browserdialog.ui
aboutdialog.ui
listdialog.ui
+ forcedloaddialog.ui
+ forcedloaddialogwidget.ui
)
SET(organizer_QRCS
diff --git a/src/aboutdialog.ui b/src/aboutdialog.ui
index 98a76061..86b95c83 100644
--- a/src/aboutdialog.ui
+++ b/src/aboutdialog.ui
@@ -202,7 +202,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_7" stretch="0">
<item>
- <widget class="QListWidget" name="listWidget_2">
+ <widget class="QListWidget" name="listWidget_3">
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
@@ -231,9 +231,9 @@
<property name="title">
<string>Translators</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_6">
+ <layout class="QVBoxLayout" name="verticalLayout_61">
<item>
- <widget class="QListWidget" name="listWidget_2">
+ <widget class="QListWidget" name="listWidget_4">
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
@@ -363,7 +363,7 @@
<property name="title">
<string>Other Supporters &amp;&amp; Contributors</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_7">
+ <layout class="QVBoxLayout" name="verticalLayout_71">
<item>
<widget class="QListWidget" name="listWidget">
<property name="selectionMode">
diff --git a/src/downloadlistwidget.cpp b/src/downloadlistwidget.cpp
index f885a5a8..be9d30e2 100644
--- a/src/downloadlistwidget.cpp
+++ b/src/downloadlistwidget.cpp
@@ -141,7 +141,7 @@ void DownloadListWidget::onDoubleClick(const QModelIndex &index)
QModelIndex sourceIndex = qobject_cast<QSortFilterProxyModel*>(model())->mapToSource(index);
if (m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_READY)
emit installDownload(sourceIndex.row());
- else if ((m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_PAUSED)
+ else if ((m_Manager->getState(sourceIndex.row()) == DownloadManager::STATE_PAUSED)
|| (m_Manager->getState(sourceIndex.row()) == DownloadManager::STATE_PAUSING))
emit resumeDownload(sourceIndex.row());
}
@@ -161,7 +161,7 @@ void DownloadListWidget::onHeaderCustomContextMenu(const QPoint &point)
checkableAction->setDefaultWidget(checkBox);
menu.addAction(checkableAction);
}
-
+
menu.exec(header()->viewport()->mapToGlobal(point));
// view/hide columns depending on check-state
diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp
index be2ee127..78e1accb 100644
--- a/src/editexecutablesdialog.cpp
+++ b/src/editexecutablesdialog.cpp
@@ -25,25 +25,29 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QMessageBox>
#include <Shellapi.h>
#include <utility.h>
-
+#include "forcedloaddialog.h"
+#include <algorithm>
using namespace MOBase;
using namespace MOShared;
EditExecutablesDialog::EditExecutablesDialog(
const ExecutablesList &executablesList, const ModList &modList,
- Profile *profile, QWidget *parent)
+ Profile *profile, const IPluginGame *game, QWidget *parent)
: TutorableDialog("EditExecutables", parent)
, ui(new Ui::EditExecutablesDialog)
, m_CurrentItem(nullptr)
, m_ExecutablesList(executablesList)
, m_Profile(profile)
+ , m_GamePlugin(game)
{
ui->setupUi(this);
refreshExecutablesWidget();
ui->newFilesModBox->addItems(modList.allMods());
+
+ m_ForcedLibraries = m_Profile->determineForcedLibraries(ui->titleEdit->text());
}
EditExecutablesDialog::~EditExecutablesDialog()
@@ -93,6 +97,7 @@ void EditExecutablesDialog::resetInput()
ui->overwriteAppIDBox->setChecked(false);
ui->useAppIconCheckBox->setChecked(false);
ui->newFilesModCheckBox->setChecked(false);
+ ui->forceLoadCheckBox->setChecked(false);
m_CurrentItem = nullptr;
}
@@ -118,6 +123,10 @@ void EditExecutablesDialog::saveExecutable()
else {
m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text());
}
+
+ m_Profile->removeForcedLibraries(ui->titleEdit->text());
+ m_Profile->storeForcedLibraries(ui->titleEdit->text(), m_ForcedLibraries);
+ m_Profile->setForcedLibrariesEnabled(ui->titleEdit->text(), ui->forceLoadCheckBox->isChecked());
}
@@ -130,6 +139,21 @@ void EditExecutablesDialog::delayedRefresh()
}
+void EditExecutablesDialog::on_forceLoadButton_clicked()
+{
+ ForcedLoadDialog dialog(m_GamePlugin, this);
+ dialog.setValues(m_ForcedLibraries);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_ForcedLibraries = dialog.values();
+ }
+}
+
+void EditExecutablesDialog::on_forceLoadCheckBox_toggled()
+{
+ ui->forceLoadButton->setEnabled(ui->forceLoadCheckBox->isChecked());
+}
+
+
void EditExecutablesDialog::on_addButton_clicked()
{
if (executableChanged()) {
@@ -195,6 +219,8 @@ void EditExecutablesDialog::on_removeButton_clicked()
{
if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->titleEdit->text()),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
+ m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text());
+ m_Profile->removeForcedLibraries(ui->titleEdit->text());
m_ExecutablesList.remove(ui->titleEdit->text());
}
@@ -231,6 +257,20 @@ bool EditExecutablesDialog::executableChanged()
QString storedCustomOverwrite = m_Profile->setting("custom_overwrites", selectedExecutable.m_Title).toString();
+ bool forcedLibrariesDirty = false;
+ auto forcedLibaries = m_Profile->determineForcedLibraries(selectedExecutable.m_Title);
+ forcedLibrariesDirty |= !std::equal(forcedLibaries.begin(), forcedLibaries.end(),
+ m_ForcedLibraries.begin(), m_ForcedLibraries.end(),
+ [](const ExecutableForcedLoadSetting &lhs, const ExecutableForcedLoadSetting &rhs)
+ {
+ return lhs.enabled() == rhs.enabled() &&
+ lhs.forced() == rhs.forced() &&
+ lhs.library() == rhs.library() &&
+ lhs.process() == rhs.process();
+ });
+ forcedLibrariesDirty |= m_Profile->setting("forced_libraries", ui->titleEdit->text() + "/enabled", false).toBool() !=
+ ui->forceLoadCheckBox->isChecked();
+
return selectedExecutable.m_Title != ui->titleEdit->text()
|| selectedExecutable.m_Arguments != ui->argumentsEdit->text()
|| selectedExecutable.m_SteamAppID != ui->appIDOverwriteEdit->text()
@@ -238,7 +278,9 @@ bool EditExecutablesDialog::executableChanged()
|| !storedCustomOverwrite.isEmpty() && (storedCustomOverwrite != ui->newFilesModBox->currentText())
|| selectedExecutable.m_WorkingDirectory != QDir::fromNativeSeparators(ui->workingDirEdit->text())
|| selectedExecutable.m_BinaryInfo.absoluteFilePath() != QDir::fromNativeSeparators(ui->binaryEdit->text())
- || selectedExecutable.usesOwnIcon() != ui->useAppIconCheckBox->isChecked();
+ || selectedExecutable.usesOwnIcon() != ui->useAppIconCheckBox->isChecked()
+ || forcedLibrariesDirty
+ ;
} else {
QFileInfo fileInfo(ui->binaryEdit->text());
return !ui->binaryEdit->text().isEmpty()
@@ -331,6 +373,11 @@ void EditExecutablesDialog::on_executablesListBox_clicked(const QModelIndex &cur
if (index != -1) {
ui->newFilesModBox->setCurrentIndex(index);
}
+
+ m_ForcedLibraries = m_Profile->determineForcedLibraries(ui->titleEdit->text());
+ bool forcedLibraries = m_Profile->forcedLibrariesEnabled(ui->titleEdit->text());
+ ui->forceLoadButton->setEnabled(forcedLibraries);
+ ui->forceLoadCheckBox->setChecked(forcedLibraries);
}
}
diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h
index 0f3dbaff..0169b8ca 100644
--- a/src/editexecutablesdialog.h
+++ b/src/editexecutablesdialog.h
@@ -25,6 +25,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QTimer>
#include "executableslist.h"
#include "profile.h"
+#include "iplugingame.h"
namespace Ui {
class EditExecutablesDialog;
@@ -52,6 +53,7 @@ public:
explicit EditExecutablesDialog(const ExecutablesList &executablesList,
const ModList &modList,
Profile *profile,
+ const MOBase::IPluginGame *game,
QWidget *parent = 0);
~EditExecutablesDialog();
@@ -92,6 +94,10 @@ private slots:
void on_executablesListBox_clicked(const QModelIndex &index);
+ void on_forceLoadButton_clicked();
+
+ void on_forceLoadCheckBox_toggled();
+
private:
void resetInput();
@@ -108,6 +114,10 @@ private:
ExecutablesList m_ExecutablesList;
Profile *m_Profile;
+
+ QList<MOBase::ExecutableForcedLoadSetting> m_ForcedLibraries;
+
+ const MOBase::IPluginGame *m_GamePlugin;
};
#endif // EDITEXECUTABLESDIALOG_H
diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui
index bdbb8bd1..4f9223d5 100644
--- a/src/editexecutablesdialog.ui
+++ b/src/editexecutablesdialog.ui
@@ -192,6 +192,43 @@ Right now the only case I know of where this needs to be overwritten is for the
</layout>
</item>
<item>
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
+ <item>
+ <widget class="QCheckBox" name="forceLoadCheckBox">
+ <property name="toolTip">
+ <string>If this is enabled, the configured libraries will be automatically loaded when this executable is launched.</string>
+ </property>
+ <property name="text">
+ <string>Force Load Libraries (*)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="forceLoadButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Configure Libraries</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
<widget class="QCheckBox" name="useAppIconCheckBox">
<property name="text">
<string>Use Application's Icon for shortcuts</string>
diff --git a/src/forcedloaddialog.cpp b/src/forcedloaddialog.cpp
new file mode 100644
index 00000000..ab0bd583
--- /dev/null
+++ b/src/forcedloaddialog.cpp
@@ -0,0 +1,77 @@
+#include "forcedloaddialog.h"
+#include "ui_forcedloaddialog.h"
+
+#include "forcedloaddialogwidget.h"
+
+#include <QComboBox>
+#include <QLabel>
+
+using namespace MOBase;
+
+ForcedLoadDialog::ForcedLoadDialog(const IPluginGame *game, QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::ForcedLoadDialog),
+ m_GamePlugin(game)
+{
+ ui->setupUi(this);
+}
+
+ForcedLoadDialog::~ForcedLoadDialog()
+{
+ delete ui;
+}
+
+void ForcedLoadDialog::setValues(QList<MOBase::ExecutableForcedLoadSetting> &values)
+{
+ ui->tableWidget->clearContents();
+
+ for (int i = 0; i < values.count(); i++) {
+ ForcedLoadDialogWidget *item = new ForcedLoadDialogWidget(m_GamePlugin, this);
+ item->setEnabled(values[i].enabled());
+ item->setProcess(values[i].process());
+ item->setLibraryPath(values[i].library());
+ item->setForced(values[i].forced());
+
+ ui->tableWidget->insertRow(i);
+ ui->tableWidget->setCellWidget(i, 0, item);
+ }
+
+ ui->tableWidget->resizeRowsToContents();
+}
+
+QList<MOBase::ExecutableForcedLoadSetting> ForcedLoadDialog::values()
+{
+ QList<MOBase::ExecutableForcedLoadSetting> results;
+ for (int row = 0; row < ui->tableWidget->rowCount(); row++) {
+ auto widget = (ForcedLoadDialogWidget*)ui->tableWidget->cellWidget(row, 0);
+ results.append(
+ ExecutableForcedLoadSetting(
+ widget->getProcess(),
+ widget->getLibraryPath()
+ ).withEnabled(widget->getEnabled())
+ .withForced(widget->getForced())
+ );
+ }
+ return results;
+}
+
+
+void ForcedLoadDialog::on_addRowButton_clicked()
+{
+ int row = ui->tableWidget->rowCount();
+ ui->tableWidget->insertRow(row);
+ ForcedLoadDialogWidget *item = new ForcedLoadDialogWidget(m_GamePlugin, this);
+ ui->tableWidget->setCellWidget(row, 0, item);
+ ui->tableWidget->resizeRowsToContents();
+}
+
+void ForcedLoadDialog::on_deleteRowButton_clicked()
+{
+ for (auto rowIndex: ui->tableWidget->selectionModel()->selectedRows()) {
+ int row = rowIndex.row();
+ auto widget = (ForcedLoadDialogWidget*)ui->tableWidget->cellWidget(row, 0);
+ if (!widget->getForced()){
+ ui->tableWidget->removeRow(row);
+ }
+ }
+}
diff --git a/src/forcedloaddialog.h b/src/forcedloaddialog.h
new file mode 100644
index 00000000..6a88bccf
--- /dev/null
+++ b/src/forcedloaddialog.h
@@ -0,0 +1,34 @@
+#ifndef FORCEDLOADDIALOG_H
+#define FORCEDLOADDIALOG_H
+
+#include <QDialog>
+#include <QPushButton>
+
+#include "executableinfo.h"
+#include "iplugingame.h"
+
+namespace Ui {
+class ForcedLoadDialog;
+}
+
+class ForcedLoadDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit ForcedLoadDialog(const MOBase::IPluginGame *game, QWidget *parent = nullptr);
+ ~ForcedLoadDialog();
+
+ void setValues(QList<MOBase::ExecutableForcedLoadSetting> &values);
+ QList<MOBase::ExecutableForcedLoadSetting> values();
+
+private slots:
+ void on_addRowButton_clicked();
+ void on_deleteRowButton_clicked();
+
+private:
+ Ui::ForcedLoadDialog *ui;
+ const MOBase::IPluginGame *m_GamePlugin;
+};
+
+#endif // FORCEDLOADDIALOG_H
diff --git a/src/forcedloaddialog.ui b/src/forcedloaddialog.ui
new file mode 100644
index 00000000..9c5b2d10
--- /dev/null
+++ b/src/forcedloaddialog.ui
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ForcedLoadDialog</class>
+ <widget class="QDialog" name="ForcedLoadDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>700</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Forced Load Settings</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTableWidget" name="tableWidget">
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="columnCount">
+ <number>1</number>
+ </property>
+ <attribute name="horizontalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="horizontalHeaderStretchLastSection">
+ <bool>true</bool>
+ </attribute>
+ <column/>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="addRowButton">
+ <property name="toolTip">
+ <string>Adds a row to the table.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Adds a row to the table.</string>
+ </property>
+ <property name="text">
+ <string>Add Row</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="deleteRowButton">
+ <property name="toolTip">
+ <string>Deletes the selected row from the table.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Deletes the selected row from the table.</string>
+ </property>
+ <property name="text">
+ <string>Delete Row</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>ForcedLoadDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>ForcedLoadDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/forcedloaddialogwidget.cpp b/src/forcedloaddialogwidget.cpp
new file mode 100644
index 00000000..10069c35
--- /dev/null
+++ b/src/forcedloaddialogwidget.cpp
@@ -0,0 +1,108 @@
+#include "forcedloaddialogwidget.h"
+#include "ui_forcedloaddialogwidget.h"
+
+#include <QFileDialog>
+
+#include "executableinfo.h"
+
+using namespace MOBase;
+
+ForcedLoadDialogWidget::ForcedLoadDialogWidget(const IPluginGame *game, QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::ForcedLoadDialogWidget),
+ m_GamePlugin(game)
+{
+ ui->setupUi(this);
+}
+
+ForcedLoadDialogWidget::~ForcedLoadDialogWidget()
+{
+ delete ui;
+}
+
+bool ForcedLoadDialogWidget::getEnabled()
+{
+ return ui->enabledBox->isChecked();
+}
+
+bool ForcedLoadDialogWidget::getForced()
+{
+ return m_Forced;
+}
+
+QString ForcedLoadDialogWidget::getLibraryPath()
+{
+ return ui->libraryPathEdit->text();
+}
+
+QString ForcedLoadDialogWidget::getProcess()
+{
+ return ui->processEdit->text();
+}
+
+void ForcedLoadDialogWidget::setEnabled(bool enabled)
+{
+ ui->enabledBox->setChecked(enabled);
+}
+
+void ForcedLoadDialogWidget::setForced(bool forced)
+{
+ m_Forced = forced;
+ ui->libraryPathBrowseButton->setEnabled(!forced);
+ ui->libraryPathEdit->setEnabled(!forced);
+ ui->processBrowseButton->setEnabled(!forced);
+ ui->processEdit->setEnabled(!forced);
+}
+
+void ForcedLoadDialogWidget::setLibraryPath(QString &path)
+{
+ ui->libraryPathEdit->setText(path);
+}
+
+void ForcedLoadDialogWidget::setProcess(QString &name)
+{
+ ui->processEdit->setText(name);
+}
+
+void ForcedLoadDialogWidget::on_enabledBox_toggled()
+{
+ // anything to do?
+}
+
+void ForcedLoadDialogWidget::on_libraryPathBrowseButton_clicked()
+{
+ QDir gameDir(m_GamePlugin->gameDirectory());
+ QString startPath = gameDir.absolutePath();
+ QString result = QFileDialog::getOpenFileName(nullptr, "Select a library...", startPath, "Dynamic link library (*.dll)", nullptr, QFileDialog::ReadOnly);
+ if (!result.isEmpty()) {
+ QFileInfo fileInfo(result);
+ QString relativePath = gameDir.relativeFilePath(fileInfo.filePath());
+ QString filePath = fileInfo.filePath();
+ if (!relativePath.startsWith("..")) {
+ filePath = relativePath;
+ }
+
+ if (fileInfo.exists()) {
+ ui->libraryPathEdit->setText(filePath);
+ } else {
+ qCritical("%ls does not exist", filePath.toStdWString().c_str());
+ }
+ }
+}
+
+void ForcedLoadDialogWidget::on_processBrowseButton_clicked()
+{
+ QDir gameDir(m_GamePlugin->gameDirectory());
+ QString startPath = gameDir.absolutePath();
+ QString result = QFileDialog::getOpenFileName(nullptr, "Select a process...", startPath, "Executable (*.exe)", nullptr, QFileDialog::ReadOnly);
+ if (!result.isEmpty()) {
+ QFileInfo fileInfo(result);
+ QString fileName = fileInfo.fileName();
+
+ if (fileInfo.exists()) {
+ ui->processEdit->setText(fileName);
+ } else {
+ qCritical("%ls does not exist", fileInfo.filePath().toStdWString().c_str());
+ }
+ }
+}
diff --git a/src/forcedloaddialogwidget.h b/src/forcedloaddialogwidget.h
new file mode 100644
index 00000000..eb7c3f4d
--- /dev/null
+++ b/src/forcedloaddialogwidget.h
@@ -0,0 +1,41 @@
+#ifndef FORCEDLOADDIALOGWIDGET_H
+#define FORCEDLOADDIALOGWIDGET_H
+
+#include <QWidget>
+#include "iplugingame.h"
+
+namespace Ui {
+class ForcedLoadDialogWidget;
+}
+
+class ForcedLoadDialogWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit ForcedLoadDialogWidget(const MOBase::IPluginGame *game, QWidget *parent = nullptr);
+ ~ForcedLoadDialogWidget();
+
+ bool getEnabled();
+ bool getForced();
+ QString getLibraryPath();
+ QString getProcess();
+
+ void setEnabled(bool enabled);
+ void setForced(bool forced);
+ void setLibraryPath(QString &path);
+ void setProcess(QString &name);
+
+private slots:
+ void on_enabledBox_toggled();
+ void on_libraryPathBrowseButton_clicked();
+ void on_processBrowseButton_clicked();
+
+private:
+ Ui::ForcedLoadDialogWidget *ui;
+ bool m_Forced;
+ const MOBase::IPluginGame *m_GamePlugin;
+
+};
+
+#endif // FORCEDLOADDIALOGWIDGET_H
diff --git a/src/forcedloaddialogwidget.ui b/src/forcedloaddialogwidget.ui
new file mode 100644
index 00000000..4be215eb
--- /dev/null
+++ b/src/forcedloaddialogwidget.ui
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ForcedLoadDialogWidget</class>
+ <widget class="QWidget" name="ForcedLoadDialogWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,2,0">
+ <item>
+ <widget class="QCheckBox" name="enabledBox">
+ <property name="toolTip">
+ <string>If checked, the specified library will be force loaded for the specified process.</string>
+ </property>
+ <property name="whatsThis">
+ <string>If checked, the specified library will be force loaded for the specified process.</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="processEdit">
+ <property name="toolTip">
+ <string>The name of the process that should be forced to load a library.</string>
+ </property>
+ <property name="whatsThis">
+ <string>The name of the process that should be forced to load a library.</string>
+ </property>
+ <property name="placeholderText">
+ <string>Process name</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="processBrowseButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Browse for a process.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Browse for a process.</string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="libraryPathEdit">
+ <property name="toolTip">
+ <string>The path to the library to be loaded. This may be a path relative to the managed game's directory or may be an absolute path to somewhere else.</string>
+ </property>
+ <property name="whatsThis">
+ <string>The path to the library to be loaded. This may be a path relative to the managed game's directory or may be an absolute path to somewhere else.</string>
+ </property>
+ <property name="placeholderText">
+ <string>Library to load</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="libraryPathBrowseButton">
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Browse for a library.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Browse for a library.</string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp
index 57c5e861..50e170d2 100644
--- a/src/installationmanager.cpp
+++ b/src/installationmanager.cpp
@@ -643,6 +643,9 @@ bool InstallationManager::doInstall(GuessedValue<QString> &modName, QString game
settingsFile.setValue("repository", repository);
settingsFile.setValue("url", m_URL);
+ //cleanup of m_URL or this will persist across installs.
+ m_URL = "";
+
if (!merge) {
// this does not clear the list we have in memory but the mod is going to have to be re-read anyway
// btw.: installedFiles were written with beginWriteArray but we can still clear it with beginGroup. nice
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index f2ad0470..6cae2d63 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -757,10 +757,14 @@ void MainWindow::createHelpWidget()
connect(helpAction, SIGNAL(triggered()), this, SLOT(helpTriggered()));
buttonMenu->addAction(helpAction);
- QAction *wikiAction = new QAction(tr("Documentation Wiki"), buttonMenu);
+ QAction *wikiAction = new QAction(tr("Documentation"), buttonMenu);
connect(wikiAction, SIGNAL(triggered()), this, SLOT(wikiTriggered()));
buttonMenu->addAction(wikiAction);
+ QAction *discordAction = new QAction(tr("Chat on Discord"), buttonMenu);
+ connect(discordAction, SIGNAL(triggered()), this, SLOT(discordTriggered()));
+ buttonMenu->addAction(discordAction);
+
QAction *issueAction = new QAction(tr("Report Issue"), buttonMenu);
connect(issueAction, SIGNAL(triggered()), this, SLOT(issueTriggered()));
buttonMenu->addAction(issueAction);
@@ -1175,15 +1179,20 @@ void MainWindow::startExeAction()
{
QAction *action = qobject_cast<QAction*>(sender());
if (action != nullptr) {
- const Executable &selectedExecutable(
- m_OrganizerCore.executablesList()->find(action->text()));
- QString customOverwrite= m_OrganizerCore.currentProfile()->setting("custom_overwrites", selectedExecutable.m_Title).toString();
+ const Executable &selectedExecutable(m_OrganizerCore.executablesList()->find(action->text()));
+ QString customOverwrite = m_OrganizerCore.currentProfile()->setting("custom_overwrites", selectedExecutable.m_Title).toString();
+ auto forcedLibraries = m_OrganizerCore.currentProfile()->determineForcedLibraries(selectedExecutable.m_Title);
+ if (!m_OrganizerCore.currentProfile()->forcedLibrariesEnabled(selectedExecutable.m_Title)) {
+ forcedLibraries.clear();
+ }
m_OrganizerCore.spawnBinary(
selectedExecutable.m_BinaryInfo, selectedExecutable.m_Arguments,
selectedExecutable.m_WorkingDirectory.length() != 0
? selectedExecutable.m_WorkingDirectory
: selectedExecutable.m_BinaryInfo.absolutePath(),
- selectedExecutable.m_SteamAppID, customOverwrite);
+ selectedExecutable.m_SteamAppID,
+ customOverwrite,
+ forcedLibraries);
} else {
qCritical("not an action?");
}
@@ -1848,12 +1857,14 @@ void MainWindow::processUpdates() {
}
}
- if (currentVersion > lastVersion)
- settings.setValue("version", currentVersion.toString());
- else if (currentVersion < lastVersion)
- qWarning() << tr("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.").arg(lastVersion.toString()).arg(currentVersion.toString()).toStdWString();
+ if (currentVersion > lastVersion) {
+ //NOP
+ } else if (currentVersion < lastVersion)
+ qWarning() << tr("Notice: Your current MO version (%1) is lower than the previously used one (%2). "
+ "The GUI may not downgrade gracefully, so you may experience oddities. "
+ "However, there should be no serious issues.").arg(currentVersion.toString()).arg(lastVersion.toString()).toStdWString();
+ //save version in all case
+ settings.setValue("version", currentVersion.toString());
}
void MainWindow::storeSettings(QSettings &settings) {
@@ -1974,12 +1985,18 @@ void MainWindow::on_startButton_clicked() {
try {
const Executable &selectedExecutable(getSelectedExecutable());
QString customOverwrite = m_OrganizerCore.currentProfile()->setting("custom_overwrites", selectedExecutable.m_Title).toString();
+ auto forcedLibraries = m_OrganizerCore.currentProfile()->determineForcedLibraries(selectedExecutable.m_Title);
+ if (!m_OrganizerCore.currentProfile()->forcedLibrariesEnabled(selectedExecutable.m_Title)) {
+ forcedLibraries.clear();
+ }
m_OrganizerCore.spawnBinary(
selectedExecutable.m_BinaryInfo, selectedExecutable.m_Arguments,
selectedExecutable.m_WorkingDirectory.length() != 0
? selectedExecutable.m_WorkingDirectory
: selectedExecutable.m_BinaryInfo.absolutePath(),
- selectedExecutable.m_SteamAppID, customOverwrite);
+ selectedExecutable.m_SteamAppID,
+ customOverwrite,
+ forcedLibraries);
} catch (...) {
ui->startButton->setEnabled(true);
throw;
@@ -2075,7 +2092,8 @@ bool MainWindow::modifyExecutablesDialog()
try {
EditExecutablesDialog dialog(*m_OrganizerCore.executablesList(),
*m_OrganizerCore.modList(),
- m_OrganizerCore.currentProfile());
+ m_OrganizerCore.currentProfile(),
+ m_OrganizerCore.managedGame());
QSettings &settings = m_OrganizerCore.settings().directInterface();
QString key = QString("geometry/%1").arg(dialog.objectName());
if (settings.contains(key)) {
@@ -2119,7 +2137,12 @@ void MainWindow::helpTriggered()
void MainWindow::wikiTriggered()
{
- QDesktopServices::openUrl(QUrl("http://wiki.step-project.com/Guide:Mod_Organizer"));
+ QDesktopServices::openUrl(QUrl("https://modorganizer2.github.io/"));
+}
+
+void MainWindow::discordTriggered()
+{
+ QDesktopServices::openUrl(QUrl("https://discord.gg/cYwdcxj"));
}
void MainWindow::issueTriggered()
@@ -3009,13 +3032,22 @@ void MainWindow::visitOnNexus_clicked()
return;
}
}
-
+ int row_idx;
+ ModInfo::Ptr info;
+ QString gameName;
+ QString webUrl;
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();
+ row_idx = idx.data(Qt::UserRole + 1).toInt();
+ info = ModInfo::getByIndex(row_idx);
+ int modID = info->getNexusID();
+ webUrl = info->getURL();
+ gameName = info->getGameName();
if (modID > 0) {
linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName));
}
+ else if (webUrl != "") {
+ linkClicked(webUrl);
+ }
}
}
else {
@@ -3031,11 +3063,43 @@ void MainWindow::visitOnNexus_clicked()
void MainWindow::visitWebPage_clicked()
{
- ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow);
- if (info->getURL() != "") {
- linkClicked(info->getURL());
- } else {
- MessageDialog::showMessage(tr("Web page 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 Web Pages"),
+ tr("You are trying to open %1 Web Pages. Are you sure you want to do this?").arg(count),
+ QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) {
+ return;
+ }
+ }
+ int row_idx;
+ ModInfo::Ptr info;
+ QString gameName;
+ QString webUrl;
+ for (QModelIndex idx : selection->selectedRows()) {
+ row_idx = idx.data(Qt::UserRole + 1).toInt();
+ info = ModInfo::getByIndex(row_idx);
+ int modID = info->getNexusID();
+ webUrl = info->getURL();
+ gameName = info->getGameName();
+ if (modID > 0) {
+ linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName));
+ }
+ else if (webUrl != "") {
+ linkClicked(webUrl);
+ }
+ }
+ }
+ else {
+ ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow);
+ if (info->getURL() != "") {
+ linkClicked(info->getURL());
+ }
+ else {
+ MessageDialog::showMessage(tr("Web page for this mod is unknown"), this);
+ }
}
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 8b774c93..cd22dbfa 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -405,6 +405,7 @@ private slots:
void helpTriggered();
void issueTriggered();
void wikiTriggered();
+ void discordTriggered();
void tutorialTriggered();
void extractBSATriggered();
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index d287b8bb..e30466ac 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -1326,7 +1326,7 @@ p, li { white-space: pre-wrap; }
<item>
<layout class="QVBoxLayout" name="downloadLayout">
<item>
- <widget class="DownloadListWidget" name="downloadView" native="true">
+ <widget class="DownloadListWidget" name="downloadView">
<property name="minimumSize">
<size>
<width>320</width>
@@ -1345,19 +1345,31 @@ p, li { white-space: pre-wrap; }
<property name="whatsThis">
<string>This is a list of mods you downloaded from Nexus. Double click one to install it. You can also drag an archive into here.</string>
</property>
- <property name="dragEnabled" stdset="0">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
+ <property name="dragEnabled">
<bool>true</bool>
</property>
- <property name="alternatingRowColors" stdset="0">
+ <property name="dragDropMode">
+ <enum>QAbstractItemView::DragDrop</enum>
+ </property>
+ <property name="defaultDropAction">
+ <enum>Qt::MoveAction</enum>
+ </property>
+ <property name="alternatingRowColors">
<bool>true</bool>
</property>
- <property name="indentation" stdset="0">
+ <property name="verticalScrollMode">
+ <enum>QAbstractItemView::ScrollPerPixel</enum>
+ </property>
+ <property name="indentation">
<number>0</number>
</property>
- <property name="itemsExpandable" stdset="0">
+ <property name="itemsExpandable">
<bool>false</bool>
</property>
- <property name="sortingEnabled" stdset="0">
+ <property name="sortingEnabled">
<bool>true</bool>
</property>
</widget>
@@ -1678,7 +1690,7 @@ Right now this has very limited functionality</string>
</customwidget>
<customwidget>
<class>DownloadListWidget</class>
- <extends>QWidget</extends>
+ <extends>QTreeView</extends>
<header>downloadlistwidget.h</header>
</customwidget>
</customwidgets>
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 02ace33f..d2e5e84f 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -193,7 +193,11 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
ModInfoDialog::~ModInfoDialog()
{
m_ModInfo->setComments(ui->commentsEdit->text());
- m_ModInfo->setNotes(ui->notesEdit->toPlainText());
+ //Avoid saving html stump if notes field is empty.
+ if (ui->notesEdit->toPlainText().isEmpty())
+ m_ModInfo->setNotes(ui->notesEdit->toPlainText());
+ else
+ m_ModInfo->setNotes(ui->notesEdit->toHtml());
saveCategories(ui->categoriesTree->invisibleRootItem());
saveIniTweaks(); // ini tweaks are written to the ini file directly. This is the only information not managed by ModInfo
delete ui->descriptionView->page();
@@ -571,6 +575,7 @@ void ModInfoDialog::openIniFile(const QString &fileName)
void ModInfoDialog::saveIniTweaks()
{
+ m_Settings->remove("INI Tweaks");
m_Settings->beginWriteArray("INI Tweaks");
int countEnabled = 0;
@@ -933,6 +938,7 @@ void ModInfoDialog::activateNexusTab()
QLineEdit *versionEdit = findChild<QLineEdit*>("versionEdit");
QString currentVersion = m_Settings->value("version", "0.0").toString();
versionEdit->setText(currentVersion);
+ ui->customUrlLineEdit->setText(m_ModInfo->getURL());
}
@@ -976,6 +982,10 @@ void ModInfoDialog::on_versionEdit_editingFinished()
updateVersionColor();
}
+void ModInfoDialog::on_customUrlLineEdit_editingFinished()
+{
+ m_ModInfo->setURL(ui->customUrlLineEdit->text());
+}
bool ModInfoDialog::recursiveDelete(const QModelIndex &index)
{
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 52768649..4c731c00 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -186,6 +186,7 @@ private slots:
void on_modIDEdit_editingFinished();
void on_sourceGameEdit_currentIndexChanged(int);
void on_versionEdit_editingFinished();
+ void on_customUrlLineEdit_editingFinished();
void on_iniFileView_textChanged();
void on_textFileView_textChanged();
void on_tabWidget_currentChanged(int index);
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index 736214f4..0211e704 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -774,6 +774,20 @@ p, li { white-space: pre-wrap; }
</item>
</layout>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_14">
+ <item>
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>Web page URL (only used if invalid NexusID) :</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="customUrlLineEdit"/>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="tabNotes">
@@ -802,6 +816,9 @@ p, li { white-space: pre-wrap; }
<property name="whatsThis">
<string>Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column.</string>
</property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextEditable|Qt::TextEditorInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
<property name="placeholderText">
<string>Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column.</string>
</property>
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp
index 45c3985b..185f0495 100644
--- a/src/modinforegular.cpp
+++ b/src/modinforegular.cpp
@@ -162,6 +162,7 @@ void ModInfoRegular::saveMeta()
metaFile.setValue("endorsed", m_EndorsedState);
}
+ metaFile.remove("installedFiles");
metaFile.beginWriteArray("installedFiles");
int idx = 0;
for (auto iter = m_InstalledFileIDs.begin(); iter != m_InstalledFileIDs.end(); ++iter) {
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 8f6bd47e..178b4b16 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -987,7 +987,7 @@ 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", qUtf8Printable(url.toLocalFile()));
+ //qDebug("URL drop requested: %s", qUtf8Printable(url.toLocalFile()));
if (!url.isLocalFile()) {
qDebug("URL drop ignored: Not a local file.");
continue;
@@ -1009,6 +1009,10 @@ bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &pa
}
}
+ if (!modInfo->isValid()) {
+ modInfo->testValid();
+ }
+
return true;
}
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp
index 5797d5af..b1bb9013 100644
--- a/src/modlistsortproxy.cpp
+++ b/src/modlistsortproxy.cpp
@@ -58,7 +58,8 @@ void ModListSortProxy::updateFilterActive()
void ModListSortProxy::setCategoryFilter(const std::vector<int> &categories)
{
- if (categories != m_CategoryFilter) {
+ //avoid refreshing the filter unless we are checking all mods for update.
+ if (categories != m_CategoryFilter || (!categories.empty() && categories.at(0) == CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE)) {
m_CategoryFilter = categories;
updateFilterActive();
invalidate();
@@ -361,59 +362,90 @@ bool ModListSortProxy::filterMatchesModOr(ModInfo::Ptr info, bool enabled) const
bool ModListSortProxy::filterMatchesMod(ModInfo::Ptr info, bool enabled) const
{
- bool display = true;
if (!m_CurrentFilter.isEmpty()) {
- display = false;
+ bool display = false;
+ QString filterCopy = QString(m_CurrentFilter);
+ filterCopy.replace("||", ";").replace("OR", ";").replace("|", ";");
+ QStringList ORList = filterCopy.split(";", QString::SkipEmptyParts);
- // Search by name
- if (!display &&
- m_EnabledColumns[ModList::COL_NAME] &&
- info->name().contains(m_CurrentFilter, Qt::CaseInsensitive)) {
- display = true;
- }
+ bool segmentGood = true;
- // Search by notes
- if (!display &&
- m_EnabledColumns[ModList::COL_NOTES] &&
- info->comments().contains(m_CurrentFilter, Qt::CaseInsensitive)) {
- display = true;
- }
+ //split in ORSegments that internally use AND logic
+ for (auto& ORSegment : ORList) {
+ QStringList ANDKeywords = ORSegment.split(" ", QString::SkipEmptyParts);
+ segmentGood = true;
+ bool foundKeyword = false;
+
+ //check each word in the segment for match, each word needs to be matched but it doesn't matter where.
+ for (auto& currentKeyword : ANDKeywords) {
+ foundKeyword = false;
- // 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;
+ //search keyword in name
+ if (m_EnabledColumns[ModList::COL_NAME] &&
+ info->name().contains(currentKeyword, Qt::CaseInsensitive)) {
+ foundKeyword = true;
+ }
+
+ // Search by notes
+ if (!foundKeyword &&
+ m_EnabledColumns[ModList::COL_NOTES] &&
+ info->comments().contains(currentKeyword, Qt::CaseInsensitive)) {
+ foundKeyword = true;
+ }
+
+ // Search by categories
+ if (!foundKeyword &&
+ m_EnabledColumns[ModList::COL_CATEGORY]) {
+ for (auto category : info->categories()) {
+ if (category.contains(currentKeyword, Qt::CaseInsensitive)) {
+ foundKeyword = 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;
+ // Search by Nexus ID
+ if (!foundKeyword &&
+ m_EnabledColumns[ModList::COL_MODID]) {
+ bool ok;
+ int filterID = currentKeyword.toInt(&ok);
+ if (ok) {
+ int modID = info->getNexusID();
+ while (modID > 0) {
+ if (modID == filterID) {
+ foundKeyword = true;
+ break;
+ }
+ modID = (int)(modID / 10);
+ }
+ }
+ }
+
+ if (!foundKeyword) {
+ //currentKeword is missing from everything, AND fails and we need to check next ORsegment
+ segmentGood = false;
break;
}
+
+ }//for ANDKeywords loop
+
+ if (segmentGood) {
+ //the last AND loop didn't break so the ORSegments is true so mod matches filter
+ display = true;
+ break;
}
+
+ }//for ORList loop
+
+ if (!display) {
+ return false;
}
- }
- if (!display) {
- return false;
- }
+ }//if (!m_CurrentFilter.isEmpty())
if (m_FilterMode == FILTER_AND) {
return filterMatchesModAnd(info, enabled);
- } else {
+ }
+ else {
return filterMatchesModOr(info, enabled);
}
}
diff --git a/src/organizer.pro b/src/organizer.pro
index b8e79e0c..ddf676f2 100644
--- a/src/organizer.pro
+++ b/src/organizer.pro
@@ -92,7 +92,9 @@ SOURCES += \
modinfooverwrite.cpp \
modinfoforeign.cpp \
listdialog.cpp \
- lcdnumber.cpp
+ lcdnumber.cpp \
+ forcedloaddialog.cpp \
+ forcedloaddialogwidget.cpp
HEADERS += \
@@ -169,7 +171,9 @@ HEADERS += \
modinfooverwrite.h \
modinfoforeign.h \
listdialog.h \
- lcdnumber.h
+ lcdnumber.h \
+ forcedloaddialog.h \
+ forcedloaddialogwidget.h
FORMS += \
transfersavesdialog.ui \
@@ -197,7 +201,9 @@ FORMS += \
previewdialog.ui \
browserdialog.ui \
aboutdialog.ui \
- listdialog.ui
+ listdialog.ui \
+ forcedloaddialog.ui \
+ forcedloaddialogwidget.ui
RESOURCES += \
resources.qrc \
diff --git a/src/organizer_en.ts b/src/organizer_en.ts
index 299ffe6a..91faa4d0 100644
--- a/src/organizer_en.ts
+++ b/src/organizer_en.ts
@@ -27,7 +27,6 @@
<message>
<location filename="aboutdialog.ui" line="160"/>
<source>Lead Developers/ Maintainers</source>
- <oldsource>Current Maintainers</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -116,7 +115,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="486"/>
+ <location filename="aboutdialog.ui" line="374"/>
+ <source>Tannin (Original Creator)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="aboutdialog.ui" line="491"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -980,92 +984,107 @@ Right now the only case I know of where this needs to be overwritten is for the
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="197"/>
+ <location filename="editexecutablesdialog.ui" line="199"/>
+ <source>If this is enabled, the configured libraries will be automatically loaded when this executable is launched.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="editexecutablesdialog.ui" line="202"/>
+ <source>Force Load Libraries (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="editexecutablesdialog.ui" line="225"/>
+ <source>Configure Libraries</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="editexecutablesdialog.ui" line="234"/>
<source>Use Application&apos;s Icon for shortcuts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="204"/>
+ <location filename="editexecutablesdialog.ui" line="241"/>
<source>(*) This setting is profile-specific</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="213"/>
- <location filename="editexecutablesdialog.ui" line="216"/>
+ <location filename="editexecutablesdialog.ui" line="250"/>
+ <location filename="editexecutablesdialog.ui" line="253"/>
<source>Add an executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="219"/>
- <location filename="editexecutablesdialog.cpp" line="217"/>
+ <location filename="editexecutablesdialog.ui" line="256"/>
+ <location filename="editexecutablesdialog.cpp" line="240"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="230"/>
- <location filename="editexecutablesdialog.ui" line="233"/>
+ <location filename="editexecutablesdialog.ui" line="267"/>
+ <location filename="editexecutablesdialog.ui" line="270"/>
<source>Remove the selected executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="236"/>
+ <location filename="editexecutablesdialog.ui" line="273"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="264"/>
+ <location filename="editexecutablesdialog.ui" line="301"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="146"/>
+ <location filename="editexecutablesdialog.cpp" line="169"/>
<source>Select a binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="147"/>
+ <location filename="editexecutablesdialog.cpp" line="170"/>
<source>Executable (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="172"/>
+ <location filename="editexecutablesdialog.cpp" line="195"/>
<source>Java (32-bit) required</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="173"/>
+ <location filename="editexecutablesdialog.cpp" line="196"/>
<source>MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="189"/>
+ <location filename="editexecutablesdialog.cpp" line="212"/>
<source>Select a directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="196"/>
+ <location filename="editexecutablesdialog.cpp" line="219"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="196"/>
+ <location filename="editexecutablesdialog.cpp" line="219"/>
<source>Really remove &quot;%1&quot; from executables?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="221"/>
+ <location filename="editexecutablesdialog.cpp" line="244"/>
<source>Modify</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="267"/>
- <location filename="editexecutablesdialog.cpp" line="287"/>
+ <location filename="editexecutablesdialog.cpp" line="306"/>
+ <location filename="editexecutablesdialog.cpp" line="326"/>
<source>Save Changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="268"/>
- <location filename="editexecutablesdialog.cpp" line="288"/>
+ <location filename="editexecutablesdialog.cpp" line="307"/>
+ <location filename="editexecutablesdialog.cpp" line="327"/>
<source>You made changes to the current executable, do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
@@ -1118,6 +1137,85 @@ Right now the only case I know of where this needs to be overwritten is for the
</message>
</context>
<context>
+ <name>ForcedLoadDialog</name>
+ <message>
+ <location filename="forcedloaddialog.ui" line="14"/>
+ <source>Forced Load Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="45"/>
+ <location filename="forcedloaddialog.ui" line="48"/>
+ <source>Adds a row to the table.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="51"/>
+ <source>Add Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="58"/>
+ <location filename="forcedloaddialog.ui" line="61"/>
+ <source>Deletes the selected row from the table.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="64"/>
+ <source>Delete Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ForcedLoadDialogWidget</name>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="23"/>
+ <location filename="forcedloaddialogwidget.ui" line="26"/>
+ <source>If checked, the specified library will be force loaded for the specified process.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="36"/>
+ <location filename="forcedloaddialogwidget.ui" line="39"/>
+ <source>The name of the process that should be forced to load a library.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="42"/>
+ <source>Process name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="67"/>
+ <location filename="forcedloaddialogwidget.ui" line="70"/>
+ <source>Browse for a process.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="73"/>
+ <location filename="forcedloaddialogwidget.ui" line="105"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="80"/>
+ <location filename="forcedloaddialogwidget.ui" line="83"/>
+ <source>The path to the library to be loaded. This may be a path relative to the managed game&apos;s directory or may be an absolute path to somewhere else.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="86"/>
+ <source>Library to load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="99"/>
+ <location filename="forcedloaddialogwidget.ui" line="102"/>
+ <source>Browse for a library.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>InstallDialog</name>
<message>
<location filename="installdialog.ui" line="20"/>
@@ -1223,58 +1321,58 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="706"/>
+ <location filename="installationmanager.cpp" line="709"/>
<source>File format &quot;%1&quot; not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="868"/>
+ <location filename="installationmanager.cpp" line="871"/>
<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="879"/>
+ <location filename="installationmanager.cpp" line="882"/>
<source>no error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="882"/>
+ <location filename="installationmanager.cpp" line="885"/>
<source>7z.dll not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="885"/>
+ <location filename="installationmanager.cpp" line="888"/>
<source>7z.dll isn&apos;t valid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="888"/>
+ <location filename="installationmanager.cpp" line="891"/>
<source>archive not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="891"/>
+ <location filename="installationmanager.cpp" line="894"/>
<source>failed to open archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="894"/>
+ <location filename="installationmanager.cpp" line="897"/>
<source>unsupported archive type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="897"/>
+ <location filename="installationmanager.cpp" line="900"/>
<source>internal library error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="900"/>
+ <location filename="installationmanager.cpp" line="903"/>
<source>archive invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="904"/>
+ <location filename="installationmanager.cpp" line="907"/>
<source>unknown archive error</source>
<translation type="unfinished"></translation>
</message>
@@ -1457,7 +1555,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="mainwindow.ui" line="287"/>
<location filename="mainwindow.ui" line="908"/>
- <location filename="mainwindow.cpp" line="4346"/>
+ <location filename="mainwindow.cpp" line="4403"/>
<source>Create Backup</source>
<translation type="unfinished"></translation>
</message>
@@ -1486,7 +1584,7 @@ p, li { white-space: pre-wrap; }
<location filename="mainwindow.ui" line="523"/>
<location filename="mainwindow.ui" line="644"/>
<location filename="mainwindow.ui" line="1060"/>
- <location filename="mainwindow.ui" line="1369"/>
+ <location filename="mainwindow.ui" line="1375"/>
<source>Filter</source>
<translation type="unfinished"></translation>
</message>
@@ -1633,8 +1731,8 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="mainwindow.ui" line="1172"/>
<location filename="mainwindow.ui" line="1295"/>
- <location filename="mainwindow.cpp" line="4221"/>
- <location filename="mainwindow.cpp" line="5128"/>
+ <location filename="mainwindow.cpp" line="4278"/>
+ <location filename="mainwindow.cpp" line="5185"/>
<source>Refresh</source>
<translation type="unfinished"></translation>
</message>
@@ -1696,145 +1794,145 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1349"/>
+ <location filename="mainwindow.ui" line="1355"/>
<source>Show Hidden</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1414"/>
+ <location filename="mainwindow.ui" line="1420"/>
<source>Tool Bar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1457"/>
+ <location filename="mainwindow.ui" line="1463"/>
<source>Install Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1460"/>
+ <location filename="mainwindow.ui" line="1466"/>
<source>Install &amp;Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1463"/>
+ <location filename="mainwindow.ui" line="1469"/>
<source>Install a new mod from an archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1466"/>
+ <location filename="mainwindow.ui" line="1472"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1475"/>
+ <location filename="mainwindow.ui" line="1481"/>
<source>Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1478"/>
+ <location filename="mainwindow.ui" line="1484"/>
<source>&amp;Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1481"/>
+ <location filename="mainwindow.ui" line="1487"/>
<source>Configure Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1484"/>
+ <location filename="mainwindow.ui" line="1490"/>
<source>Ctrl+P</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1493"/>
+ <location filename="mainwindow.ui" line="1499"/>
<source>Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1496"/>
+ <location filename="mainwindow.ui" line="1502"/>
<source>&amp;Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1499"/>
+ <location filename="mainwindow.ui" line="1505"/>
<source>Configure the executables that can be started through Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1502"/>
+ <location filename="mainwindow.ui" line="1508"/>
<source>Ctrl+E</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1511"/>
<location filename="mainwindow.ui" line="1517"/>
+ <location filename="mainwindow.ui" line="1523"/>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1514"/>
+ <location filename="mainwindow.ui" line="1520"/>
<source>&amp;Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1520"/>
+ <location filename="mainwindow.ui" line="1526"/>
<source>Ctrl+I</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1529"/>
+ <location filename="mainwindow.ui" line="1535"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1532"/>
+ <location filename="mainwindow.ui" line="1538"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1535"/>
+ <location filename="mainwindow.ui" line="1541"/>
<source>Configure settings and workarounds</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1538"/>
+ <location filename="mainwindow.ui" line="1544"/>
<source>Ctrl+S</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1547"/>
+ <location filename="mainwindow.ui" line="1553"/>
<source>Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1550"/>
+ <location filename="mainwindow.ui" line="1556"/>
<source>Search nexus network for more mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1553"/>
+ <location filename="mainwindow.ui" line="1559"/>
<source>Ctrl+N</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1565"/>
- <location filename="mainwindow.cpp" line="5059"/>
+ <location filename="mainwindow.ui" line="1571"/>
+ <location filename="mainwindow.cpp" line="5116"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1568"/>
+ <location filename="mainwindow.ui" line="1574"/>
<source>Mod Organizer is up-to-date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1580"/>
+ <location filename="mainwindow.ui" line="1586"/>
<location filename="mainwindow.cpp" line="661"/>
<source>No Problems</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1583"/>
+ <location filename="mainwindow.ui" line="1589"/>
<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!
@@ -1842,39 +1940,39 @@ Right now this has very limited functionality</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1595"/>
- <location filename="mainwindow.ui" line="1598"/>
+ <location filename="mainwindow.ui" line="1601"/>
+ <location filename="mainwindow.ui" line="1604"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1601"/>
+ <location filename="mainwindow.ui" line="1607"/>
<source>Ctrl+H</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1610"/>
+ <location filename="mainwindow.ui" line="1616"/>
<source>Endorse MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1613"/>
- <location filename="mainwindow.cpp" line="5151"/>
+ <location filename="mainwindow.ui" line="1619"/>
+ <location filename="mainwindow.cpp" line="5208"/>
<source>Endorse Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1618"/>
+ <location filename="mainwindow.ui" line="1624"/>
<source>Copy Log to Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1627"/>
+ <location filename="mainwindow.ui" line="1633"/>
<source>Change Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1630"/>
+ <location filename="mainwindow.ui" line="1636"/>
<source>Open the Instance selection dialog to manage a different Game</source>
<translation type="unfinished"></translation>
</message>
@@ -1927,8 +2025,8 @@ Error: %1</source>
</message>
<message>
<location filename="mainwindow.cpp" line="724"/>
- <location filename="mainwindow.cpp" line="4356"/>
- <location filename="mainwindow.cpp" line="4360"/>
+ <location filename="mainwindow.cpp" line="4413"/>
+ <location filename="mainwindow.cpp" line="4417"/>
<source>Endorse</source>
<translation type="unfinished"></translation>
</message>
@@ -2018,716 +2116,726 @@ Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1340"/>
+ <location filename="mainwindow.cpp" line="1345"/>
<source>Also in: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1351"/>
+ <location filename="mainwindow.cpp" line="1356"/>
<source>No conflict</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1436"/>
+ <location filename="mainwindow.cpp" line="1441"/>
<source>&lt;Edit...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1714"/>
+ <location filename="mainwindow.cpp" line="1719"/>
<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="1776"/>
+ <location filename="mainwindow.cpp" line="1781"/>
<source>Activating Network Proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1837"/>
- <source>Notice: Your current MO version (%1) is lower than the previous version (%2).&lt;br&gt;The GUI may not downgrade gracefully, so you may experience oddities.&lt;br&gt;However, there should be no serious issues.</source>
+ <location filename="mainwindow.cpp" line="1842"/>
+ <source>Notice: Your current MO version (%1) is lower than the previously used one (%2). The GUI may not downgrade gracefully, so you may experience oddities. However, there should be no serious issues.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1941"/>
+ <location filename="mainwindow.cpp" line="1948"/>
<source>Choose Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1942"/>
+ <location filename="mainwindow.cpp" line="1949"/>
<source>Mod Archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2117"/>
+ <location filename="mainwindow.cpp" line="2131"/>
<source>Start Tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2118"/>
+ <location filename="mainwindow.cpp" line="2132"/>
<source>You&apos;re about to start a tutorial. For technical reasons it&apos;s not possible to end the tutorial early. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2277"/>
+ <location filename="mainwindow.cpp" line="2291"/>
<source>failed to spawn notepad.exe: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2317"/>
+ <location filename="mainwindow.cpp" line="2331"/>
<source>failed to change origin name: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2341"/>
+ <location filename="mainwindow.cpp" line="2355"/>
<source>failed to move &quot;%1&quot; from mod &quot;%2&quot; to &quot;%3&quot;: %4</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2365"/>
+ <location filename="mainwindow.cpp" line="2379"/>
<source>&lt;Contains %1&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2400"/>
+ <location filename="mainwindow.cpp" line="2414"/>
<source>&lt;Checked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2401"/>
+ <location filename="mainwindow.cpp" line="2415"/>
<source>&lt;Unchecked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2402"/>
+ <location filename="mainwindow.cpp" line="2416"/>
<source>&lt;Update&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2403"/>
+ <location filename="mainwindow.cpp" line="2417"/>
<source>&lt;Mod Backup&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2404"/>
+ <location filename="mainwindow.cpp" line="2418"/>
<source>&lt;Managed by MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2405"/>
+ <location filename="mainwindow.cpp" line="2419"/>
<source>&lt;Managed outside MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2406"/>
+ <location filename="mainwindow.cpp" line="2420"/>
<source>&lt;No category&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2407"/>
+ <location filename="mainwindow.cpp" line="2421"/>
<source>&lt;Conflicted&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2408"/>
+ <location filename="mainwindow.cpp" line="2422"/>
<source>&lt;Not Endorsed&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2454"/>
+ <location filename="mainwindow.cpp" line="2468"/>
<source>failed to rename mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2467"/>
+ <location filename="mainwindow.cpp" line="2481"/>
<source>Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2468"/>
+ <location filename="mainwindow.cpp" line="2482"/>
<source>This will replace the existing mod &quot;%1&quot;. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2471"/>
+ <location filename="mainwindow.cpp" line="2485"/>
<source>failed to remove mod &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2475"/>
- <location filename="mainwindow.cpp" line="4891"/>
- <location filename="mainwindow.cpp" line="4915"/>
+ <location filename="mainwindow.cpp" line="2489"/>
+ <location filename="mainwindow.cpp" line="4948"/>
+ <location filename="mainwindow.cpp" line="4972"/>
<source>failed to rename &quot;%1&quot; to &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2542"/>
- <location filename="mainwindow.cpp" line="3919"/>
- <location filename="mainwindow.cpp" line="3927"/>
- <location filename="mainwindow.cpp" line="4469"/>
+ <location filename="mainwindow.cpp" line="2556"/>
+ <location filename="mainwindow.cpp" line="3976"/>
+ <location filename="mainwindow.cpp" line="3984"/>
+ <location filename="mainwindow.cpp" line="4526"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2543"/>
+ <location filename="mainwindow.cpp" line="2557"/>
<source>Remove the following mods?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2556"/>
+ <location filename="mainwindow.cpp" line="2572"/>
<source>failed to remove mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2588"/>
- <location filename="mainwindow.cpp" line="2591"/>
- <location filename="mainwindow.cpp" line="2601"/>
+ <location filename="mainwindow.cpp" line="2604"/>
+ <location filename="mainwindow.cpp" line="2607"/>
+ <location filename="mainwindow.cpp" line="2617"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2588"/>
+ <location filename="mainwindow.cpp" line="2604"/>
<source>Installation file no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2592"/>
+ <location filename="mainwindow.cpp" line="2608"/>
<source>Mods installed with old versions of MO can&apos;t be reinstalled in this way.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2602"/>
+ <location filename="mainwindow.cpp" line="2618"/>
<source>Failed to create backup.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2619"/>
+ <location filename="mainwindow.cpp" line="2635"/>
<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="2635"/>
- <location filename="mainwindow.cpp" line="2661"/>
- <location filename="mainwindow.cpp" line="2695"/>
- <location filename="mainwindow.cpp" line="2721"/>
+ <location filename="mainwindow.cpp" line="2651"/>
+ <location filename="mainwindow.cpp" line="2677"/>
+ <location filename="mainwindow.cpp" line="2711"/>
+ <location filename="mainwindow.cpp" line="2737"/>
<source>You need to be logged in with Nexus to endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2646"/>
- <location filename="mainwindow.cpp" line="2654"/>
+ <location filename="mainwindow.cpp" line="2662"/>
+ <location filename="mainwindow.cpp" line="2670"/>
<source>Endorsing multiple mods will take a while. Please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2706"/>
- <location filename="mainwindow.cpp" line="2714"/>
+ <location filename="mainwindow.cpp" line="2722"/>
+ <location filename="mainwindow.cpp" line="2730"/>
<source>Unendorsing multiple mods will take a while. Please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2782"/>
+ <location filename="mainwindow.cpp" line="2798"/>
<source>Failed to display overwrite dialog: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2969"/>
+ <location filename="mainwindow.cpp" line="2985"/>
<source>Opening Nexus Links</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2970"/>
+ <location filename="mainwindow.cpp" line="2986"/>
<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="2990"/>
+ <location filename="mainwindow.cpp" line="3015"/>
<source>Nexus ID for this Mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3001"/>
+ <location filename="mainwindow.cpp" line="3027"/>
+ <source>Opening Web Pages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3028"/>
+ <source>You are trying to open %1 Web Pages. Are you sure you want to do this?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3057"/>
<source>Web page for this mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3183"/>
+ <location filename="mainwindow.cpp" line="3240"/>
<source>&lt;table cellspacing=&quot;5&quot;&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;All&lt;/th&gt;&lt;th&gt;Visible&lt;/th&gt;&lt;tr&gt;&lt;td&gt;Enabled mods:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%1 / %2&lt;/td&gt;&lt;td align=right&gt;%3 / %4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unmanaged/DLCs:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%5&lt;/td&gt;&lt;td align=right&gt;%6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mod backups:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%7&lt;/td&gt;&lt;td align=right&gt;%8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Separators:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%9&lt;/td&gt;&lt;td align=right&gt;%10&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3238"/>
- <source>&lt;table cellspacing=&quot;4&quot;&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Active&lt;/th&gt;&lt;th&gt;Total&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active plugins:&lt;/td&gt;&lt;td align=right&gt;%1&lt;/td&gt;&lt;td align=right&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active ESMs:&lt;/td&gt;&lt;td align=right&gt;%3&lt;/td&gt;&lt;td align=right&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active ESPs:&lt;/td&gt;&lt;td align=right&gt;%7&lt;/td&gt;&lt;td align=right&gt;%8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active ESMs+ESPs:&lt;/td&gt;&lt;td align=right&gt;%9&lt;/td&gt;&lt;td align=right&gt;%10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active ESLs:&lt;/td&gt;&lt;td align=right&gt;%5&lt;/td&gt;&lt;td align=right&gt;%6&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
+ <location filename="mainwindow.cpp" line="3295"/>
+ <source>&lt;table cellspacing=&quot;6&quot;&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Active &lt;/th&gt;&lt;th&gt;Total&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;All plugins:&lt;/td&gt;&lt;td align=right&gt;%1 &lt;/td&gt;&lt;td align=right&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESMs:&lt;/td&gt;&lt;td align=right&gt;%3 &lt;/td&gt;&lt;td align=right&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESPs:&lt;/td&gt;&lt;td align=right&gt;%7 &lt;/td&gt;&lt;td align=right&gt;%8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESMs+ESPs:&lt;/td&gt;&lt;td align=right&gt;%9 &lt;/td&gt;&lt;td align=right&gt;%10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESLs:&lt;/td&gt;&lt;td align=right&gt;%5 &lt;/td&gt;&lt;td align=right&gt;%6&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3270"/>
- <location filename="mainwindow.cpp" line="3408"/>
- <location filename="mainwindow.cpp" line="4283"/>
+ <location filename="mainwindow.cpp" line="3327"/>
+ <location filename="mainwindow.cpp" line="3465"/>
+ <location filename="mainwindow.cpp" line="4340"/>
<source>Create Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3271"/>
+ <location filename="mainwindow.cpp" line="3328"/>
<source>This will create an empty mod.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3280"/>
- <location filename="mainwindow.cpp" line="3418"/>
+ <location filename="mainwindow.cpp" line="3337"/>
+ <location filename="mainwindow.cpp" line="3475"/>
<source>A mod with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3308"/>
+ <location filename="mainwindow.cpp" line="3365"/>
<source>Create Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3309"/>
+ <location filename="mainwindow.cpp" line="3366"/>
<source>This will create a new separator.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3316"/>
+ <location filename="mainwindow.cpp" line="3373"/>
<source>A separator with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3409"/>
+ <location filename="mainwindow.cpp" line="3466"/>
<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="3450"/>
- <location filename="mainwindow.cpp" line="5482"/>
+ <location filename="mainwindow.cpp" line="3507"/>
+ <location filename="mainwindow.cpp" line="5539"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3451"/>
+ <location filename="mainwindow.cpp" line="3508"/>
<source>About to recursively delete:
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3813"/>
+ <location filename="mainwindow.cpp" line="3870"/>
<source>Not logged in, endorsement information will be wrong</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3821"/>
+ <location filename="mainwindow.cpp" line="3878"/>
<source>Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3822"/>
+ <location filename="mainwindow.cpp" line="3879"/>
<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="3842"/>
- <location filename="mainwindow.cpp" line="5027"/>
+ <location filename="mainwindow.cpp" line="3899"/>
+ <location filename="mainwindow.cpp" line="5084"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3843"/>
+ <location filename="mainwindow.cpp" line="3900"/>
<source>I don&apos;t know a versioning scheme where %1 is newer than %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3919"/>
+ <location filename="mainwindow.cpp" line="3976"/>
<source>Really enable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3927"/>
+ <location filename="mainwindow.cpp" line="3984"/>
<source>Really disable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4007"/>
+ <location filename="mainwindow.cpp" line="4064"/>
<source>Export to csv</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4010"/>
+ <location filename="mainwindow.cpp" line="4067"/>
<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="4013"/>
+ <location filename="mainwindow.cpp" line="4070"/>
<source>Select what mods you want export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4014"/>
+ <location filename="mainwindow.cpp" line="4071"/>
<source>All installed mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4015"/>
+ <location filename="mainwindow.cpp" line="4072"/>
<source>Only active (checked) mods from your current profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4016"/>
+ <location filename="mainwindow.cpp" line="4073"/>
<source>All currently visible mods in the mod list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4037"/>
+ <location filename="mainwindow.cpp" line="4094"/>
<source>Choose what Columns to export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4040"/>
+ <location filename="mainwindow.cpp" line="4097"/>
<source>Mod_Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4042"/>
+ <location filename="mainwindow.cpp" line="4099"/>
<source>Mod_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4044"/>
+ <location filename="mainwindow.cpp" line="4101"/>
<source>Notes_column</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4045"/>
+ <location filename="mainwindow.cpp" line="4102"/>
<source>Mod_Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4046"/>
+ <location filename="mainwindow.cpp" line="4103"/>
<source>Primary_Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4047"/>
+ <location filename="mainwindow.cpp" line="4104"/>
<source>Nexus_ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4048"/>
+ <location filename="mainwindow.cpp" line="4105"/>
<source>Mod_Nexus_URL</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4049"/>
+ <location filename="mainwindow.cpp" line="4106"/>
<source>Mod_Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4050"/>
+ <location filename="mainwindow.cpp" line="4107"/>
<source>Install_Date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4051"/>
+ <location filename="mainwindow.cpp" line="4108"/>
<source>Download_File_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4158"/>
+ <location filename="mainwindow.cpp" line="4215"/>
<source>export failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4177"/>
+ <location filename="mainwindow.cpp" line="4234"/>
<source>Open Game folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4179"/>
+ <location filename="mainwindow.cpp" line="4236"/>
<source>Open MyGames folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4181"/>
+ <location filename="mainwindow.cpp" line="4238"/>
<source>Open INIs folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4185"/>
+ <location filename="mainwindow.cpp" line="4242"/>
<source>Open Instance folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4187"/>
+ <location filename="mainwindow.cpp" line="4244"/>
<source>Open Mods folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4189"/>
+ <location filename="mainwindow.cpp" line="4246"/>
<source>Open Profile folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4191"/>
+ <location filename="mainwindow.cpp" line="4248"/>
<source>Open Downloads folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4195"/>
+ <location filename="mainwindow.cpp" line="4252"/>
<source>Open MO2 Install folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4197"/>
+ <location filename="mainwindow.cpp" line="4254"/>
<source>Open MO2 Plugins folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4199"/>
+ <location filename="mainwindow.cpp" line="4256"/>
<source>Open MO2 Logs folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4208"/>
+ <location filename="mainwindow.cpp" line="4265"/>
<source>Install Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4210"/>
+ <location filename="mainwindow.cpp" line="4267"/>
<source>Create empty mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4212"/>
+ <location filename="mainwindow.cpp" line="4269"/>
<source>Create Separator</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4216"/>
+ <location filename="mainwindow.cpp" line="4273"/>
<source>Enable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4217"/>
+ <location filename="mainwindow.cpp" line="4274"/>
<source>Disable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4219"/>
+ <location filename="mainwindow.cpp" line="4276"/>
<source>Check all for update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4223"/>
+ <location filename="mainwindow.cpp" line="4280"/>
<source>Export to csv...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4235"/>
- <location filename="mainwindow.cpp" line="4251"/>
+ <location filename="mainwindow.cpp" line="4292"/>
+ <location filename="mainwindow.cpp" line="4308"/>
<source>Send to</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4236"/>
- <location filename="mainwindow.cpp" line="4252"/>
+ <location filename="mainwindow.cpp" line="4293"/>
+ <location filename="mainwindow.cpp" line="4309"/>
<source>Top</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4237"/>
- <location filename="mainwindow.cpp" line="4253"/>
+ <location filename="mainwindow.cpp" line="4294"/>
+ <location filename="mainwindow.cpp" line="4310"/>
<source>Bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4238"/>
- <location filename="mainwindow.cpp" line="4254"/>
+ <location filename="mainwindow.cpp" line="4295"/>
+ <location filename="mainwindow.cpp" line="4311"/>
<source>Priority...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4239"/>
+ <location filename="mainwindow.cpp" line="4296"/>
<source>Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4275"/>
+ <location filename="mainwindow.cpp" line="4332"/>
<source>All Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4282"/>
+ <location filename="mainwindow.cpp" line="4339"/>
<source>Sync to Mods...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4284"/>
+ <location filename="mainwindow.cpp" line="4341"/>
<source>Clear Overwrite...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4286"/>
- <location filename="mainwindow.cpp" line="4387"/>
+ <location filename="mainwindow.cpp" line="4343"/>
+ <location filename="mainwindow.cpp" line="4444"/>
<source>Open in Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4288"/>
+ <location filename="mainwindow.cpp" line="4345"/>
<source>Restore Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4289"/>
+ <location filename="mainwindow.cpp" line="4346"/>
<source>Remove Backup...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4292"/>
- <location filename="mainwindow.cpp" line="4311"/>
+ <location filename="mainwindow.cpp" line="4349"/>
+ <location filename="mainwindow.cpp" line="4368"/>
<source>Change Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4296"/>
- <location filename="mainwindow.cpp" line="4316"/>
+ <location filename="mainwindow.cpp" line="4353"/>
+ <location filename="mainwindow.cpp" line="4373"/>
<source>Primary Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4300"/>
+ <location filename="mainwindow.cpp" line="4357"/>
<source>Rename Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4301"/>
+ <location filename="mainwindow.cpp" line="4358"/>
<source>Remove Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4304"/>
+ <location filename="mainwindow.cpp" line="4361"/>
<source>Select Color...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4306"/>
+ <location filename="mainwindow.cpp" line="4363"/>
<source>Reset Color</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4323"/>
+ <location filename="mainwindow.cpp" line="4380"/>
<source>Change versioning scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4327"/>
+ <location filename="mainwindow.cpp" line="4384"/>
<source>Un-ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4331"/>
+ <location filename="mainwindow.cpp" line="4388"/>
<source>Ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4336"/>
- <location filename="mainwindow.cpp" line="5593"/>
+ <location filename="mainwindow.cpp" line="4393"/>
+ <location filename="mainwindow.cpp" line="5650"/>
<source>Enable selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4337"/>
- <location filename="mainwindow.cpp" line="5594"/>
+ <location filename="mainwindow.cpp" line="4394"/>
+ <location filename="mainwindow.cpp" line="5651"/>
<source>Disable selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4343"/>
+ <location filename="mainwindow.cpp" line="4400"/>
<source>Rename Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4344"/>
+ <location filename="mainwindow.cpp" line="4401"/>
<source>Reinstall Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4345"/>
+ <location filename="mainwindow.cpp" line="4402"/>
<source>Remove Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4353"/>
+ <location filename="mainwindow.cpp" line="4410"/>
<source>Un-Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4357"/>
+ <location filename="mainwindow.cpp" line="4414"/>
<source>Won&apos;t endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4363"/>
+ <location filename="mainwindow.cpp" line="4420"/>
<source>Endorsement state unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4374"/>
+ <location filename="mainwindow.cpp" line="4431"/>
<source>Ignore missing data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4378"/>
+ <location filename="mainwindow.cpp" line="4435"/>
<source>Mark as converted/working</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4382"/>
+ <location filename="mainwindow.cpp" line="4439"/>
<source>Visit on Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4384"/>
+ <location filename="mainwindow.cpp" line="4441"/>
<source>Visit web page</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4391"/>
+ <location filename="mainwindow.cpp" line="4448"/>
<source>Information...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4398"/>
- <location filename="mainwindow.cpp" line="5641"/>
+ <location filename="mainwindow.cpp" line="4455"/>
+ <location filename="mainwindow.cpp" line="5698"/>
<source>Exception: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4400"/>
- <location filename="mainwindow.cpp" line="5643"/>
+ <location filename="mainwindow.cpp" line="4457"/>
+ <location filename="mainwindow.cpp" line="5700"/>
<source>Unknown exception</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4429"/>
+ <location filename="mainwindow.cpp" line="4486"/>
<source>&lt;All&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4431"/>
+ <location filename="mainwindow.cpp" line="4488"/>
<source>&lt;Multiple&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4466"/>
+ <location filename="mainwindow.cpp" line="4523"/>
<source>%1 more</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="4470"/>
+ <location filename="mainwindow.cpp" line="4527"/>
<source>Are you sure you want to remove the following %n save(s)?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;&lt;br&gt;Removed saves will be sent to the Recycle Bin.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2735,12 +2843,12 @@ You can also use online editors and converters instead.</source>
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4515"/>
+ <location filename="mainwindow.cpp" line="4572"/>
<source>Enable Mods...</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="4530"/>
+ <location filename="mainwindow.cpp" line="4587"/>
<source>Delete %n save(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2748,22 +2856,22 @@ You can also use online editors and converters instead.</source>
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4572"/>
+ <location filename="mainwindow.cpp" line="4629"/>
<source>failed to remove %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4594"/>
+ <location filename="mainwindow.cpp" line="4651"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4624"/>
+ <location filename="mainwindow.cpp" line="4681"/>
<source>Restarting MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4625"/>
+ <location filename="mainwindow.cpp" line="4682"/>
<source>Changing the managed game directory requires restarting MO.
Any pending downloads will be paused.
@@ -2771,335 +2879,335 @@ Click OK to restart MO now.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4645"/>
+ <location filename="mainwindow.cpp" line="4702"/>
<source>Can&apos;t change download directory while downloads are in progress!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4763"/>
+ <location filename="mainwindow.cpp" line="4820"/>
<source>failed to write to file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4769"/>
+ <location filename="mainwindow.cpp" line="4826"/>
<source>%1 written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4810"/>
+ <location filename="mainwindow.cpp" line="4867"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4810"/>
+ <location filename="mainwindow.cpp" line="4867"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4836"/>
+ <location filename="mainwindow.cpp" line="4893"/>
<source>Enter Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4837"/>
+ <location filename="mainwindow.cpp" line="4894"/>
<source>Please enter a name for the executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4851"/>
+ <location filename="mainwindow.cpp" line="4908"/>
<source>Not an executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4851"/>
+ <location filename="mainwindow.cpp" line="4908"/>
<source>This is not a recognized executable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4876"/>
- <location filename="mainwindow.cpp" line="4901"/>
+ <location filename="mainwindow.cpp" line="4933"/>
+ <location filename="mainwindow.cpp" line="4958"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4876"/>
+ <location filename="mainwindow.cpp" line="4933"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4879"/>
- <location filename="mainwindow.cpp" line="4904"/>
+ <location filename="mainwindow.cpp" line="4936"/>
+ <location filename="mainwindow.cpp" line="4961"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4879"/>
- <location filename="mainwindow.cpp" line="4904"/>
+ <location filename="mainwindow.cpp" line="4936"/>
+ <location filename="mainwindow.cpp" line="4961"/>
<source>Failed to remove &quot;%1&quot;. Maybe you lack the required file permissions?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4901"/>
+ <location filename="mainwindow.cpp" line="4958"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4945"/>
- <location filename="mainwindow.cpp" line="6255"/>
+ <location filename="mainwindow.cpp" line="5002"/>
+ <location filename="mainwindow.cpp" line="6312"/>
<source>Set Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4945"/>
+ <location filename="mainwindow.cpp" line="5002"/>
<source>Set the priority of the selected plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4994"/>
+ <location filename="mainwindow.cpp" line="5051"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5007"/>
+ <location filename="mainwindow.cpp" line="5064"/>
<source>failed to generate preview for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5027"/>
+ <location filename="mainwindow.cpp" line="5084"/>
<source>Sorry, can&apos;t preview anything. This function currently does not support extracting from bsas.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5061"/>
+ <location filename="mainwindow.cpp" line="5118"/>
<source>Update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5108"/>
+ <location filename="mainwindow.cpp" line="5165"/>
<source>Open/Execute</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5109"/>
+ <location filename="mainwindow.cpp" line="5166"/>
<source>Add as Executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5113"/>
+ <location filename="mainwindow.cpp" line="5170"/>
<source>Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5119"/>
+ <location filename="mainwindow.cpp" line="5176"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5121"/>
+ <location filename="mainwindow.cpp" line="5178"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5127"/>
+ <location filename="mainwindow.cpp" line="5184"/>
<source>Write To File...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5152"/>
+ <location filename="mainwindow.cpp" line="5209"/>
<source>Do you want to endorse Mod Organizer on %1 now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5291"/>
+ <location filename="mainwindow.cpp" line="5348"/>
<source>Thank you!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5291"/>
+ <location filename="mainwindow.cpp" line="5348"/>
<source>Thank you for your endorsement!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5326"/>
+ <location filename="mainwindow.cpp" line="5383"/>
<source>Request to Nexus failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5341"/>
- <location filename="mainwindow.cpp" line="5403"/>
+ <location filename="mainwindow.cpp" line="5398"/>
+ <location filename="mainwindow.cpp" line="5460"/>
<source>failed to read %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5353"/>
- <location filename="mainwindow.cpp" line="5831"/>
+ <location filename="mainwindow.cpp" line="5410"/>
+ <location filename="mainwindow.cpp" line="5888"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5353"/>
+ <location filename="mainwindow.cpp" line="5410"/>
<source>failed to extract %1 (errorcode %2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5385"/>
+ <location filename="mainwindow.cpp" line="5442"/>
<source>Extract BSA</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5414"/>
+ <location filename="mainwindow.cpp" line="5471"/>
<source>This archive contains invalid hashes. Some files may be broken.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5460"/>
+ <location filename="mainwindow.cpp" line="5517"/>
<source>Extract...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5483"/>
+ <location filename="mainwindow.cpp" line="5540"/>
<source>This will restart MO, continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5530"/>
+ <location filename="mainwindow.cpp" line="5587"/>
<source>Edit Categories...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5531"/>
+ <location filename="mainwindow.cpp" line="5588"/>
<source>Deselect filter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5582"/>
+ <location filename="mainwindow.cpp" line="5639"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5598"/>
+ <location filename="mainwindow.cpp" line="5655"/>
<source>Enable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5599"/>
+ <location filename="mainwindow.cpp" line="5656"/>
<source>Disable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5620"/>
+ <location filename="mainwindow.cpp" line="5677"/>
<source>Unlock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5623"/>
+ <location filename="mainwindow.cpp" line="5680"/>
<source>Lock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5627"/>
+ <location filename="mainwindow.cpp" line="5684"/>
<source>Open Origin in Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5634"/>
+ <location filename="mainwindow.cpp" line="5691"/>
<source>Open Origin Info...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5777"/>
+ <location filename="mainwindow.cpp" line="5834"/>
<source>depends on missing &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5781"/>
+ <location filename="mainwindow.cpp" line="5838"/>
<source>incompatible with &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5807"/>
+ <location filename="mainwindow.cpp" line="5864"/>
<source>Please wait while LOOT is running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5904"/>
+ <location filename="mainwindow.cpp" line="5961"/>
<source>loot failed. Exit code was: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5926"/>
+ <location filename="mainwindow.cpp" line="5983"/>
<source>failed to start loot</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5929"/>
+ <location filename="mainwindow.cpp" line="5986"/>
<source>failed to run loot: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5933"/>
+ <location filename="mainwindow.cpp" line="5990"/>
<source>Errors occured</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5980"/>
+ <location filename="mainwindow.cpp" line="6037"/>
<source>Backup of load order created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5990"/>
+ <location filename="mainwindow.cpp" line="6047"/>
<source>Choose backup to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6003"/>
+ <location filename="mainwindow.cpp" line="6060"/>
<source>No Backups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6003"/>
+ <location filename="mainwindow.cpp" line="6060"/>
<source>There are no backups to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6024"/>
- <location filename="mainwindow.cpp" line="6046"/>
+ <location filename="mainwindow.cpp" line="6081"/>
+ <location filename="mainwindow.cpp" line="6103"/>
<source>Restore failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6025"/>
- <location filename="mainwindow.cpp" line="6047"/>
+ <location filename="mainwindow.cpp" line="6082"/>
+ <location filename="mainwindow.cpp" line="6104"/>
<source>Failed to restore the backup. Errorcode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6036"/>
+ <location filename="mainwindow.cpp" line="6093"/>
<source>Backup of modlist created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6142"/>
+ <location filename="mainwindow.cpp" line="6199"/>
<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="6144"/>
+ <location filename="mainwindow.cpp" line="6201"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6145"/>
+ <location filename="mainwindow.cpp" line="6202"/>
<source>Rename new file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6146"/>
+ <location filename="mainwindow.cpp" line="6203"/>
<source>Ignore file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="6255"/>
+ <location filename="mainwindow.cpp" line="6312"/>
<source>Set the priority of the selected mods</source>
<translation type="unfinished"></translation>
</message>
@@ -3471,41 +3579,46 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="781"/>
+ <location filename="modinfodialog.ui" line="782"/>
+ <source>Web page URL (only used if invalid NexusID) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modinfodialog.ui" line="795"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="787"/>
- <location filename="modinfodialog.ui" line="790"/>
- <location filename="modinfodialog.ui" line="793"/>
+ <location filename="modinfodialog.ui" line="801"/>
+ <location filename="modinfodialog.ui" line="804"/>
+ <location filename="modinfodialog.ui" line="807"/>
<source>Enter comments about the mod here. These are displayed in the notes column of the mod list.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="800"/>
- <location filename="modinfodialog.ui" line="803"/>
- <location filename="modinfodialog.ui" line="806"/>
+ <location filename="modinfodialog.ui" line="814"/>
+ <location filename="modinfodialog.ui" line="817"/>
+ <location filename="modinfodialog.ui" line="823"/>
<source>Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="814"/>
+ <location filename="modinfodialog.ui" line="831"/>
<source>Filetree</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="828"/>
+ <location filename="modinfodialog.ui" line="845"/>
<source>Open Mod in Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="853"/>
+ <location filename="modinfodialog.ui" line="870"/>
<source>A directory view of this mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="856"/>
+ <location filename="modinfodialog.ui" line="873"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -3515,288 +3628,288 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="883"/>
+ <location filename="modinfodialog.ui" line="900"/>
<source>Previous</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="890"/>
+ <location filename="modinfodialog.ui" line="907"/>
<source>Next</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="910"/>
+ <location filename="modinfodialog.ui" line="927"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="230"/>
+ <location filename="modinfodialog.cpp" line="234"/>
<source>&amp;Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="231"/>
+ <location filename="modinfodialog.cpp" line="235"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="232"/>
+ <location filename="modinfodialog.cpp" line="236"/>
<source>&amp;Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="233"/>
+ <location filename="modinfodialog.cpp" line="237"/>
<source>&amp;Unhide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="234"/>
+ <location filename="modinfodialog.cpp" line="238"/>
<source>&amp;Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="235"/>
+ <location filename="modinfodialog.cpp" line="239"/>
<source>&amp;New Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="487"/>
- <location filename="modinfodialog.cpp" line="502"/>
+ <location filename="modinfodialog.cpp" line="491"/>
+ <location filename="modinfodialog.cpp" line="506"/>
<source>Save changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="487"/>
- <location filename="modinfodialog.cpp" line="502"/>
+ <location filename="modinfodialog.cpp" line="491"/>
+ <location filename="modinfodialog.cpp" line="506"/>
<source>Save changes to &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="692"/>
+ <location filename="modinfodialog.cpp" line="696"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="692"/>
+ <location filename="modinfodialog.cpp" line="696"/>
<source>A file with that name exists, please enter a new one</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="709"/>
+ <location filename="modinfodialog.cpp" line="713"/>
<source>failed to move file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="734"/>
+ <location filename="modinfodialog.cpp" line="738"/>
<source>failed to create directory &quot;optional&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="778"/>
- <location filename="modinfodialog.cpp" line="1502"/>
+ <location filename="modinfodialog.cpp" line="782"/>
+ <location filename="modinfodialog.cpp" line="1511"/>
<source>Info requested, please wait</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="832"/>
+ <location filename="modinfodialog.cpp" line="836"/>
<source>Main</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="833"/>
+ <location filename="modinfodialog.cpp" line="837"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="834"/>
+ <location filename="modinfodialog.cpp" line="838"/>
<source>Optional</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="835"/>
+ <location filename="modinfodialog.cpp" line="839"/>
<source>Old</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="836"/>
+ <location filename="modinfodialog.cpp" line="840"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="837"/>
+ <location filename="modinfodialog.cpp" line="841"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="848"/>
+ <location filename="modinfodialog.cpp" line="852"/>
<source>Current Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="852"/>
+ <location filename="modinfodialog.cpp" line="856"/>
<source>No update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="895"/>
+ <location filename="modinfodialog.cpp" line="899"/>
<source>(description incomplete, please visit nexus)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="910"/>
+ <location filename="modinfodialog.cpp" line="914"/>
<source>&lt;a href=&quot;%1&quot;&gt;Visit on Nexus&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1003"/>
+ <location filename="modinfodialog.cpp" line="1012"/>
<source>Failed to delete %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1019"/>
- <location filename="modinfodialog.cpp" line="1025"/>
- <location filename="modinfodialog.cpp" line="1044"/>
- <location filename="modinfodialog.cpp" line="1049"/>
+ <location filename="modinfodialog.cpp" line="1028"/>
+ <location filename="modinfodialog.cpp" line="1034"/>
+ <location filename="modinfodialog.cpp" line="1053"/>
+ <location filename="modinfodialog.cpp" line="1058"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1019"/>
- <location filename="modinfodialog.cpp" line="1044"/>
+ <location filename="modinfodialog.cpp" line="1028"/>
+ <location filename="modinfodialog.cpp" line="1053"/>
<source>Are sure you want to delete &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1025"/>
- <location filename="modinfodialog.cpp" line="1049"/>
+ <location filename="modinfodialog.cpp" line="1034"/>
+ <location filename="modinfodialog.cpp" line="1058"/>
<source>Are sure you want to delete the selected files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1123"/>
- <location filename="modinfodialog.cpp" line="1129"/>
+ <location filename="modinfodialog.cpp" line="1132"/>
+ <location filename="modinfodialog.cpp" line="1138"/>
<source>New Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1135"/>
+ <location filename="modinfodialog.cpp" line="1144"/>
<source>Failed to create &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1239"/>
- <location filename="modinfodialog.cpp" line="1263"/>
+ <location filename="modinfodialog.cpp" line="1248"/>
+ <location filename="modinfodialog.cpp" line="1272"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1239"/>
+ <location filename="modinfodialog.cpp" line="1248"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1242"/>
- <location filename="modinfodialog.cpp" line="1266"/>
+ <location filename="modinfodialog.cpp" line="1251"/>
+ <location filename="modinfodialog.cpp" line="1275"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1242"/>
- <location filename="modinfodialog.cpp" line="1266"/>
+ <location filename="modinfodialog.cpp" line="1251"/>
+ <location filename="modinfodialog.cpp" line="1275"/>
<source>Failed to remove &quot;%1&quot;. Maybe you lack the required file permissions?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1253"/>
- <location filename="modinfodialog.cpp" line="1276"/>
+ <location filename="modinfodialog.cpp" line="1262"/>
+ <location filename="modinfodialog.cpp" line="1285"/>
<source>failed to rename %1 to %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1263"/>
+ <location filename="modinfodialog.cpp" line="1272"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1339"/>
+ <location filename="modinfodialog.cpp" line="1348"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1339"/>
+ <location filename="modinfodialog.cpp" line="1348"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1411"/>
+ <location filename="modinfodialog.cpp" line="1420"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1424"/>
+ <location filename="modinfodialog.cpp" line="1433"/>
<source>failed to generate preview for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1440"/>
+ <location filename="modinfodialog.cpp" line="1449"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1440"/>
+ <location filename="modinfodialog.cpp" line="1449"/>
<source>Sorry, can&apos;t preview anything. This function currently does not support extracting from bsas.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1454"/>
+ <location filename="modinfodialog.cpp" line="1463"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1456"/>
+ <location filename="modinfodialog.cpp" line="1465"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1459"/>
- <location filename="modinfodialog.cpp" line="1479"/>
+ <location filename="modinfodialog.cpp" line="1468"/>
+ <location filename="modinfodialog.cpp" line="1488"/>
<source>Open/Execute</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1463"/>
- <location filename="modinfodialog.cpp" line="1483"/>
+ <location filename="modinfodialog.cpp" line="1472"/>
+ <location filename="modinfodialog.cpp" line="1492"/>
<source>Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1531"/>
+ <location filename="modinfodialog.cpp" line="1540"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1531"/>
+ <location filename="modinfodialog.cpp" line="1540"/>
<source>Please enter a name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1535"/>
- <location filename="modinfodialog.cpp" line="1538"/>
+ <location filename="modinfodialog.cpp" line="1544"/>
+ <location filename="modinfodialog.cpp" line="1547"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1535"/>
+ <location filename="modinfodialog.cpp" line="1544"/>
<source>Invalid name. Must be a valid file name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1538"/>
+ <location filename="modinfodialog.cpp" line="1547"/>
<source>A tweak by that name exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1552"/>
+ <location filename="modinfodialog.cpp" line="1561"/>
<source>Create Tweak</source>
<translation type="unfinished"></translation>
</message>
@@ -4007,123 +4120,123 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1026"/>
+ <location filename="modlist.cpp" line="1030"/>
<source>drag&amp;drop failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1105"/>
+ <location filename="modlist.cpp" line="1109"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1106"/>
+ <location filename="modlist.cpp" line="1110"/>
<source>Are you sure you want to remove &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1169"/>
+ <location filename="modlist.cpp" line="1173"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1170"/>
+ <location filename="modlist.cpp" line="1174"/>
<source>Content</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1171"/>
+ <location filename="modlist.cpp" line="1175"/>
<source>Mod Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1172"/>
+ <location filename="modlist.cpp" line="1176"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1173"/>
+ <location filename="modlist.cpp" line="1177"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1174"/>
+ <location filename="modlist.cpp" line="1178"/>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1175"/>
+ <location filename="modlist.cpp" line="1179"/>
<source>Source Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1176"/>
+ <location filename="modlist.cpp" line="1180"/>
<source>Nexus ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1177"/>
+ <location filename="modlist.cpp" line="1181"/>
<source>Installation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1178"/>
+ <location filename="modlist.cpp" line="1182"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1179"/>
- <location filename="modlist.cpp" line="1215"/>
+ <location filename="modlist.cpp" line="1183"/>
+ <location filename="modlist.cpp" line="1219"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1187"/>
+ <location filename="modlist.cpp" line="1191"/>
<source>Name of your mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1188"/>
+ <location filename="modlist.cpp" line="1192"/>
<source>Version of the mod (if available)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1189"/>
+ <location filename="modlist.cpp" line="1193"/>
<source>Installation priority of your mod. The higher, the more &quot;important&quot; it is and thus overwrites files from mods with lower priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1191"/>
+ <location filename="modlist.cpp" line="1195"/>
<source>Category of the mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1192"/>
+ <location filename="modlist.cpp" line="1196"/>
<source>The source game which was the origin of this mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1193"/>
+ <location filename="modlist.cpp" line="1197"/>
<source>Id of the mod as used on Nexus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1194"/>
+ <location filename="modlist.cpp" line="1198"/>
<source>Emblemes to highlight things that might require attention.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1195"/>
+ <location filename="modlist.cpp" line="1199"/>
<source>Depicts the content of the mod:&lt;br&gt;&lt;table cellspacing=7&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/plugin&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Game plugins (esp/esm/esl)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/interface&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Interface&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/mesh&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Meshes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/bsa&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;BSA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/texture&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Textures&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/sound&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Sounds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/music&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Music&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/string&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/script&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Scripts (Papyrus)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skse&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Script Extender plugins&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skyproc&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;SkyProc Patcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/menu&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Mod Configuration Menu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/inifile&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;INI files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/modgroup&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;ModGroup files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1213"/>
+ <location filename="modlist.cpp" line="1217"/>
<source>Time this mod was installed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1214"/>
+ <location filename="modlist.cpp" line="1218"/>
<source>User notes about the mod</source>
<translation type="unfinished"></translation>
</message>
@@ -4131,7 +4244,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>ModListSortProxy</name>
<message>
- <location filename="modlistsortproxy.cpp" line="461"/>
+ <location filename="modlistsortproxy.cpp" line="465"/>
<source>Drag&amp;Drop is only supported when sorting by priority</source>
<translation type="unfinished"></translation>
</message>
@@ -4297,135 +4410,135 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1273"/>
+ <location filename="organizercore.cpp" line="1280"/>
<source>Executable &quot;%1&quot; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1301"/>
+ <location filename="organizercore.cpp" line="1308"/>
<source>Start Steam?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1302"/>
+ <location filename="organizercore.cpp" line="1309"/>
<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="1331"/>
+ <location filename="organizercore.cpp" line="1340"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1339"/>
+ <location filename="organizercore.cpp" line="1348"/>
<source>Windows Event Log Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1340"/>
+ <location filename="organizercore.cpp" line="1349"/>
<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="1352"/>
+ <location filename="organizercore.cpp" line="1361"/>
<source>Blacklisted Executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1353"/>
+ <location filename="organizercore.cpp" line="1362"/>
<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="1442"/>
+ <location filename="organizercore.cpp" line="1457"/>
<source>No profile set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1731"/>
+ <location filename="organizercore.cpp" line="1753"/>
<source>Failed to refresh list of esps: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1824"/>
+ <location filename="organizercore.cpp" line="1852"/>
<source>Multiple esps/esls activated, please check that they don&apos;t conflict.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1899"/>
+ <location filename="organizercore.cpp" line="1929"/>
<source>Download?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1900"/>
+ <location filename="organizercore.cpp" line="1930"/>
<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="2034"/>
+ <location filename="organizercore.cpp" line="2063"/>
<source>failed to update mod list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2041"/>
- <location filename="organizercore.cpp" line="2058"/>
+ <location filename="organizercore.cpp" line="2070"/>
+ <location filename="organizercore.cpp" line="2087"/>
<source>login successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2065"/>
+ <location filename="organizercore.cpp" line="2094"/>
<source>Login failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2066"/>
+ <location filename="organizercore.cpp" line="2095"/>
<source>Login failed, try again?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2075"/>
+ <location filename="organizercore.cpp" line="2104"/>
<source>login failed: %1. Download will not be associated with an account</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2083"/>
+ <location filename="organizercore.cpp" line="2112"/>
<source>login failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2093"/>
+ <location filename="organizercore.cpp" line="2122"/>
<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="2146"/>
+ <location filename="organizercore.cpp" line="2175"/>
<source>MO1 &quot;Script Extender&quot; load mechanism has left hook.dll in your game folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2149"/>
- <location filename="organizercore.cpp" line="2165"/>
+ <location filename="organizercore.cpp" line="2178"/>
+ <location filename="organizercore.cpp" line="2194"/>
<source>Description missing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2158"/>
+ <location filename="organizercore.cpp" line="2187"/>
<source>&lt;a href=&quot;%1&quot;&gt;hook.dll&lt;/a&gt; has been found in your game folder (right click to copy the full path). This is most likely a leftover of setting the ModOrganizer 1 load mechanism to &quot;Script Extender&quot;, in which case you must remove this file either by changing the load mechanism in ModOrganizer 1 or manually removing the file, otherwise the game is likely to crash and burn.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2192"/>
+ <location filename="organizercore.cpp" line="2221"/>
<source>failed to save load order: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2264"/>
+ <location filename="organizercore.cpp" line="2293"/>
<source>The designated write target &quot;%1&quot; is not enabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4531,135 +4644,135 @@ Continue?</source>
<context>
<name>PluginList</name>
<message>
- <location filename="pluginlist.cpp" line="103"/>
+ <location filename="pluginlist.cpp" line="104"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="104"/>
+ <location filename="pluginlist.cpp" line="105"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="105"/>
+ <location filename="pluginlist.cpp" line="106"/>
<source>Mod Index</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="106"/>
+ <location filename="pluginlist.cpp" line="107"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="107"/>
- <location filename="pluginlist.cpp" line="119"/>
+ <location filename="pluginlist.cpp" line="108"/>
+ <location filename="pluginlist.cpp" line="120"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="115"/>
+ <location filename="pluginlist.cpp" line="116"/>
<source>Name of your mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="116"/>
+ <location filename="pluginlist.cpp" line="117"/>
<source>Load priority of your mod. The higher, the more &quot;important&quot; it is and thus overwrites data from plugins with lower priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="118"/>
+ <location filename="pluginlist.cpp" line="119"/>
<source>The modindex determines the formids of objects originating from this mods.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="224"/>
+ <location filename="pluginlist.cpp" line="246"/>
<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="297"/>
+ <location filename="pluginlist.cpp" line="319"/>
<source>esp not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="345"/>
- <location filename="pluginlist.cpp" line="357"/>
+ <location filename="pluginlist.cpp" line="367"/>
+ <location filename="pluginlist.cpp" line="379"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="345"/>
+ <location filename="pluginlist.cpp" line="367"/>
<source>Really enable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="357"/>
+ <location filename="pluginlist.cpp" line="379"/>
<source>Really disable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="462"/>
+ <location filename="pluginlist.cpp" line="484"/>
<source>The file containing locked plugin indices is broken</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="959"/>
- <location filename="pluginlist.cpp" line="963"/>
+ <location filename="pluginlist.cpp" line="981"/>
+ <location filename="pluginlist.cpp" line="985"/>
<source>&lt;b&gt;Origin&lt;/b&gt;: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="960"/>
+ <location filename="pluginlist.cpp" line="982"/>
<source>&lt;br&gt;&lt;b&gt;&lt;i&gt;This plugin can&apos;t be disabled (enforced by the game).&lt;/i&gt;&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="965"/>
+ <location filename="pluginlist.cpp" line="987"/>
<source>Author</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="968"/>
+ <location filename="pluginlist.cpp" line="990"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="971"/>
+ <location filename="pluginlist.cpp" line="993"/>
<source>Missing Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="978"/>
+ <location filename="pluginlist.cpp" line="1000"/>
<source>Enabled Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="981"/>
+ <location filename="pluginlist.cpp" line="1003"/>
<source>Loads Archives</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="982"/>
+ <location filename="pluginlist.cpp" line="1004"/>
<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="987"/>
+ <location filename="pluginlist.cpp" line="1009"/>
<source>Loads INI settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="988"/>
+ <location filename="pluginlist.cpp" line="1010"/>
<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="992"/>
+ <location filename="pluginlist.cpp" line="1014"/>
<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="1167"/>
+ <location filename="pluginlist.cpp" line="1189"/>
<source>failed to restore load order for %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4721,76 +4834,76 @@ p, li { white-space: pre-wrap; }
<context>
<name>Profile</name>
<message>
- <location filename="profile.cpp" line="80"/>
+ <location filename="profile.cpp" line="81"/>
<source>invalid profile name %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="84"/>
+ <location filename="profile.cpp" line="85"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="258"/>
+ <location filename="profile.cpp" line="259"/>
<source>failed to write mod list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="269"/>
+ <location filename="profile.cpp" line="270"/>
<source>failed to update tweaked ini file, wrong settings may be used: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="289"/>
+ <location filename="profile.cpp" line="290"/>
<source>failed to create tweaked ini: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="314"/>
+ <location filename="profile.cpp" line="315"/>
<source>failed to open %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="373"/>
+ <location filename="profile.cpp" line="374"/>
<source>&quot;%1&quot; is missing or inaccessible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="418"/>
- <location filename="profile.cpp" line="457"/>
- <location filename="profile.cpp" line="554"/>
- <location filename="profile.cpp" line="573"/>
- <location filename="profile.cpp" line="583"/>
+ <location filename="profile.cpp" line="419"/>
+ <location filename="profile.cpp" line="458"/>
+ <location filename="profile.cpp" line="555"/>
+ <location filename="profile.cpp" line="574"/>
+ <location filename="profile.cpp" line="584"/>
<source>invalid index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="535"/>
+ <location filename="profile.cpp" line="536"/>
<source>Overwrite directory couldn&apos;t be parsed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="546"/>
+ <location filename="profile.cpp" line="547"/>
<source>invalid priority %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="753"/>
+ <location filename="profile.cpp" line="755"/>
<source>Delete profile-specific save games?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="754"/>
+ <location filename="profile.cpp" line="756"/>
<source>Do you want to delete the profile-specific save games? (If you select &quot;No&quot;, the save games will show up again if you re-enable profile-specific save games)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="785"/>
+ <location filename="profile.cpp" line="786"/>
<source>Missing profile-specific game INI files!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="786"/>
+ <location filename="profile.cpp" line="787"/>
<source>Some of your profile-specific game INI files were missing. They will now be copied from the vanilla game folder. You might want double-check your settings.
Missing files:
@@ -4798,12 +4911,12 @@ Missing files:
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="801"/>
+ <location filename="profile.cpp" line="803"/>
<source>Delete profile-specific game INI files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="802"/>
+ <location filename="profile.cpp" line="804"/>
<source>Do you want to delete the profile-specific game INI files? (If you select &quot;No&quot;, the INI files will be used again if you re-enable profile-specific game INI files.)</source>
<translation type="unfinished"></translation>
</message>
@@ -5322,7 +5435,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="68"/>
+ <location filename="profile.cpp" line="69"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
@@ -5464,13 +5577,13 @@ If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1400"/>
- <location filename="mainwindow.cpp" line="4721"/>
+ <location filename="mainwindow.cpp" line="1405"/>
+ <location filename="mainwindow.cpp" line="4778"/>
<source>&lt;Manage...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1412"/>
+ <location filename="mainwindow.cpp" line="1417"/>
<source>failed to parse profile %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -5506,12 +5619,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="538"/>
+ <location filename="pluginlist.cpp" line="560"/>
<source>failed to access %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="552"/>
+ <location filename="pluginlist.cpp" line="574"/>
<source>failed to set file time %1</source>
<translation type="unfinished"></translation>
</message>
@@ -5724,7 +5837,7 @@ Select Show Details option to see the full change-log.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="349"/>
+ <location filename="selfupdater.cpp" line="348"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@@ -6714,7 +6827,7 @@ On Windows XP:
<context>
<name>UsvfsConnector</name>
<message>
- <location filename="usvfsconnector.cpp" line="161"/>
+ <location filename="usvfsconnector.cpp" line="163"/>
<source>Preparing vfs</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 4d5bf48b..885afeff 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -917,6 +917,7 @@ MOBase::IModInterface *OrganizerCore::createMod(GuessedValue<QString> &name)
settingsFile.setValue("category", 0);
settingsFile.setValue("installationFile", "");
+ settingsFile.remove("installedFiles");
settingsFile.beginWriteArray("installedFiles", 0);
settingsFile.endArray();
}
@@ -1209,10 +1210,15 @@ QStringList OrganizerCore::modsSortedByProfilePriority() const
return res;
}
-void OrganizerCore::spawnBinary(const QFileInfo &binary, const QString &arguments, const QDir &currentDirectory, const QString &steamAppID, const QString &customOverwrite)
+void OrganizerCore::spawnBinary(const QFileInfo &binary,
+ const QString &arguments,
+ const QDir &currentDirectory,
+ const QString &steamAppID,
+ const QString &customOverwrite,
+ const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries)
{
DWORD processExitCode = 0;
- HANDLE processHandle = spawnBinaryDirect(binary, arguments, m_CurrentProfile->name(), currentDirectory, steamAppID, customOverwrite, &processExitCode);
+ HANDLE processHandle = spawnBinaryDirect(binary, arguments, m_CurrentProfile->name(), currentDirectory, steamAppID, customOverwrite, forcedLibraries, &processExitCode);
if (processHandle != INVALID_HANDLE_VALUE) {
refreshDirectoryStructure();
// need to remove our stored load order because it may be outdated if a foreign tool changed the
@@ -1237,9 +1243,10 @@ HANDLE OrganizerCore::spawnBinaryDirect(const QFileInfo &binary,
const QDir &currentDirectory,
const QString &steamAppID,
const QString &customOverwrite,
+ const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries,
LPDWORD exitCode)
{
- HANDLE processHandle = spawnBinaryProcess(binary, arguments, profileName, currentDirectory, steamAppID, customOverwrite);
+ HANDLE processHandle = spawnBinaryProcess(binary, arguments, profileName, currentDirectory, steamAppID, customOverwrite, forcedLibraries);
if (Settings::instance().lockGUI() && processHandle != INVALID_HANDLE_VALUE) {
std::unique_ptr<LockedDialog> dlg;
ILockedWaitingForProcess* uilock = nullptr;
@@ -1274,7 +1281,8 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary,
const QString &profileName,
const QDir &currentDirectory,
const QString &steamAppID,
- const QString &customOverwrite)
+ const QString &customOverwrite,
+ const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries)
{
prepareStart();
@@ -1334,6 +1342,8 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary,
if (m_AboutToRun(binary.absoluteFilePath())) {
try {
m_USVFS.updateMapping(fileMapping(profileName, customOverwrite));
+ m_USVFS.updateForcedLibraries(forcedLibraries);
+
} catch (const UsvfsConnectorException &e) {
qDebug(e.what());
return INVALID_HANDLE_VALUE;
@@ -1426,6 +1436,10 @@ HANDLE OrganizerCore::runShortcut(const MOShortcut& shortcut)
.toLocal8Bit().constData());
Executable& exe = m_ExecutablesList.find(shortcut.executable());
+ auto forcedLibaries = m_CurrentProfile->determineForcedLibraries(shortcut.executable());
+ if (!m_CurrentProfile->forcedLibrariesEnabled(exe.m_BinaryInfo.fileName())) {
+ forcedLibaries.clear();
+ }
return spawnBinaryDirect(
exe.m_BinaryInfo, exe.m_Arguments,
@@ -1433,7 +1447,9 @@ HANDLE OrganizerCore::runShortcut(const MOShortcut& shortcut)
exe.m_WorkingDirectory.length() != 0
? exe.m_WorkingDirectory
: exe.m_BinaryInfo.absolutePath(),
- exe.m_SteamAppID, "");
+ exe.m_SteamAppID,
+ "",
+ forcedLibaries);
}
HANDLE OrganizerCore::startApplication(const QString &executable,
@@ -1454,6 +1470,7 @@ HANDLE OrganizerCore::startApplication(const QString &executable,
}
QString steamAppID;
QString customOverwrite;
+ QList<ExecutableForcedLoadSetting> forcedLibraries;
if (executable.contains('\\') || executable.contains('/')) {
// file path
@@ -1472,6 +1489,9 @@ HANDLE OrganizerCore::startApplication(const QString &executable,
customOverwrite
= m_CurrentProfile->setting("custom_overwrites", exe.m_Title)
.toString();
+ if (m_CurrentProfile->forcedLibrariesEnabled(exe.m_Title)) {
+ forcedLibraries = m_CurrentProfile->determineForcedLibraries(exe.m_Title);
+ }
} catch (const std::runtime_error &) {
// nop
}
@@ -1483,6 +1503,9 @@ HANDLE OrganizerCore::startApplication(const QString &executable,
customOverwrite
= m_CurrentProfile->setting("custom_overwrites", exe.m_Title)
.toString();
+ if (m_CurrentProfile->forcedLibrariesEnabled(exe.m_Title)) {
+ forcedLibraries = m_CurrentProfile->determineForcedLibraries(exe.m_Title);
+ }
if (arguments == "") {
arguments = exe.m_Arguments;
}
@@ -1497,7 +1520,7 @@ HANDLE OrganizerCore::startApplication(const QString &executable,
}
}
- return spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID, customOverwrite);
+ return spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID, customOverwrite, forcedLibraries);
}
bool OrganizerCore::waitForApplication(HANDLE handle, LPDWORD exitCode)
@@ -1899,7 +1922,7 @@ void OrganizerCore::requestDownload(const QUrl &url, QNetworkReply *reply)
QString gameName = "";
int modID = 0;
int fileID = 0;
- QRegExp nameExp("www\.nexusmods\.com/(\\a+)/");
+ QRegExp nameExp("www\\.nexusmods\\.com/(\\a+)/");
if (nameExp.indexIn(url.toString()) != -1) {
gameName = nameExp.cap(1);
}
diff --git a/src/organizercore.h b/src/organizercore.h
index d0964ed5..cde77f92 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -20,6 +20,7 @@
#include <versioninfo.h>
#include <delayedfilewriter.h>
#include <boost/signals2.hpp>
+#include "executableinfo.h"
class ModListSortProxy;
class PluginListSortProxy;
@@ -141,20 +142,23 @@ public:
void spawnBinary(const QFileInfo &binary, const QString &arguments = "",
const QDir &currentDirectory = QDir(),
const QString &steamAppID = "",
- const QString &customOverwrite = "");
+ const QString &customOverwrite = "",
+ const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries = QList<MOBase::ExecutableForcedLoadSetting>());
HANDLE spawnBinaryDirect(const QFileInfo &binary, const QString &arguments,
const QString &profileName,
const QDir &currentDirectory,
const QString &steamAppID,
const QString &customOverwrite,
+ const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries = QList<MOBase::ExecutableForcedLoadSetting>(),
LPDWORD exitCode = nullptr);
HANDLE spawnBinaryProcess(const QFileInfo &binary, const QString &arguments,
const QString &profileName,
const QDir &currentDirectory,
const QString &steamAppID,
- const QString &customOverwrite);
+ const QString &customOverwrite,
+ const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries = QList<MOBase::ExecutableForcedLoadSetting>());
void loginSuccessfulUpdate(bool necessary);
void loginFailedUpdate(const QString &message);
diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp
index 1fe3f645..4d35a2c3 100644
--- a/src/overwriteinfodialog.cpp
+++ b/src/overwriteinfodialog.cpp
@@ -220,7 +220,7 @@ void OverwriteInfoDialog::openFile(const QModelIndex &index)
QString fileName = m_FileSystemModel->filePath(index);
HINSTANCE res = ::ShellExecuteW(nullptr, L"open", ToWString(fileName).c_str(), nullptr, nullptr, SW_SHOW);
- if ((int)res <= 32) {
+ if ((INT_PTR)res <= 32) {
qCritical("failed to invoke %s: %d", fileName.toUtf8().constData(), res);
}
}
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp
index 3f7830c4..614a2a9e 100644
--- a/src/pluginlist.cpp
+++ b/src/pluginlist.cpp
@@ -153,7 +153,7 @@ void PluginList::highlightPlugins(const QItemSelectionModel *selection, const MO
}
}
}
- emit dataChanged(this->index(0, 0), this->index(m_ESPs.size() - 1, this->columnCount() - 1));
+ emit dataChanged(this->index(0, 0), this->index(static_cast<int>(m_ESPs.size()) - 1, this->columnCount() - 1));
}
void PluginList::refresh(const QString &profileName
diff --git a/src/pluginlistsortproxy.cpp b/src/pluginlistsortproxy.cpp
index 1e131c4d..3d13798e 100644
--- a/src/pluginlistsortproxy.cpp
+++ b/src/pluginlistsortproxy.cpp
@@ -139,7 +139,38 @@ bool PluginListSortProxy::dropMimeData(const QMimeData *data, Qt::DropAction act
bool PluginListSortProxy::filterMatchesPlugin(const QString &plugin) const
{
- return m_CurrentFilter.isEmpty() ||
- plugin.contains(m_CurrentFilter, Qt::CaseInsensitive);
+ if (!m_CurrentFilter.isEmpty()) {
+
+ bool display = false;
+ QString filterCopy = QString(m_CurrentFilter);
+ filterCopy.replace("||", ";").replace("OR", ";").replace("|", ";");
+ QStringList ORList = filterCopy.split(";", QString::SkipEmptyParts);
+
+ bool segmentGood = true;
+
+ //split in ORSegments that internally use AND logic
+ for (auto& ORSegment : ORList) {
+ QStringList ANDKeywords = ORSegment.split(" ", QString::SkipEmptyParts);
+ segmentGood = true;
+
+ //check each word in the segment for match, each word needs to be matched but it doesn't matter where.
+ for (auto& currentKeyword : ANDKeywords) {
+ if (!plugin.contains(currentKeyword, Qt::CaseInsensitive)) {
+ segmentGood = false;
+ break;
+ }
+ }
+
+ if (segmentGood) {
+ //the last AND loop didn't break so the ORSegments is true so mod matches filter
+ return true;
+ }
+
+ }//for ORList loop
+
+ return false;
+ }
+ else
+ return true;
}
diff --git a/src/profile.cpp b/src/profile.cpp
index e8ead8e8..afe6fdc7 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -31,6 +31,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <dataarchives.h>
#include "util.h"
#include "registry.h"
+#include <questionboxmemory.h>
#include <QApplication>
#include <QFile> // for QFile
@@ -749,12 +750,12 @@ bool Profile::enableLocalSaves(bool enable)
m_Directory.mkdir("saves");
}
} else {
- QMessageBox::StandardButton res = QMessageBox::question(
- QApplication::activeModalWidget(), tr("Delete profile-specific save games?"),
+ QDialogButtonBox::StandardButton res;
+ res = QuestionBoxMemory::query(QApplication::activeModalWidget(), "deleteSavesQuery",
+ 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);
+ QDialogButtonBox::No | QDialogButtonBox::Yes | QDialogButtonBox::Cancel, QDialogButtonBox::No);
if (res == QMessageBox::Yes) {
shellDelete(QStringList(m_Directory.absoluteFilePath("saves")));
} else if (res == QMessageBox::No) {
@@ -797,12 +798,12 @@ 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?"),
+ QDialogButtonBox::StandardButton res;
+ res = QuestionBoxMemory::query(QApplication::activeModalWidget(), "deleteINIQuery",
+ 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);
+ QDialogButtonBox::No | QDialogButtonBox::Yes | QDialogButtonBox::Cancel, QDialogButtonBox::No);
if (res == QMessageBox::Yes) {
QStringList filesToDelete;
for (QString file : m_GamePlugin->iniFiles()) {
@@ -883,7 +884,6 @@ QVariant Profile::setting(const QString &section, const QString &name,
return m_Settings->value(section + "/" + name, fallback);
}
-
void Profile::storeSetting(const QString &section, const QString &name,
const QVariant &value)
{
@@ -905,7 +905,129 @@ void Profile::removeSetting(const QString &name)
removeSetting("", name);
}
+QVariantMap Profile::settingsByGroup(const QString &section) const
+{
+ QVariantMap results;
+ m_Settings->beginGroup(section);
+ for (auto key : m_Settings->childKeys()) {
+ results[key] = m_Settings->value(key);
+ }
+ m_Settings->endGroup();
+ return results;
+}
+
+void Profile::storeSettingsByGroup(const QString &section, const QVariantMap &values)
+{
+ m_Settings->beginGroup(section);
+ for (auto key : values.keys()) {
+ m_Settings->setValue(key, values[key]);
+ }
+ m_Settings->endGroup();
+}
+
+QList<QVariantMap> Profile::settingsByArray(const QString &prefix) const
+{
+ QList<QVariantMap> results;
+ int size = m_Settings->beginReadArray(prefix);
+ for (int i = 0; i < size; i++) {
+ m_Settings->setArrayIndex(i);
+ QVariantMap item;
+ for (auto key : m_Settings->childKeys()) {
+ item[key] = m_Settings->value(key);
+ }
+ results.append(item);
+ }
+ m_Settings->endArray();
+ return results;
+}
+
+void Profile::storeSettingsByArray(const QString &prefix, const QList<QVariantMap> &values)
+{
+ m_Settings->beginWriteArray(prefix);
+ for (int i = 0; i < values.length(); i++) {
+ m_Settings->setArrayIndex(i);
+ for (auto key : values.at(i).keys()) {
+ m_Settings->setValue(key, values.at(i)[key]);
+ }
+ }
+ m_Settings->endArray();
+}
+
int Profile::getPriorityMinimum() const
{
return m_ModIndexByPriority.begin()->first;
}
+
+bool Profile::forcedLibrariesEnabled(const QString &executable)
+{
+ return setting("forced_libraries", executable + "/enabled", false).toBool();
+}
+
+void Profile::setForcedLibrariesEnabled(const QString &executable, bool enabled)
+{
+ storeSetting("forced_libraries", executable + "/enabled", enabled);
+}
+
+QList<ExecutableForcedLoadSetting> Profile::determineForcedLibraries(const QString &executable)
+{
+ QList<ExecutableForcedLoadSetting> results;
+
+ auto rawSettings = settingsByArray("forced_libraries/" + executable);
+ auto forcedLoads = m_GamePlugin->executableForcedLoads();
+
+ // look for enabled status on forced loads and add those
+ for (auto forcedLoad : forcedLoads) {
+ bool found = false;
+ for (auto rawSetting : rawSettings) {
+ if ((rawSetting.value("process").toString().compare(forcedLoad.process(), Qt::CaseInsensitive) == 0)
+ && (rawSetting.value("library").toString().compare(forcedLoad.library(), Qt::CaseInsensitive) == 0))
+ {
+ results.append(forcedLoad.withEnabled(rawSetting.value("enabled", false).toBool()));
+ found = true;
+ }
+ }
+ if (!found) {
+ results.append(forcedLoad);
+ }
+ }
+
+ // add everything else
+ for (auto rawSetting : rawSettings) {
+ bool add = true;
+ for (auto forcedLoad : forcedLoads) {
+ if ((rawSetting.value("process").toString().compare(forcedLoad.process(), Qt::CaseInsensitive) == 0)
+ && (rawSetting.value("library").toString().compare(forcedLoad.library(), Qt::CaseInsensitive) == 0))
+ {
+ add = false;
+ }
+ }
+ if (add) {
+ results.append(
+ ExecutableForcedLoadSetting(
+ rawSetting.value("process").toString(),
+ rawSetting.value("library").toString()
+ ).withEnabled(rawSetting.value("enabled", false).toBool())
+ );
+ }
+ }
+
+ return results;
+}
+
+void Profile::storeForcedLibraries(const QString &executable, const QList<ExecutableForcedLoadSetting> &values)
+{
+ QList<QVariantMap> rawSettings;
+ for (auto setting : values) {
+ QVariantMap rawSetting;
+ rawSetting["enabled"] = setting.enabled();
+ rawSetting["process"] = setting.process();
+ rawSetting["library"] = setting.library();
+ rawSettings.append(rawSetting);
+ }
+ storeSettingsByArray("forced_libraries/" + executable, rawSettings);
+}
+
+void Profile::removeForcedLibraries(const QString &executable)
+{
+ m_Settings->remove("forced_libraries/" + executable);
+}
diff --git a/src/profile.h b/src/profile.h
index 95a5c59d..dea933ad 100644
--- a/src/profile.h
+++ b/src/profile.h
@@ -24,12 +24,14 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "modinfo.h"
#include <iprofile.h>
#include <delayedfilewriter.h>
+#include "executableinfo.h"
#include <QByteArray>
#include <QDir>
#include <QObject>
#include <QString>
#include <QSettings>
+#include <QList>
#include <boost/shared_ptr.hpp>
@@ -310,8 +312,20 @@ public:
void removeSetting(const QString &section, const QString &name = QString());
void removeSetting(const QString &name);
+ QVariantMap settingsByGroup(const QString &section) const;
+ void storeSettingsByGroup(const QString &section, const QVariantMap &values);
+
+ QList<QVariantMap> settingsByArray(const QString &prefix) const;
+ void storeSettingsByArray(const QString &prefix, const QList<QVariantMap> &values);
+
int getPriorityMinimum() const;
+ bool forcedLibrariesEnabled(const QString &executable);
+ void setForcedLibrariesEnabled(const QString &executable, bool enabled);
+ QList<MOBase::ExecutableForcedLoadSetting> determineForcedLibraries(const QString &executable);
+ void storeForcedLibraries(const QString &executable, const QList<MOBase::ExecutableForcedLoadSetting> &values);
+ void removeForcedLibraries(const QString &executable);
+
signals:
/**
diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp
index cdcbc2f4..b5e7684c 100644
--- a/src/selfupdater.cpp
+++ b/src/selfupdater.cpp
@@ -151,7 +151,7 @@ void SelfUpdater::testForUpdate()
} else if (newestVer < this->m_MOVersion) {
// this could happen if the user switches from using prereleases to
// stable builds. Should we downgrade?
- qDebug("this version is newer than the newest installed one: %s -> %s",
+ qDebug("This version is newer than the latest released one: %s -> %s",
qUtf8Printable(this->m_MOVersion.displayString()),
qUtf8Printable(newestVer.displayString()));
}
@@ -338,9 +338,8 @@ void SelfUpdater::installUpdate()
} else {
reportError(tr("Failed to start %1: %2")
.arg(m_UpdateFile.fileName())
- .arg((int)res));
+ .arg((INT_PTR)res));
}
-
m_UpdateFile.remove();
}
diff --git a/src/settings.cpp b/src/settings.cpp
index 605c257a..95d7af49 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -142,7 +142,7 @@ void Settings::registerAsNXMHandler(bool force)
}
parameters += L" \"" + executable + L"\"";
HINSTANCE res = ::ShellExecuteW(nullptr, L"open", nxmPath.c_str(), parameters.c_str(), nullptr, SW_SHOWNORMAL);
- if ((int)res <= 32) {
+ if ((INT_PTR)res <= 32) {
QMessageBox::critical(nullptr, tr("Failed"),
tr("Sorry, failed to start the helper application"));
}
@@ -161,8 +161,8 @@ void Settings::managedGameChanged(IPluginGame const *gamePlugin)
void Settings::registerPlugin(IPlugin *plugin)
{
m_Plugins.push_back(plugin);
- m_PluginSettings.insert(plugin->name(), QMap<QString, QVariant>());
- m_PluginDescriptions.insert(plugin->name(), QMap<QString, QVariant>());
+ m_PluginSettings.insert(plugin->name(), QVariantMap());
+ m_PluginDescriptions.insert(plugin->name(), QVariantMap());
for (const PluginSetting &setting : plugin->settings()) {
QVariant temp = m_Settings.value("Plugins/" + plugin->name() + "/" + setting.key, setting.defaultValue);
if (!temp.convert(setting.defaultValue.type())) {
@@ -607,6 +607,7 @@ void Settings::addBlacklistPlugin(const QString &fileName)
void Settings::writePluginBlacklist()
{
+ m_Settings.remove("pluginBlacklist");
m_Settings.beginWriteArray("pluginBlacklist");
int idx = 0;
for (const QString &plugin : m_PluginBlacklist) {
diff --git a/src/settings.h b/src/settings.h
index f88f9652..0286d4db 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -555,8 +555,8 @@ private:
std::vector<MOBase::IPlugin*> m_Plugins;
- QMap<QString, QMap<QString, QVariant>> m_PluginSettings;
- QMap<QString, QMap<QString, QVariant>> m_PluginDescriptions;
+ QMap<QString, QVariantMap> m_PluginSettings;
+ QMap<QString, QVariantMap> m_PluginDescriptions;
QSet<QString> m_PluginBlacklist;
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index bbd9a22c..1bbc256f 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -329,7 +329,7 @@ void SettingsDialog::on_resetDialogsButton_clicked()
void SettingsDialog::storeSettings(QListWidgetItem *pluginItem)
{
if (pluginItem != nullptr) {
- QMap<QString, QVariant> settings = pluginItem->data(Qt::UserRole + 1).toMap();
+ QVariantMap settings = pluginItem->data(Qt::UserRole + 1).toMap();
for (int i = 0; i < ui->pluginSettingsList->topLevelItemCount(); ++i) {
const QTreeWidgetItem *item = ui->pluginSettingsList->topLevelItem(i);
@@ -350,8 +350,8 @@ void SettingsDialog::on_pluginsList_currentItemChanged(QListWidgetItem *current,
ui->versionLabel->setText(plugin->version().canonicalString());
ui->descriptionLabel->setText(plugin->description());
- QMap<QString, QVariant> settings = current->data(Qt::UserRole + 1).toMap();
- QMap<QString, QVariant> descriptions = current->data(Qt::UserRole + 2).toMap();
+ QVariantMap settings = current->data(Qt::UserRole + 1).toMap();
+ QVariantMap descriptions = current->data(Qt::UserRole + 2).toMap();
ui->pluginSettingsList->setEnabled(settings.count() != 0);
for (auto iter = settings.begin(); iter != settings.end(); ++iter) {
QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList(iter.key()));
diff --git a/src/shared/leaktrace.cpp b/src/shared/leaktrace.cpp
index 1ff1fa9d..466162a4 100644
--- a/src/shared/leaktrace.cpp
+++ b/src/shared/leaktrace.cpp
@@ -1,3 +1,8 @@
+//disable warning messages 4302 , 4311 and 4312
+#pragma warning( disable : 4302 )
+#pragma warning( disable : 4311 )
+#pragma warning( disable : 4312 )
+
#include "leaktrace.h"
#include "stackdata.h"
#include <Windows.h>
@@ -31,7 +36,7 @@ static struct __TraceData {
for (auto iter = result.begin(); iter != result.end(); ++iter) {
printf("-----------------------------------\n"
"%d objects not freed, allocated at:\n%s",
- iter->second.size(), iter->first.toString().c_str());
+ static_cast<int>(iter->second.size()), iter->first.toString().c_str());
printf("Addresses: ");
for (int i = 0;
i < (std::min<int>)(5, static_cast<int>(iter->second.size())); ++i) {
@@ -55,3 +60,9 @@ void LeakTrace::TraceDealloc(void *ptr)
{
__trace.deregTrace(ptr);
}
+
+//re-enable warning messages 4302 , 4311 and 4312
+#pragma warning( default : 4302 )
+#pragma warning( default : 4311 )
+#pragma warning( default : 4312 )
+
diff --git a/src/spawn.cpp b/src/spawn.cpp
index f8a7bb5f..e1de5c0f 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -94,7 +94,7 @@ static bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory,
PROCESS_INFORMATION pi;
BOOL success = FALSE;
if (hooked) {
- qDebug() << "Creating process hooked: <" << QString::fromWCharArray(commandLine, length) <<">";
+ qDebug() << "Creating process hooked: <" << QString::fromWCharArray(commandLine, static_cast<int>(length)) <<">";
success = ::CreateProcessHooked(nullptr,
commandLine,
nullptr, nullptr, // no special process or thread attributes
diff --git a/src/stylesheets/Paper Automata.qss b/src/stylesheets/Paper Automata.qss
index 572d3313..3c20e940 100644
--- a/src/stylesheets/Paper Automata.qss
+++ b/src/stylesheets/Paper Automata.qss
@@ -1,5 +1,5 @@
-/* v1.1 Paper Automata by 6788-00 */
-/* https://6788-00.tumblr.com/ */
+/* v2.0 Paper Automata by 6788-00 */
+/* https://6788-00.tumblr.com/ */
/* Color Palette */
/* Background - Main | #CDC8B0 */
@@ -55,6 +55,10 @@ QAbstractItemView {
selection-color: #4E4B42;
}
+QAbstractItemView::item {
+ min-height: 22px;
+}
+
QAbstractItemView::item:hover {
/* rows on left and right pane when moused-over */
background: #B4AF9A;
@@ -233,7 +237,7 @@ QGroupBox::title {
background: transparent;
subcontrol-origin: padding;
subcontrol-position: top left;
- padding: 8px;
+ padding: 4px 8px;
}
/* Text Fields */
@@ -335,90 +339,90 @@ QPushButton::menu-indicator {
/* Icons */
-QPushButton#listOptionsBtn {
+#listOptionsBtn {
/* Options button */
qproperty-icon: url(./Paper/Automata/dots.svg);
qproperty-iconSize: 16px;
padding-left: 2px;
}
-QPushButton#openFolderMenu {
+#openFolderMenu {
/* Open Folder button */
qproperty-icon: url(./Paper/Automata/folder.svg);
qproperty-iconSize: 14px;
padding-left: 4px;
}
-QPushButton#restoreModsButton,
-QPushButton#restoreButton {
+#restoreModsButton,
+#restoreButton {
/* Restore Backup buttons */
qproperty-icon: url(./Paper/Automata/restore.svg);
qproperty-iconSize: 14px;
}
-QPushButton#saveModsButton,
-QPushButton#saveButton {
+#saveModsButton,
+#saveButton {
/* Backup buttons */
qproperty-icon: url(./Paper/Automata/backup.svg);
qproperty-iconSize: 14px;
}
-QPushButton#bossButton {
+#bossButton {
/* Sort button */
qproperty-icon: url(./Paper/Automata/sort.svg);
qproperty-iconSize: 14px;
}
-QPushButton#linkButton {
+#linkButton {
/* Shortcuts button */
qproperty-icon: url(./Paper/Automata/shortcut.svg);
qproperty-iconSize: 14px;
}
-QPushButton#btnRefreshData,
-QPushButton#refreshButton {
+#btnRefreshData,
+#refreshButton {
/* Refresh buttons */
qproperty-icon: url(./Paper/Automata/refresh.svg);
qproperty-iconSize: 14px;
}
-QPushButton#endorseBtn {
+#endorseBtn {
/* Endorse button on the Nexus Info tab of the Information window */
qproperty-icon: url(./Paper/Automata/heart.svg);
qproperty-iconSize: 14px;
}
-QPushButton#clearCacheButton {
+#clearCacheButton {
/* Clear Cache button on the Nexus tab of the Settings window */
qproperty-icon: url(./Paper/Automata/cross.svg);
qproperty-iconSize: 14px;
}
-QToolButton#deactivateESP,
-QToolButton#activateESP {
+#deactivateESP,
+#activateESP {
/* activate and deactivate ESP buttons */
background: #DAD4BB;
}
-QToolButton:hover#deactivateESP,
-QToolButton:hover#activateESP {
+#deactivateESP:hover,
+#activateESP:hover {
/* activate and deactivate ESP buttons when moused-over */
background: #B4AF9A;
}
-QToolButton#deactivateESP {
+#deactivateESP {
/* icon for the deactivate ESP button */
qproperty-icon: url(./Paper/Automata/backup.svg);
}
-QToolButton#activateESP {
+#activateESP {
/* icon for the activate ESP button */
qproperty-icon: url(./Paper/Automata/restore-alt.svg);
}
/* Run button */
-QPushButton#startButton {
+#startButton {
/* Run button */
background: #4E4B42;
color: #DAD4BB;
@@ -427,7 +431,7 @@ QPushButton#startButton {
padding: 6px;
}
-QPushButton:hover#startButton {
+#startButton:hover {
/* Run button when moused-over*/
background: #B4AF9A;
color: #4E4B42;
@@ -671,7 +675,7 @@ QToolTip {
QProgressBar {
/* progress bars when downloading */
- background: #DAD4BB;
+ background: transparent;
text-align: center;
border: 0px;
margin: 0px 10px;
@@ -747,7 +751,7 @@ QTabBar QToolButton:disabled {
QLCDNumber {
/* LCD number on the Conflicts tab */
background: #DAD4BB;
- color: #CD664D;
+ color: #4E4B42;
border: none;
}
@@ -791,7 +795,7 @@ QRadioButton::indicator:unchecked:hover {
QTreeView::indicator:unchecked:selected,
QRadioButton::indicator:unchecked:selected {
/* a checkbox that is unchecked when clicked */
- image: url(./Paper/Automata/unchecked-alt.svg);
+ border: 2px solid #DAD4BB;
}
QTreeView::indicator:checked,
@@ -887,52 +891,100 @@ QSlider::handle:hover {
/* Downloads Tab */
-QWidget#downloadTab QAbstractScrollArea,
+#downloadTab QAbstractScrollArea,
DownloadListWidget {
/* background of the entire downloads tab */
- background: transparent;
+ background: #DAD4BB;
}
-DownloadListWidget::item:!selected {
+DownloadListWidget QFrame,
+DownloadListWidgetCompact,
+DownloadListWidgetCompact QLabel {
+ /* an entry on the Downloads tab */
background: #DAD4BB;
}
-DownloadListWidget[downloadView=standard]::item {
- padding: 15px;
- margin-bottom: 2px;
+DownloadListWidget#frame {
+ /* outer box of an entry on the Downloads tab */
+ border: 2px solid #DAD4BB;
}
-QProgressBar[downloadView=standard] {
- margin: 4px 0px 6px 0px;
+#installLabel {
+ /* installed/done label */
+ color: none;
+}
+
+DownloadListWidgetCompact,
+DownloadListWidgetCompact QLabel {
+ /* an entry on the Downloads tab */
+ background: #DAD4BB;
}
-/* Compact Downloads View */
+/* New Downloads View */
+
+DownloadListWidget[downloadView=standard]::item {
+ /* Entries on the Standard Downloads View */
+ min-height: 44px;
+ margin: -16px 0;
+}
DownloadListWidget[downloadView=compact]::item {
- padding: 4px 4px 6px 4px;
- margin-bottom: 2px;
+ /* Entries on the Compact Downloads View */
+ min-height: 22px;
+ margin: -4px 0;
+}
+
+QProgressBar[downloadView=standard] {
+ /* Progress Bars on the Standard Downloads View */
+ background: transparent;
+ margin: 11px 0;
}
QProgressBar[downloadView=compact] {
- margin: 1px 0px 3px 0px;
+ /* Progress Bars on the Compact Downloads View */
+ background: transparent;
}
/* Categories Filter */
-QPushButton#displayCategoriesBtn {
+#displayCategoriesBtn {
/* Filter button */
min-width: 12px;
}
-QTreeWidget#categoriesList {
+#categoriesList {
/* Categories panel */
min-width: 200px;
margin-bottom: 4px;
}
-QGroupBox#categoriesGroup {
+#categoriesGroup {
/* Categories group box */
- padding-bottom: 0px;
+ padding-bottom: 0;
+ margin-top: 3px;
+}
+
+/* Fixes */
+
+#executablesListBox {
+ /* Increase right margin of the select executables box */
+ margin-right: 8px;
+}
+
+#stepsStack QWidget {
+ /* Groupboxes on the FOMOD Installer Dialog */
+ background: #CDC8B0;
+ border: none;
+}
+
+#stepsStack QGroupBox {
+ /* Fix to reimplement styling for Groupboxes on the FOMOD Installer dialog */
+ border: 2px solid #4E4B42;
+}
+
+#activeModslabel, #activePluginsLabel {
+ /* Increase the left margin of the counters */
+ padding-left: 6px;
}
-/* For the Glory of Mankind */ \ No newline at end of file
+/* For the Glory of Mankind */
diff --git a/src/stylesheets/Paper Dark by 6788.qss b/src/stylesheets/Paper Dark by 6788.qss
index ae6ea77b..9b07e3fb 100644
--- a/src/stylesheets/Paper Dark by 6788.qss
+++ b/src/stylesheets/Paper Dark by 6788.qss
@@ -1,4 +1,4 @@
-/* v4.3 Paper Dark by 6788-00 */
+/* v5.0 Paper Dark by 6788-00 */
/* https://6788-00.tumblr.com/ */
/* Color Palette */
@@ -39,7 +39,7 @@ QAbstractItemView {
}
QAbstractItemView::item {
- padding: 1px;
+ min-height: 22px;
}
QAbstractItemView::item:hover {
@@ -190,14 +190,14 @@ QListView::item:hover {
/* a row on the saves tab when moused-over */
background: #3D3D3D;
color: #FFFFFF;
- padding: 2px 0px;
+ padding: 0;
}
QListView::item:selected {
/* a row on the saves tab when clicked */
background: #006868;
color: #FFFFFF;
- padding: 2px 0px;
+ padding: 0;
}
QTextEdit {
@@ -206,12 +206,6 @@ QTextEdit {
border-radius: 6px;
}
-QWebView {
- /* Nexus Info window */
- background: #141414;
- border-radius: 6px;
-}
-
/* Group Boxes */
QGroupBox {
@@ -682,6 +676,7 @@ QToolTip {
QProgressBar {
/* progress bars when downloading */
background: #141414;
+ color: #FFFFFF;
text-align: center;
border: 2px solid #242424;
border-radius: 6px;
@@ -705,10 +700,6 @@ QTabWidget::pane {
border-radius: 10px;
}
-QTabWidget QAbstractScrollArea::item {
- padding: 2px;
-}
-
QTabWidget::tab-bar {
/* tabs */
alignment: center;
@@ -781,6 +772,7 @@ QLCDNumber {
background: #141414;
color: #006868;
border-radius: 6px;
+
}
/* Tables (Configure Mod Categories) */
@@ -912,37 +904,65 @@ QSlider::handle:hover {
background: #3D3D3D;
}
-/* Downloads Tab */
+/* Pre-v2.1.7 Downloads Tab */
#downloadTab QAbstractScrollArea {
/* background of the entire downloads tab */
- background: #242424;
+ background: #141414;
+}
+
+DownloadListWidget QFrame,
+DownloadListWidgetCompact,
+DownloadListWidgetCompact QLabel {
+ /* an entry on the Downloads tab */
+ background: #141414;
+}
+
+DownloadListWidget#frame {
+ /* outer box of an entry on the Downloads tab */
+ border: none;
+}
+
+#installLabel {
+ /* installed/done label */
+ color: none;
+}
+
+DownloadListWidgetCompact,
+DownloadListWidgetCompact QLabel {
+ /* an entry on the Downloads tab in Compact View */
+ background: #141414;
}
+/* New Downloads View */
+
DownloadListWidget[downloadView=standard]::item {
- padding: 15px;
- border-bottom: 2px solid #666666;
+ /* Entries on the Standard Downloads View */
+ min-height: 44px;
+ margin: -16px 0;
+}
+
+DownloadListWidget[downloadView=compact]::item {
+ /* Entries on the Compact Downloads View */
+ min-height: 22px;
+ margin: -4px 0;
}
QProgressBar[downloadView=standard] {
+ /* Progress Bars on the Standard Downloads View */
background: transparent;
- border: 2px solid #666666;
- border-radius: 8px;
- margin: 4px 0px 6px 0px;
+ margin: 11px 0;
}
-/* Compact Downloads View */
-
-DownloadListWidget[downloadView=compact]::item {
- padding: 3px;
- border-bottom: 2px solid #666666;
+QProgressBar[downloadView=standard]::chunk,
+QProgressBar[downloadView=compact]::chunk {
+ /* The Loading Portion of Progress Bars on the Downloads View */
+ border-right: 2px solid #242424;
}
QProgressBar[downloadView=compact] {
+ /* Progress Bars on the Compact Downloads View */
background: transparent;
- border: 2px solid gray;
- border-radius: 8px;
- margin: 1px 0px 3px 0px;
}
/* Categories Filter */
@@ -965,7 +985,28 @@ QProgressBar[downloadView=compact] {
/* Fixes */
+#executablesListBox {
+ /* Increase right margin of the select executables box */
+ margin-right: 8px;
+}
+
#executablesListBox::item {
/* fixes the black text problem on the Modify Executables window */
color: #D3D3D3;
-} \ No newline at end of file
+}
+
+#stepsStack QWidget {
+ /* Groupboxes on the FOMOD Installer Dialog */
+ border: none;
+}
+
+#stepsStack QGroupBox {
+ /* Fix to reimplement styling for Groupboxes on the FOMOD Installer dialog */
+ border: 2px solid #141414;
+ border-radius: 10px;
+}
+
+#activeModslabel, #activePluginsLabel {
+ /* Increase the left margin of the counters */
+ padding-left: 6px;
+}
diff --git a/src/stylesheets/Paper Light by 6788.qss b/src/stylesheets/Paper Light by 6788.qss
index 5e69b79d..d78c26ea 100644
--- a/src/stylesheets/Paper Light by 6788.qss
+++ b/src/stylesheets/Paper Light by 6788.qss
@@ -1,4 +1,4 @@
-/* v4.3 Paper Light by 6788-00 */
+/* v5.0 Paper Light by 6788-00 */
/* https://6788-00.tumblr.com/ */
/* Color Palette */
@@ -38,6 +38,10 @@ QAbstractItemView {
selection-color: #FFFFFF;
}
+QAbstractItemView::item {
+ min-height: 22px;
+}
+
QAbstractItemView::item:hover {
/* rows on left and right pane when moused-over */
background: #C2C2C2;
@@ -187,22 +191,17 @@ QListView {
border-radius: 6px;
}
-QListView::item {
- /* Increases the line height of the Saves tab */
- padding: 2px 0px;
-}
-
QListView::item:hover {
/* uncertain, assumed: rows on the saves window when moused-over */
background: #C2C2C2;
- padding: 2px 0px;
+ padding: 0;
}
QListView::item:selected {
/*uncertain, assumed: rows on the saves window when clicked */
background: #008484;
color: #FFFFFF;
- padding: 2px 0px;
+ padding: 0;
}
QTextEdit {
@@ -211,12 +210,6 @@ QTextEdit {
border-radius: 6px;
}
-QWebView {
- /* Nexus Info window */
- background: #FFFFFF;
- border-radius: 6px;
-}
-
/* Group Boxes */
QGroupBox {
@@ -680,9 +673,10 @@ QToolTip {
border-radius: 6px;
}
-/* Progress Bars */
+/* Progress Bars (Downloads) */
QProgressBar {
+ /* progress bars when downloading */
background: #FFFFFF;
text-align: center;
border: 0px;
@@ -707,10 +701,6 @@ QTabWidget::pane {
border-radius: 10px;
}
-QTabWidget QAbstractScrollArea::item {
- padding: 2px;
-}
-
QTabWidget::tab-bar {
/* tabs */
alignment: center;
@@ -921,37 +911,46 @@ QSlider::handle:hover {
background: #008484;
}
-/* Downloads Tab */
+/* Pre-v2.1.7 Downloads Tab */
#downloadTab QAbstractScrollArea {
/* background of the entire downloads tab */
- background: #EBEBEB;
+ background: #FFFFFF;
}
-DownloadListWidget[downloadView=standard]::item {
- padding: 15px;
- border-bottom: 2px solid #BBBBBB;
+DownloadListWidget QFrame,
+DownloadListWidgetCompact,
+DownloadListWidgetCompact QLabel {
+ /* an entry on the Downloads tab */
+ background: #FFFFFF;
}
-QProgressBar[downloadView=standard] {
- background: transparent;
- border: 2px solid gray;
- border-radius: 8px;
- margin: 4px 0px 6px 0px;
+DownloadListWidget #frame {
+ /* outer box of an entry on the Downloads tab */
+ border: none;
+}
+
+#installLabel {
+ /* installed/done label */
+ color: none;
}
-/* Compact Downloads View */
+DownloadListWidgetCompact,
+DownloadListWidgetCompact QLabel {
+ /* an entry on the Downloads tab in Compacts View*/
+ background: #FFFFFF;
+}
-DownloadListWidget[downloadView=compact]::item {
- padding: 3px;
- border-bottom: 2px solid #BBBBBB;
+/* New Downloads View */
+
+DownloadListWidget[downloadView=standard]::item {
+ /* an entry on the Downloads view */
+ min-height: 44px;
}
-QProgressBar[downloadView=compact] {
- background: transparent;
- border: 2px solid gray;
- border-radius: 8px;
- margin: 1px 0px 3px 0px;
+QProgressBar[downloadView=standard] {
+ /* a progress bar on the Downloads view */
+ margin: 11px 0;
}
/* Categories Filter */
@@ -970,4 +969,27 @@ QProgressBar[downloadView=compact] {
#categoriesGroup {
/* Categories group box */
padding-bottom: 0px;
+}
+
+/* Fixes */
+
+#executablesListBox {
+ /* Increase right margin of the select executables box */
+ margin-right: 8px;
+}
+
+#stepsStack QWidget {
+ /* Groupboxes on the FOMOD Installer Dialog */
+ border: none;
+}
+
+#stepsStack QGroupBox {
+ /* Fix to reimplement styling for Groupboxes on the FOMOD Installer dialog */
+ border: 2px solid #EBEBEB;
+ border-radius: 10px;
+}
+
+#activeModslabel, #activePluginsLabel {
+ /* Increase the left margin of the counters */
+ padding-left: 6px;
} \ No newline at end of file
diff --git a/src/stylesheets/Paper/Dark/check.svg b/src/stylesheets/Paper/Dark/check.svg
index 101ee45e..2d113294 100644
--- a/src/stylesheets/Paper/Dark/check.svg
+++ b/src/stylesheets/Paper/Dark/check.svg
@@ -17,7 +17,7 @@
inkscape:export-filename="D:\Bethesda Game Modding\Mod Organizer 2\stylesheets\Paper\Dark\dots.png"
inkscape:export-xdpi="307.20001"
inkscape:export-ydpi="307.20001"
- inkscape:version="0.92.1 r15371"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="check.svg">
<defs
id="defs2" />
@@ -28,9 +28,9 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:zoom="24.357491"
- inkscape:cx="1.6266143"
- inkscape:cy="5.0770231"
+ inkscape:zoom="11.625"
+ inkscape:cx="-3.537598"
+ inkscape:cy="-2.9645926"
inkscape:document-units="px"
inkscape:current-layer="layer25"
showgrid="false"
@@ -42,7 +42,7 @@
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
- showguides="true"
+ showguides="false"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1027"
diff --git a/src/stylesheets/Paper/Dark/highlight.svg b/src/stylesheets/Paper/Dark/highlight.svg
new file mode 100644
index 00000000..9dee51d8
--- /dev/null
+++ b/src/stylesheets/Paper/Dark/highlight.svg
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="128"
+ height="64"
+ viewBox="0 0 128 64"
+ version="1.1"
+ id="svg8"
+ inkscape:export-filename="D:\Bethesda Game Modding\Mod Organizer 2\stylesheets\Paper\Dark\dots.png"
+ inkscape:export-xdpi="307.20001"
+ inkscape:export-ydpi="307.20001"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="highlight.svg">
+ <defs
+ id="defs2">
+ <meshgradient
+ inkscape:collect="always"
+ id="meshgradient3955"
+ gradientUnits="userSpaceOnUse"
+ x="0"
+ y="-44">
+ <meshrow
+ id="meshrow18393">
+ <meshpatch
+ id="meshpatch18395">
+ <stop
+ path="c 4.96082,0 9.92164,0 14.8825,0"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18397" />
+ <stop
+ path="c 0,10.6667 0,21.3333 0,32"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18399" />
+ <stop
+ path="c -4.96082,1.77636e-015 -9.92165,1.77636e-015 -14.8825,1.77636e-015"
+ style="stop-color:#006868;stop-opacity:1"
+ id="stop18401" />
+ <stop
+ path="c 0,-10.6667 0,-21.3333 0,-32"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18403" />
+ </meshpatch>
+ <meshpatch
+ id="meshpatch18405">
+ <stop
+ path="c 16.3725,0 32.7451,0 49.1175,0"
+ id="stop18407" />
+ <stop
+ path="c 0,10.6667 0,21.3333 0,32"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18409" />
+ <stop
+ path="c -16.3725,0 -32.745,0 -49.1175,0"
+ style="stop-color:#006868;stop-opacity:1"
+ id="stop18411" />
+ </meshpatch>
+ <meshpatch
+ id="meshpatch18413">
+ <stop
+ path="c 17.6536,0 35.3073,0 52.9609,0"
+ id="stop18415" />
+ <stop
+ path="c 0,10.6667 0,21.3333 0,32"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18417" />
+ <stop
+ path="c -17.6536,0 -35.3073,0 -52.9609,0"
+ style="stop-color:#006868;stop-opacity:1"
+ id="stop18419" />
+ </meshpatch>
+ <meshpatch
+ id="meshpatch18421">
+ <stop
+ path="c 3.67971,0 7.35941,0 11.0391,0"
+ id="stop18423" />
+ <stop
+ path="c 0,10.6667 0,21.3333 0,32"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18425" />
+ <stop
+ path="c -3.6797,0 -7.35941,0 -11.0391,0"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18427" />
+ </meshpatch>
+ </meshrow>
+ <meshrow
+ id="meshrow18429">
+ <meshpatch
+ id="meshpatch18431">
+ <stop
+ path="c 0,10.6667 0,21.3333 0,32"
+ id="stop18433" />
+ <stop
+ path="c -4.96082,-3.55271e-015 -9.92165,-3.55271e-015 -14.8825,-3.55271e-015"
+ style="stop-color:#007d7d;stop-opacity:1"
+ id="stop18435" />
+ <stop
+ path="c 0,-10.6667 0,-21.3333 0,-32"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18437" />
+ </meshpatch>
+ <meshpatch
+ id="meshpatch18439">
+ <stop
+ path="c 0,10.6667 0,21.3333 0,32"
+ id="stop18441" />
+ <stop
+ path="c -16.3725,0 -32.745,0 -49.1175,0"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18443" />
+ </meshpatch>
+ <meshpatch
+ id="meshpatch18445">
+ <stop
+ path="c 7.38594e-006,10.6667 0.000207035,21.333 2.21578e-005,32"
+ id="stop18447" />
+ <stop
+ path="c -17.6536,-4.55705e-005 -35.3071,-0.000147247 -52.9609,1.82555e-005"
+ style="stop-color:#007f7f;stop-opacity:1"
+ id="stop18449" />
+ </meshpatch>
+ <meshpatch
+ id="meshpatch18451">
+ <stop
+ path="c 0,10.6667 0.000232338,21.3329 0,32"
+ id="stop18453" />
+ <stop
+ path="c -3.6797,-1.69572e-006 -7.3594,-8.75677e-006 -11.0391,-1.82555e-005"
+ style="stop-color:#008484;stop-opacity:1"
+ id="stop18455" />
+ </meshpatch>
+ </meshrow>
+ </meshgradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#505050"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2410685"
+ inkscape:cx="55.924572"
+ inkscape:cy="37.651744"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer25"
+ showgrid="false"
+ units="px"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:snap-page="true"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1027"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:snap-center="true"
+ inkscape:snap-object-midpoints="true"
+ inkscape:measure-start="18.8975,12.498"
+ inkscape:measure-end="20,12.498"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:snap-midpoints="true"
+ inkscape:snap-global="true" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer25"
+ inkscape:label="Content"
+ transform="translate(0,44)">
+ <rect
+ style="opacity:1;fill:url(#meshgradient3955);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:120;stroke-opacity:1;paint-order:markers stroke fill"
+ id="rect3848"
+ width="128"
+ height="64"
+ x="0"
+ y="-44" />
+ </g>
+</svg>
diff --git a/src/stylesheets/Parchment v1.1 by Bob.qss b/src/stylesheets/Parchment v1.1 by Bob.qss
new file mode 100644
index 00000000..da3546d1
--- /dev/null
+++ b/src/stylesheets/Parchment v1.1 by Bob.qss
@@ -0,0 +1,587 @@
+/* v1.1 Parchment by Bob */
+
+
+/* Special Thanks */
+
+/* Parchment is based on Paper Themes for Mod Organizer 2 by 6788
+https://www.nexusmods.com/skyrim/mods/64439
+https://6788-00.tumblr.com/
+
+and
+
+*************************************
+ Skyrim
+****************************************
+ Author: chintsu_kun
+ Version: 1.1.2
+ Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html)
+ Url: http://www.nexusmods.com/skyrim/mods/73817/?
+
+****************************************
+
+For the Checkbox Coding and for the Picture Files which I Edited in Paint 3D */
+
+/* Main Window */
+
+QWidget {
+ background: #DBD399;
+ color: #000000;
+}
+
+QWidget:disabled {
+ background: #DBD399;
+ color: #baae94;
+}
+
+QMainWindow::separator {
+ border: 0px;
+}
+
+QAbstractItemView {
+ background: #F7F6CF;
+ alternate-background-color: #EFE9BA;
+ show-decoration-selected: 1;
+ selection-background-color: #0CA6FF;
+ selection-color: #F7F6CF;
+}
+
+QAbstractItemView::item:hover {
+ background: #008F8F;
+ color: #F7F6CF;
+}
+
+QAbstractItemView::item:selected {
+ background: #0CA6FF;
+ color: #F7F6CF;
+}
+
+QAbstractScrollArea::corner {
+ background: #F7F6CF;
+ border: 2px solid #DBD399;
+ border-bottom-right-radius: 6px;
+ margin: 0px -2px -2px 0px;
+}
+
+/* Toolbar */
+
+QToolBar {
+ background: #DBD399;
+ border: 1px solid #DBD399;
+}
+
+QToolBar::separator {
+ background: #DBD399;
+}
+
+QToolButton {
+ background: #F7F6CF;
+ padding: 4px 6px;
+ border-radius: 6px;
+ margin: 4px 4px 0px 4px;
+}
+
+QToolButton:hover {
+ background: #008F8F;
+}
+
+QToolButton:pressed {
+ background: #0CA6FF;
+}
+
+/* Left Pane & File Trees */
+
+QTreeView {
+ border-radius: 6px;
+}
+
+QTreeView::branch:hover {
+ background: #008F8F;
+ color: #F7F6CF;
+}
+
+QTreeView::branch:selected {
+ background: #0CA6FF;
+ color: #F7F6CF;
+}
+
+QTreeView::item:selected {
+ background: #0CA6FF;
+ color: #F7F6CF;
+}
+
+QTreeView::branch:has-children:!has-siblings:closed,
+QTreeView::branch:closed:has-children:has-siblings {
+ image: url(:/stylesheet/branch-closed.png);
+ border: 0px;
+}
+
+QTreeView::branch:open:has-children:!has-siblings,
+QTreeView::branch:open:has-children:has-siblings {
+ image: url(:/stylesheet/branch-open.png);
+ border: 0px;
+}
+
+QListView {
+ border-radius: 6px;
+}
+
+QListView::item:hover {
+ background: #008F8F;
+ color: #F7F6CF;
+}
+
+QListView::item:selected {
+ background: #0CA6FF;
+ color: #F7F6CF;
+}
+
+QTextEdit {
+ background: #F7F6CF;
+ border-radius: 6px;
+}
+
+QWebView {
+ background: #F7F6CF;
+ border-radius: 6px;
+}
+
+/* Group Boxes */
+
+QGroupBox {
+ padding: 24px 4px;
+ border: 2px solid #F7F6CF;
+ border-radius: 10px;
+}
+
+QGroupBox::title {
+ subcontrol-origin: padding;
+ subcontrol-position: top left;
+ padding: 8px;
+}
+
+/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */
+/*common*/
+QGroupBox::indicator,
+QTreeView::indicator,
+
+QCheckBox::indicator {
+ background-color: transparent;
+ border: none;
+ width: 14px;
+ height: 14px;
+}
+
+QGroupBox::indicator:checked, QGroupBox::indicator:indeterminate,
+QTreeView::indicator:checked,
+QTreeView::indicator:indeterminate,
+QCheckBox::indicator:checked,
+
+QCheckBox::indicator:indeterminate {
+ image: url(./Parchment/checkbox-checked.png);
+}
+
+QGroupBox::indicator:checked:hover, QGroupBox::indicator:indeterminate:hover,
+QTreeView::indicator:checked:hover,
+QTreeView::indicator:indeterminate:hover,
+QCheckBox::indicator:checked:hover,
+
+QCheckBox::indicator:indeterminate:hover {
+ image: url(./Parchment/checkbox-checked-hover.png);
+}
+
+ QGroupBox::indicator:checked:disabled, QGroupBox::indicator:indeterminate:disabled,
+ QTreeView::indicator:checked:disabled,
+ QTreeView::indicator:indeterminate:disabled,
+ QCheckBox::indicator:checked:disabled,
+
+ QCheckBox::indicator:indeterminate:disabled {
+ image: url(./Parchment/checkbox-checked-disabled.png);
+}
+
+ QGroupBox::indicator:unchecked,
+ QTreeView::indicator:unchecked,
+
+ QCheckBox::indicator:unchecked {
+ image: url(./Parchment/checkbox.png);
+}
+
+ QGroupBox::indicator:unchecked:hover,
+ QTreeView::indicator:unchecked:hover,
+
+ QCheckBox::indicator:unchecked:hover {
+ image: url(./Parchment/checkbox-hover.png);
+}
+
+ QGroupBox::indicator:unchecked:disabled,
+ QTreeView::indicator:unchecked:disabled,
+
+ QCheckBox::indicator:unchecked:disabled {
+ image: url(./Parchment/checkbox-disabled.png);
+}
+
+/* Search Boxes */
+
+QLineEdit {
+ background: #F7F6CF;
+ min-height: 14px;
+ padding: 2px;
+ border: 2px solid #F7F6CF;
+ border-radius: 6px;
+ margin-top: 3px;
+}
+
+QLineEdit:hover {
+ border: 2px solid #008F8F;
+}
+
+/* Most Dropdowns */
+
+QComboBox {
+ background: #F7F6CF;
+ min-height: 20px;
+ padding-left: 5px;
+ border: 2px solid #F7F6CF;
+ border-radius: 6px;
+ margin: 3px 0px 1px 0px;
+}
+
+QComboBox:hover {
+ border: 2px solid #008F8F;
+}
+
+QComboBox:on {
+ background: #0CA6FF;
+ color: #F7F6CF;
+ border: 2px solid #0CA6FF;
+}
+
+QComboBox::drop-down {
+ width: 20px;
+ subcontrol-origin: padding;
+ subcontrol-position: top right;
+ border: none;
+}
+
+QComboBox QAbstractItemView {
+ border: 0px;
+}
+
+QComboBox::down-arrow {
+ image: url(:/stylesheet/combobox-down.png);
+}
+
+/* Most Buttons */
+
+QPushButton {
+ background: #F7F6CF;
+ color: #000000;
+ min-height: 28px;
+ padding: 4px 22px;
+ border-radius: 9px;
+}
+
+QPushButton:hover {
+ background: #008F8F;
+ color: #F7F6CF;
+}
+
+QPushButton:pressed {
+ background: #0CA6FF;
+ color: #F7F6CF;
+}
+
+QPushButton:checked {
+ background: #0CA6FF;
+ color: #0CA6FF;
+ margin: 4px;
+}
+
+/* Scroll Bars */
+
+/* Horizontal */
+
+QScrollBar:horizontal {
+ background: #F7F6CF;
+ height: 20px;
+ border: 2px solid #DBD399;
+ margin: 0px 23px -2px 23px;
+}
+
+QScrollBar::handle:horizontal {
+ background: #DBD399;
+ min-width: 32px;
+ border-radius: 6px;
+ margin: 2px;
+}
+
+QScrollBar::add-line:horizontal {
+ background: #F7F6CF;
+ width: 23px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+ border: 2px solid #DBD399;
+ margin: 0px -2px -2px 0px;
+}
+
+QScrollBar::sub-line:horizontal {
+ background: #F7F6CF;
+ width: 23px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+ border: 2px solid #DBD399;
+ border-bottom-left-radius: 6px;
+ margin: 0px 0px -2px -2px;
+}
+
+/* Vertical */
+
+QScrollBar:vertical {
+ background: #F7F6CF;
+ width: 20px;
+ border: 2px solid #DBD399;
+ margin: 23px -2px 23px 0px;
+}
+
+QScrollBar::handle:vertical {
+ background: #DBD399;
+ min-height: 32px;
+ border-radius: 6px;
+ margin: 2px;
+}
+
+QScrollBar::add-line:vertical {
+ background: #F7F6CF;
+ height: 23px;
+ subcontrol-position: bottom;
+ subcontrol-origin: margin;
+ border: 2px solid #DBD399;
+ border-bottom-right-radius: 6px;
+ margin: 0px -2px -2px 0px;
+}
+
+QScrollBar::sub-line:vertical {
+ background: #F7F6CF;
+ height: 23px;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+ border: 2px solid #DBD399;
+ border-top-right-radius: 6px;
+ margin: -2px -2px 0px 0px;
+}
+
+/* Combined */
+
+QScrollBar::handle:horizontal:hover,
+QScrollBar::handle:vertical:hover,
+QScrollBar::add-line:horizontal:hover,
+QScrollBar::sub-line:horizontal:hover,
+QScrollBar::add-line:vertical:hover,
+QScrollBar::sub-line:vertical:hover {
+ background: #008F8F;
+}
+
+QScrollBar::handle:horizontal:pressed,
+QScrollBar::handle:vertical:pressed,
+QScrollBar::add-line:horizontal:pressed,
+QScrollBar::sub-line:horizontal:pressed,
+QScrollBar::add-line:vertical:pressed,
+QScrollBar::sub-line:vertical:pressed {
+ background: #0CA6FF;
+}
+
+QScrollBar::add-page:horizontal,
+QScrollBar::sub-page:horizontal,
+QScrollBar::add-page:vertical,
+QScrollBar::sub-page:vertical {
+ background: transparent;
+}
+
+QScrollBar::up-arrow:vertical,
+QScrollBar::right-arrow:horizontal,
+QScrollBar::down-arrow:vertical,
+QScrollBar::left-arrow:horizontal {
+ height: 1px;
+ width: 1px;
+ border: 1px solid #DBD399;
+}
+
+/* Header Rows */
+
+QHeaderView {
+ background: #DBD399;
+}
+
+QHeaderView::section {
+ background: #F7F6CF;
+ color: #000000;
+ height: 22px;
+ padding: 0px 5px;
+ border: 0px;
+ border-bottom: 2px solid #DBD399;
+ border-right: 2px solid #DBD399;
+}
+
+QHeaderView::section:first {
+ border-top-left-radius: 6px;
+}
+
+QHeaderView::section:last {
+ border-right: 0px;
+ border-top-right-radius: 6px;
+}
+
+QHeaderView::section:hover {
+ background: #008F8F;
+ color: #F7F6CF;
+}
+
+QHeaderView::down-arrow {
+ padding-right: 4px;
+ height: 10px;
+ width: 10px;
+}
+
+/* Context Menus, Toolbar Dropdowns, & Tooltips */
+
+QMenu {
+ background: #F7F6CF;
+ selection-color: #F7F6CF;
+ border: 0px;
+}
+
+QMenu::item {
+ background: #F7F6CF;
+ selection-background-color: #008F8F;
+ padding: 4px 20px;
+}
+
+QMenu::item:selected {
+ background: #008F8F;
+ color: #F7F6CF;
+}
+
+QMenu::item:disabled {
+ background: #F7F6CF;
+ color: #444444;
+}
+
+QMenu::separator {
+ background: #DBD399;
+ height: 2px;
+}
+
+QMenu::icon {
+ margin: 1px;
+}
+
+QToolTip {
+ background: #F7F6CF;
+ color: #000000;
+ padding: 1px;
+ border: 0px;
+}
+
+/* Progress Bars (Downloads) */
+
+QProgressBar {
+ background: #F7F6CF;
+ text-align: center;
+ border: 0px;
+ border-radius: 6px;
+ margin: 0px 10px;
+}
+
+QProgressBar::chunk {
+ background: #008F8F;
+}
+
+/* Right Pane and Tab Bars */
+
+QTabWidget::pane {
+ top: 1px;
+ padding: 2px 2px 10px 2px;
+ border: 2px solid #F7F6CF;
+ border-radius: 10px;
+}
+
+QTabWidget::tab-bar {
+ alignment: center;
+}
+
+QTabBar::tab {
+ background: #F7F6CF;
+ color: #000000;
+ padding: 4px 1em;
+ border: 1px solid #DBD399;
+ border-top: 0px;
+ border-bottom: 0px;
+}
+
+QTabBar::tab:!selected {
+ background: #F7F6CF;
+ color: #000000;
+}
+
+QTabBar::tab:disabled {
+ background: #DBD399;
+ color: #444444;
+}
+
+QTabBar::tab:selected {
+ color: #0CA6FF;
+
+}
+
+QTabBar::tab:!selected:hover {
+ background: #0CA6FF;
+ color: #F7F6CF;
+}
+
+QTabBar::tab:first {
+ border-top-left-radius: 10px;
+ border-bottom-left-radius: 10px;
+}
+
+QTabBar::tab:last {
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+}
+
+QTabBar QToolButton {
+ background: #008F8F;
+ padding: 1px;
+ border-radius: 6px;
+ margin: 1px;
+}
+
+QTabBar QToolButton:disabled {
+ background: transparent;
+}
+
+/* Sliders (Configurator) */
+
+/* QSlider::groove:horizontal {
+ background: #F7F6CF;
+ height: 1px;
+ border: 1px solid #F7F6CF;
+}
+
+QSlider::handle:horizontal {
+ background: #008F8F;
+ width: 10px;
+ border: 2px solid #008F8F;
+ border-radius: 6px;
+ margin: -10px 0px;
+}
+
+QSlider::handle:horizontal:hover {
+ background: #0CA6FF;
+ border: 2px solid #0CA6FF;
+} */
+
+/* Tables (Configure Mod Categories) */
+
+QTableView {
+ gridline-color: #DBD399;
+ border: 0px;
+} \ No newline at end of file
diff --git a/src/stylesheets/Parchment/checkbox-alt-checked.png b/src/stylesheets/Parchment/checkbox-alt-checked.png
new file mode 100644
index 00000000..b2f32952
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-alt-checked.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox-alt-unchecked-hover.png b/src/stylesheets/Parchment/checkbox-alt-unchecked-hover.png
new file mode 100644
index 00000000..bf4cb027
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-alt-unchecked-hover.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox-alt-unchecked.png b/src/stylesheets/Parchment/checkbox-alt-unchecked.png
new file mode 100644
index 00000000..35073ad7
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-alt-unchecked.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox-checked-disabled.png b/src/stylesheets/Parchment/checkbox-checked-disabled.png
new file mode 100644
index 00000000..21e7e057
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-checked-disabled.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox-checked-hover.png b/src/stylesheets/Parchment/checkbox-checked-hover.png
new file mode 100644
index 00000000..6603a99e
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-checked-hover.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox-checked.png b/src/stylesheets/Parchment/checkbox-checked.png
new file mode 100644
index 00000000..0f098137
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-checked.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox-disabled.png b/src/stylesheets/Parchment/checkbox-disabled.png
new file mode 100644
index 00000000..d1d5a887
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-disabled.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox-hover.png b/src/stylesheets/Parchment/checkbox-hover.png
new file mode 100644
index 00000000..92df6af4
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox-hover.png
Binary files differ
diff --git a/src/stylesheets/Parchment/checkbox.png b/src/stylesheets/Parchment/checkbox.png
new file mode 100644
index 00000000..e02aa21d
--- /dev/null
+++ b/src/stylesheets/Parchment/checkbox.png
Binary files differ
diff --git a/src/usvfsconnector.cpp b/src/usvfsconnector.cpp
index ef7314c0..5ad19fb0 100644
--- a/src/usvfsconnector.cpp
+++ b/src/usvfsconnector.cpp
@@ -138,6 +138,8 @@ UsvfsConnector::UsvfsConnector()
BlacklistExecutable(buf.data());
}
+ ClearLibraryForceLoads();
+
m_LogWorker.moveToThread(&m_WorkerThread);
connect(&m_WorkerThread, SIGNAL(started()), &m_LogWorker, SLOT(process()));
@@ -203,7 +205,8 @@ void UsvfsConnector::updateMapping(const MappingType &mapping)
*/
}
-void UsvfsConnector::updateParams(int logLevel, int crashDumpsType, QString executableBlacklist) {
+void UsvfsConnector::updateParams(int logLevel, int crashDumpsType, QString executableBlacklist)
+{
USVFSUpdateParams(::logLevel(logLevel), ::crashDumpsType(crashDumpsType));
ClearExecutableBlacklist();
for (auto exec : executableBlacklist.split(";")) {
@@ -211,3 +214,16 @@ void UsvfsConnector::updateParams(int logLevel, int crashDumpsType, QString exec
BlacklistExecutable(buf.data());
}
}
+
+void UsvfsConnector::updateForcedLibraries(const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries)
+{
+ ClearLibraryForceLoads();
+ for (auto setting : forcedLibraries) {
+ if (setting.enabled()) {
+ ForceLoadLibrary(
+ setting.process().toStdWString().data(),
+ setting.library().toStdWString().data()
+ );
+ }
+ }
+}
diff --git a/src/usvfsconnector.h b/src/usvfsconnector.h
index 3aefb703..8a88bde5 100644
--- a/src/usvfsconnector.h
+++ b/src/usvfsconnector.h
@@ -27,7 +27,9 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QThread>
#include <QFile>
#include <QDebug>
+#include <QList>
#include <usvfsparameters.h>
+#include "executableinfo.h"
class LogWorker : public QThread {
@@ -83,6 +85,7 @@ public:
void updateMapping(const MappingType &mapping);
void updateParams(int logLevel, int crashDumpsType, QString executableBlacklist);
+ void updateForcedLibraries(const QList<MOBase::ExecutableForcedLoadSetting> &forcedLibraries);
private:
diff --git a/src/version.rc b/src/version.rc
index e1f80785..3e03e22a 100644
--- a/src/version.rc
+++ b/src/version.rc
@@ -1,37 +1,37 @@
-#include "Winver.h"
-
-// If VS_FF_PRERELEASE is not set, MO labels the build as a release and uses VER_FILEVERSION to determine version number.
-// Otherwise, if letters are used in VER_FILEVERSION_STR, uses the full MOBase::VersionInfo parser
-// Otherwise, uses the numbers from VER_FILEVERSION and sets the release type as pre-alpha
-#define VER_FILEVERSION 2,2,0
-#define VER_FILEVERSION_STR "2.2.0\0"
-
-VS_VERSION_INFO VERSIONINFO
-FILEVERSION VER_FILEVERSION
-PRODUCTVERSION VER_FILEVERSION
-FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
-FILEFLAGS VS_FF_PRERELEASE
-FILEOS VOS__WINDOWS32
-FILETYPE VFT_APP
-FILESUBTYPE (0)
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904B0"
- BEGIN
- VALUE "FileVersion", VER_FILEVERSION_STR
- VALUE "CompanyName", "Mod Organizer 2 Team\0"
- VALUE "FileDescription", "Mod Organizer 2 GUI\0"
- VALUE "OriginalFilename", "ModOrganizer.exe\0"
- VALUE "InternalName", "ModOrganizer2\0"
- VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2018 Mod Organizer 2 contributors\0"
- VALUE "ProductName", "Mod Organizer 2\0"
- VALUE "ProductVersion", VER_FILEVERSION_STR
- END
- END
-
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x0409L, 1200
- END
-END
+#include "Winver.h"
+
+// If VS_FF_PRERELEASE is not set, MO labels the build as a release and uses VER_FILEVERSION to determine version number.
+// Otherwise, if letters are used in VER_FILEVERSION_STR, uses the full MOBase::VersionInfo parser
+// Otherwise, uses the numbers from VER_FILEVERSION and sets the release type as pre-alpha
+#define VER_FILEVERSION 2,2,0
+#define VER_FILEVERSION_STR "2.2.0dev\0"
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION VER_FILEVERSION
+PRODUCTVERSION VER_FILEVERSION
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+FILEFLAGS VS_FF_PRERELEASE
+FILEOS VOS__WINDOWS32
+FILETYPE VFT_APP
+FILESUBTYPE (0)
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904B0"
+ BEGIN
+ VALUE "FileVersion", VER_FILEVERSION_STR
+ VALUE "CompanyName", "Mod Organizer 2 Team\0"
+ VALUE "FileDescription", "Mod Organizer 2 GUI\0"
+ VALUE "OriginalFilename", "ModOrganizer.exe\0"
+ VALUE "InternalName", "ModOrganizer2\0"
+ VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2018 Mod Organizer 2 contributors\0"
+ VALUE "ProductName", "Mod Organizer 2\0"
+ VALUE "ProductVersion", VER_FILEVERSION_STR
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409L, 1200
+ END
+END