summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Munro <brian.alexander.munro@gmail.com>2017-12-05 06:34:47 +0200
committerGitHub <noreply@github.com>2017-12-05 06:34:47 +0200
commitfa598e86dbce096b5439ae704dd18cc5b1289191 (patch)
tree66f9ecd51775c9e184b1679fc2d6fecc74fb1d8a
parentc64e12a289066c6b4834c43a49ff631a33b2f3ce (diff)
parentffdc5ca7ccb24bc937ed5418b7a6e5a1b7d719dd (diff)
Merge pull request #135 from LePresidente/QT5.7
All changes done for 2.1.0
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/CMakeLists.txt14
-rw-r--r--src/activatemodsdialog.ui4
-rw-r--r--src/browserdialog.cpp32
-rw-r--r--src/browserdialog.h2
-rw-r--r--src/browserview.cpp35
-rw-r--r--src/browserview.h8
-rw-r--r--src/categories.cpp83
-rw-r--r--src/descriptionpage.h28
-rw-r--r--src/dlls.manifest.qt531
-rw-r--r--src/editexecutablesdialog.ui6
-rw-r--r--src/installationmanager.cpp10
-rw-r--r--src/loadmechanism.cpp78
-rw-r--r--src/main.cpp4
-rw-r--r--src/mainwindow.cpp29
-rw-r--r--src/mainwindow.h3
-rw-r--r--src/mainwindow.ui9
-rw-r--r--src/modinfo.cpp6
-rw-r--r--src/modinfo.h17
-rw-r--r--src/modinfodialog.cpp20
-rw-r--r--src/modinfodialog.ui10
-rw-r--r--src/modinfoforeign.cpp6
-rw-r--r--src/modinfooverwrite.cpp8
-rw-r--r--src/modinforegular.cpp18
-rw-r--r--src/modlist.cpp42
-rw-r--r--src/modlist.h3
-rw-r--r--src/organizer_en.ts1156
-rw-r--r--src/organizer_en_US.ts14
-rw-r--r--src/organizercore.cpp205
-rw-r--r--src/pluginlist.cpp107
-rw-r--r--src/pluginlist.h10
-rw-r--r--src/pluginlistview.cpp58
-rw-r--r--src/pluginlistview.h24
-rw-r--r--src/resources.qrc1
-rw-r--r--src/resources/contents/config.pngbin0 -> 552 bytes
-rw-r--r--src/selfupdater.cpp6
-rw-r--r--src/settingsdialog.ui2
-rw-r--r--src/shared/appconfig.inc2
-rw-r--r--src/tutorials/Highlight.qml2
-rw-r--r--src/tutorials/Tooltip.qml2
-rw-r--r--src/tutorials/TooltipArea.qml4
-rw-r--r--src/tutorials/TutorialDescription.qml2
-rw-r--r--src/tutorials/TutorialOverlay.qml2
-rw-r--r--src/tutorials/tutorial_conflictresolution_main.js22
-rw-r--r--src/tutorials/tutorial_firststeps_settings.js2
-rw-r--r--src/tutorials/tutorial_primer_main.js65
-rw-r--r--src/tutorials/tutorials_installdialog.qml2
-rw-r--r--src/tutorials/tutorials_mainwindow.qml2
-rw-r--r--src/tutorials/tutorials_modinfodialog.qml2
-rw-r--r--src/tutorials/tutorials_nexusdialog.qml2
-rw-r--r--src/tutorials/tutorials_settingsdialog.qml2
-rw-r--r--src/version.rc4
52 files changed, 1333 insertions, 875 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cfad37a7..a4abd62d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,7 +5,7 @@ PROJECT(organizer)
SET(DEPENDENCIES_DIR CACHE PATH "")
# hint to find qt in dependencies path
-LIST(APPEND CMAKE_PREFIX_PATH ${DEPENDENCIES_DIR}/qt5/lib/cmake)
+LIST(APPEND CMAKE_PREFIX_PATH ${QT_ROOT}/lib/cmake)
FILE(GLOB_RECURSE BOOST_ROOT ${DEPENDENCIES_DIR}/boost*/project-config.jam)
GET_FILENAME_COMPONENT(BOOST_ROOT ${BOOST_ROOT} DIRECTORY)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 500dc56b..d603336c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -23,6 +23,7 @@ SET(organizer_SRCS
profile.cpp
pluginlistsortproxy.cpp
pluginlist.cpp
+ pluginlistview.cpp
overwriteinfodialog.cpp
nxmaccessmanager.cpp
nexusinterface.cpp
@@ -109,6 +110,7 @@ SET(organizer_HDRS
profile.h
pluginlistsortproxy.h
pluginlist.h
+ pluginlistview.h
overwriteinfodialog.h
nxmaccessmanager.h
nexusinterface.h
@@ -171,6 +173,7 @@ SET(organizer_HDRS
instancemanager.h
usvfsconnector.h
eventfilter.h
+ descriptionpage.h
shared/windows_error.h
shared/error_report.h
@@ -233,10 +236,11 @@ SET(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
FIND_PACKAGE(Qt5Widgets REQUIRED)
-FIND_PACKAGE(Qt5Declarative REQUIRED)
+FIND_PACKAGE(Qt5QuickWidgets REQUIRED)
+FIND_PACKAGE(Qt5Quick REQUIRED)
FIND_PACKAGE(Qt5Network REQUIRED)
FIND_PACKAGE(Qt5WinExtras REQUIRED)
-FIND_PACKAGE(Qt5WebKitWidgets REQUIRED)
+FIND_PACKAGE(Qt5WebEngineWidgets REQUIRED)
FIND_PACKAGE(Qt5LinguistTools)
QT5_WRAP_UI(organizer_UIHDRS ${organizer_UIS})
QT5_ADD_RESOURCES(organizer_RCCPPS ${organizer_QRCS})
@@ -299,7 +303,7 @@ ENDIF()
ADD_EXECUTABLE(ModOrganizer WIN32 ${organizer_HDRS} ${organizer_SRCS} ${organizer_UIHDRS} ${organizer_RCS} ${organizer_RCCPPS} ${organizer_translations_qm})
TARGET_LINK_LIBRARIES(ModOrganizer
- Qt5::Widgets Qt5::WinExtras Qt5::WebKitWidgets
+ Qt5::Widgets Qt5::WinExtras Qt5::WebEngineWidgets Qt5::Quick
${Boost_LIBRARIES}
zlibstatic
uibase esptk bsatk githubpp
@@ -313,7 +317,7 @@ SET_TARGET_PROPERTIES(ModOrganizer PROPERTIES LINK_FLAGS_RELWITHDEBINFO
"/LARGEADDRESSAWARE ${OPTIMIZE_LINK_FLAGS}")
-QT5_USE_MODULES(ModOrganizer Widgets Declarative Network WebKitWidgets)
+QT5_USE_MODULES(ModOrganizer Widgets Script Qml QuickWidgets Quick Network WebEngineWidgets)
###############
@@ -337,7 +341,7 @@ INSTALL(
CODE
"EXECUTE_PROCESS(
COMMAND
- ${qt5bin}/windeployqt.exe ModOrganizer.exe ${windeploy_parameters}
+ ${qt5bin}/windeployqt.exe ModOrganizer.exe --webenginewidgets ${windeploy_parameters}
COMMAND
${qt5bin}/windeployqt.exe uibase.dll ${windeploy_parameters}
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin
diff --git a/src/activatemodsdialog.ui b/src/activatemodsdialog.ui
index f6124bbc..cd8b0eec 100644
--- a/src/activatemodsdialog.ui
+++ b/src/activatemodsdialog.ui
@@ -17,14 +17,14 @@
<item>
<widget class="QTableWidget" name="modsTable">
<property name="toolTip">
- <string>This is a list of esps and esms that were active when the save game was created.</string>
+ <string>This is a list of esps, esms, and esls that were active when the save game was created.</string>
</property>
<property name="whatsThis">
<string>&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; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This is a list of esps and esms that were active when the save game was created.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This is a list of esps, esms, and esls that were active when the save game was created.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;For each esp, the right column contains the mod (or mods) that can be enabled to make the missing esps/esms available.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;If you hit Ok, all the mods selected in the right columns and all missing esps that have become available will be activated.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
diff --git a/src/browserdialog.cpp b/src/browserdialog.cpp
index e5f0f21d..c2c65acc 100644
--- a/src/browserdialog.cpp
+++ b/src/browserdialog.cpp
@@ -28,13 +28,13 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <utility.h>
#include "settings.h"
+#include <QWebEngineSettings>
#include <QNetworkCookieJar>
#include <QNetworkCookie>
#include <QMenu>
#include <QInputDialog>
-#include <QWebHistory>
+#include <QWebEngineHistory>
#include <QDir>
-#include <QWebFrame>
#include <QDesktopWidget>
#include <QKeyEvent>
@@ -77,8 +77,8 @@ void BrowserDialog::closeEvent(QCloseEvent *event)
void BrowserDialog::initTab(BrowserView *newView)
{
- newView->page()->setNetworkAccessManager(m_AccessManager);
- newView->page()->setForwardUnsupportedContent(true);
+ //newView->page()->setNetworkAccessManager(m_AccessManager);
+ //newView->page()->setForwardUnsupportedContent(true);
connect(newView, SIGNAL(loadProgress(int)), this, SLOT(progress(int)));
connect(newView, SIGNAL(titleChanged(QString)), this, SLOT(titleChanged(QString)));
@@ -86,14 +86,14 @@ void BrowserDialog::initTab(BrowserView *newView)
connect(newView, SIGNAL(startFind()), this, SLOT(startSearch()));
connect(newView, SIGNAL(urlChanged(QUrl)), this, SLOT(urlChanged(QUrl)));
connect(newView, SIGNAL(openUrlInNewTab(QUrl)), this, SLOT(openInNewTab(QUrl)));
- connect(newView->page(), SIGNAL(downloadRequested(QNetworkRequest)), this, SLOT(downloadRequested(QNetworkRequest)));
- connect(newView->page(), SIGNAL(unsupportedContent(QNetworkReply*)), this, SLOT(unsupportedContent(QNetworkReply*)));
+ connect(newView, SIGNAL(downloadRequested(QNetworkRequest)), this, SLOT(downloadRequested(QNetworkRequest)));
+ connect(newView, SIGNAL(unsupportedContent(QNetworkReply*)), this, SLOT(unsupportedContent(QNetworkReply*)));
ui->backBtn->setEnabled(false);
ui->fwdBtn->setEnabled(false);
m_Tabs->addTab(newView, tr("new"));
- newView->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
- newView->settings()->setAttribute(QWebSettings::AutoLoadImages, true);
+ newView->settings()->setAttribute(QWebEngineSettings::PluginsEnabled, true);
+ newView->settings()->setAttribute(QWebEngineSettings::AutoLoadImages, true);
}
@@ -133,10 +133,10 @@ void BrowserDialog::openUrl(const QUrl &url)
void BrowserDialog::maximizeWidth()
{
- int viewportWidth = getCurrentView()->page()->viewportSize().width();
+ int viewportWidth = getCurrentView()->page()->contentsSize ().width();
int frameWidth = width() - viewportWidth;
- int contentWidth = getCurrentView()->page()->mainFrame()->contentsSize().width();
+ int contentWidth = getCurrentView()->page()->contentsSize().width();
QDesktopWidget screen;
int currentScreen = screen.screenNumber(this);
@@ -190,7 +190,7 @@ QString BrowserDialog::guessFileName(const QString &url)
void BrowserDialog::unsupportedContent(QNetworkReply *reply)
{
try {
- QWebPage *page = qobject_cast<QWebPage*>(sender());
+ QWebEnginePage *page = qobject_cast<QWebEnginePage*>(sender());
if (page == nullptr) {
qCritical("sender not a page");
return;
@@ -252,10 +252,10 @@ void BrowserDialog::startSearch()
void BrowserDialog::on_searchEdit_returnPressed()
{
- BrowserView *currentView = getCurrentView();
- if (currentView != nullptr) {
- currentView->findText(ui->searchEdit->text(), QWebPage::FindWrapsAroundDocument);
- }
+// BrowserView *currentView = getCurrentView();
+// if (currentView != nullptr) {
+// currentView->findText(ui->searchEdit->text(), QWebEnginePage::FindWrapsAroundDocument);
+// }
}
void BrowserDialog::on_refreshBtn_clicked()
@@ -274,7 +274,7 @@ void BrowserDialog::on_browserTabWidget_currentChanged(int index)
void BrowserDialog::on_urlEdit_returnPressed()
{
- QWebView *currentView = getCurrentView();
+ QWebEngineView *currentView = getCurrentView();
if (currentView != nullptr) {
currentView->setUrl(QUrl(ui->urlEdit->text()));
}
diff --git a/src/browserdialog.h b/src/browserdialog.h
index 04567f5f..354a377b 100644
--- a/src/browserdialog.h
+++ b/src/browserdialog.h
@@ -24,7 +24,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QTimer>
-#include <QWebView>
+#include <QWebEngineView>
#include <QQueue>
#include <QTabWidget>
#include <QAtomicInt>
diff --git a/src/browserview.cpp b/src/browserview.cpp
index aeb16520..0b871e23 100644
--- a/src/browserview.cpp
+++ b/src/browserview.cpp
@@ -21,23 +21,23 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QEvent>
#include <QKeyEvent>
-#include <QWebFrame>
-#include <QWebElement>
#include <QNetworkDiskCache>
+#include <QWebEngineContextMenuData>
+#include <QWebEngineSettings>
#include <QMenu>
#include <Shlwapi.h>
#include "utility.h"
BrowserView::BrowserView(QWidget *parent)
- : QWebView(parent)
+ : QWebEngineView(parent)
{
installEventFilter(this);
- page()->settings()->setMaximumPagesInCache(10);
+ //page()->settings()->setMaximumPagesInCache(10);
}
-QWebView *BrowserView::createWindow(QWebPage::WebWindowType)
+QWebEngineView *BrowserView::createWindow(QWebEnginePage::WebWindowType)
{
BrowserView *newView = new BrowserView(parentWidget());
emit initTab(newView);
@@ -59,17 +59,18 @@ bool BrowserView::eventFilter(QObject *obj, QEvent *event)
mouseEvent->ignore();
return true;
}
- } else if (event->type() == QEvent::MouseButtonRelease) {
- QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
- if (mouseEvent->button() == Qt::MidButton) {
- QWebHitTestResult hitTest = page()->frameAt(mouseEvent->pos())->hitTestContent(mouseEvent->pos());
- if (hitTest.linkUrl().isValid()) {
- emit openUrlInNewTab(hitTest.linkUrl());
- }
- mouseEvent->ignore();
-
- return true;
- }
+// TODO This is due to that QTWebEnginePage doesn't support QWebFrame anymore
+// } else if (event->type() == QEvent::MouseButtonRelease) {
+// QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
+// if (mouseEvent->button() == Qt::MidButton) {
+// QWebEngineContextMenuData hitTest = page()->hitTestContent(mouseEvent->pos());
+// if (hitTest.linkUrl().isValid()) {
+// emit openUrlInNewTab(hitTest.linkUrl());
+// }
+// mouseEvent->ignore();
+//
+// return true;
+// }
}
- return QWebView::eventFilter(obj, event);
+ return QWebEngineView::eventFilter(obj, event);
}
diff --git a/src/browserview.h b/src/browserview.h
index 6a89752a..24be21c1 100644
--- a/src/browserview.h
+++ b/src/browserview.h
@@ -24,13 +24,13 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
class QEvent;
class QUrl;
class QWidget;
-#include <QWebView>
-#include <QWebPage>
+#include <QWebEngineView>
+#include <QWebEnginePage>
/**
* @brief web view used to display a nexus page
**/
-class BrowserView : public QWebView
+class BrowserView : public QWebEngineView
{
Q_OBJECT
@@ -66,7 +66,7 @@ signals:
protected:
- virtual QWebView *createWindow(QWebPage::WebWindowType type);
+ virtual QWebEngineView *createWindow(QWebEnginePage::WebWindowType type);
virtual bool eventFilter(QObject *obj, QEvent *event);
diff --git a/src/categories.cpp b/src/categories.cpp
index be6af9ae..d8cd49fb 100644
--- a/src/categories.cpp
+++ b/src/categories.cpp
@@ -205,42 +205,63 @@ void CategoryFactory::loadDefaultCategories()
{
// the order here is relevant as it defines the order in which the
// mods appear in the combo box
- addCategory(1, "Animations", MakeVector<int>(1, 51), 0);
- addCategory(2, "Armour", MakeVector<int>(1, 54), 0);
- addCategory(3, "Sound & Music", MakeVector<int>(1, 61), 0);
- addCategory(5, "Clothing", MakeVector<int>(1, 60), 0);
- addCategory(6, "Collectables", MakeVector<int>(1, 92), 0);
- addCategory(28, "Companions", MakeVector<int>(2, 66, 96), 0);
- addCategory(7, "Creatures & Mounts", MakeVector<int>(2, 83, 65), 0);
- addCategory(8, "Factions", MakeVector<int>(1, 25), 0);
- addCategory(9, "Gameplay", MakeVector<int>(1, 24), 0);
- addCategory(10, "Hair", MakeVector<int>(1, 26), 0);
+ addCategory(1, "Animations", MakeVector<int>(2, 4, 51), 0);
+ addCategory(52, "Poses", MakeVector<int>(1, 29), 1);
+ addCategory(2, "Armour", MakeVector<int>(2, 5, 54), 0);
+ addCategory(53, "Power Armor", MakeVector<int>(1, 53), 2);
+ addCategory(3, "Audio", MakeVector<int>(3, 33, 35, 106), 0);
+ addCategory(38, "Music", MakeVector<int>(2, 34, 61), 0);
+ addCategory(39, "Voice", MakeVector<int>(2, 36, 107), 0);
+ addCategory(5, "Clothing", MakeVector<int>(2, 9, 60), 0);
+ addCategory(41, "Jewelry", MakeVector<int>(1, 102), 5);
+ addCategory(42, "Backpacks", MakeVector<int>(1, 49), 5);
+ addCategory(6, "Collectables", MakeVector<int>(2, 10, 92), 0);
+ addCategory(28, "Companions", MakeVector<int>(3, 11, 66, 96), 0);
+ addCategory(7, "Creatures, Mounts, & Vehicles", MakeVector<int>(4, 12, 65, 83, 101), 0);
+ addCategory(8, "Factions", MakeVector<int>(2, 16, 25), 0);
+ addCategory(9, "Gameplay", MakeVector<int>(2, 15, 24), 0);
+ addCategory(27, "Combat", MakeVector<int>(1, 77), 9);
+ addCategory(43, "Crafting", MakeVector<int>(2, 50, 100), 9);
+ addCategory(48, "Overhauls", MakeVector<int>(2, 24, 79), 9);
+ addCategory(49, "Perks", MakeVector<int>(1, 27), 9);
+ addCategory(54, "Radio", MakeVector<int>(1, 31), 9);
+ addCategory(55, "Shouts", MakeVector<int>(1, 104), 9);
+ addCategory(22, "Skills & Levelling", MakeVector<int>(2, 46, 73), 9);
+ addCategory(58, "Weather & Lighting", MakeVector<int>(1, 56), 9);
+ addCategory(44, "Equipment", MakeVector<int>(1, 44), 43);
+ addCategory(45, "Home/Settlement", MakeVector<int>(1, 45), 43);
+ addCategory(10, "Body, Face, & Hair", MakeVector<int>(2, 17, 26), 0);
+ addCategory(39, "Tattoos", MakeVector<int>(1, 57), 10);
+ addCategory(40, "Character Presets", MakeVector<int>(1, 58), 0);
addCategory(11, "Items", MakeVector<int>(2, 27, 85), 0);
- addCategory(32, "Mercantile", MakeVector<int>(1, 69), 0);
- addCategory(19, "Weapons", MakeVector<int>(1, 55), 11);
- addCategory(36, "Weapon & Armour Sets", MakeVector<int>(1, 39), 11);
- addCategory(12, "Locations", MakeVector<int>(7, 22, 30, 70, 88, 89, 90, 91), 0);
- addCategory(31, "Landscape Changes", MakeVector<int>(1, 58), 0);
- addCategory(4, "Cities", MakeVector<int>(1, 53), 12);
- addCategory(29, "Environment", MakeVector<int>(1, 74), 0);
- addCategory(30, "Immersion", MakeVector<int>(1, 78), 0);
+ addCategory(32, "Mercantile", MakeVector<int>(2, 23, 69), 0);
+ addCategory(37, "Ammo", MakeVector<int>(1, 3), 11);
+ addCategory(19, "Weapons", MakeVector<int>(2, 41, 55), 11);
+ addCategory(36, "Weapon & Armour Sets", MakeVector<int>(1, 42), 11);
+ addCategory(23, "Player Homes", MakeVector<int>(2, 28, 67), 0);
addCategory(25, "Castles & Mansions", MakeVector<int>(1, 68), 23);
+ addCategory(51, "Settlements", MakeVector<int>(1, 48), 23);
+ addCategory(12, "Locations", MakeVector<int>(10, 20, 21, 22, 30, 47, 70, 88, 89, 90, 91), 0);
+ addCategory(4, "Cities", MakeVector<int>(1, 53), 12);
+ addCategory(31, "Landscape Changes", MakeVector<int>(1, 58), 0);
+ addCategory(29, "Environment", MakeVector<int>(2, 14, 74), 0);
+ addCategory(30, "Immersion", MakeVector<int>(2, 51, 78), 0);
addCategory(20, "Magic", MakeVector<int>(3, 75, 93, 94), 0);
- addCategory(21, "Models & Textures", MakeVector<int>(1, 29), 0);
- addCategory(33, "Modders resources", MakeVector<int>(1, 82), 0);
- addCategory(13, "NPCs", MakeVector<int>(1, 33), 0);
- addCategory(14, "Patches", MakeVector<int>(2, 79, 84), 0);
- addCategory(24, "Bugfixes", MakeVector<int>(1, 95), 0);
- addCategory(35, "Utilities", MakeVector<int>(1, 39), 0);
- addCategory(26, "Cheats", MakeVector<int>(1, 40), 0);
- addCategory(23, "Player Homes", MakeVector<int>(1, 67), 0);
- addCategory(15, "Quests", MakeVector<int>(1, 35), 0);
+ addCategory(21, "Models & Textures", MakeVector<int>(2, 19, 29), 0);
+ addCategory(33, "Modders resources", MakeVector<int>(2, 18, 82), 0);
+ addCategory(13, "NPCs", MakeVector<int>(3, 22, 33, 99), 0);
+ addCategory(24, "Bugfixes", MakeVector<int>(2, 6, 95), 0);
+ addCategory(14, "Patches", MakeVector<int>(2, 25, 84), 24);
+ addCategory(35, "Utilities", MakeVector<int>(2, 38, 39), 0);
+ addCategory(26, "Cheats", MakeVector<int>(1, 8), 0);
+ addCategory(15, "Quests", MakeVector<int>(2, 30, 35), 0);
addCategory(16, "Races & Classes", MakeVector<int>(1, 34), 0);
- addCategory(27, "Combat", MakeVector<int>(1, 77), 0);
- addCategory(22, "Skills", MakeVector<int>(1, 73), 0);
addCategory(34, "Stealth", MakeVector<int>(1, 76), 0);
- addCategory(17, "UI", MakeVector<int>(1, 42), 0);
- addCategory(18, "Visuals", MakeVector<int>(1, 62), 0);
+ addCategory(17, "UI", MakeVector<int>(2, 37, 42), 0);
+ addCategory(18, "Visuals", MakeVector<int>(2, 40, 62), 0);
+ addCategory(50, "Pip-Boy", MakeVector<int>(1, 52), 18);
+ addCategory(46, "Shader Presets", MakeVector<int>(3, 13, 97, 105), 0);
+ addCategory(47, "Miscellaneous", MakeVector<int>(2, 2, 28), 0);
}
diff --git a/src/descriptionpage.h b/src/descriptionpage.h
new file mode 100644
index 00000000..f6158ee0
--- /dev/null
+++ b/src/descriptionpage.h
@@ -0,0 +1,28 @@
+#include <QWebEnginePage>
+
+#ifndef DESCRIPTIONPAGE_H
+#define DESCRIPTIONPAGE_H
+
+class DescriptionPage : public QWebEnginePage
+{
+ Q_OBJECT
+
+public:
+ DescriptionPage(QObject* parent = 0) : QWebEnginePage(parent){}
+
+ bool acceptNavigationRequest(const QUrl & url, QWebEnginePage::NavigationType type, bool isMainFrame)
+ {
+ if (type == QWebEnginePage::NavigationTypeLinkClicked)
+ {
+ emit linkClicked(url);
+ return false;
+ }
+ return true;
+ }
+
+signals:
+ void linkClicked(const QUrl&);
+
+};
+
+#endif //DESCRIPTIONPAGE_H
diff --git a/src/dlls.manifest.qt5 b/src/dlls.manifest.qt5
index 80af4e5f..2a3cfeb0 100644
--- a/src/dlls.manifest.qt5
+++ b/src/dlls.manifest.qt5
@@ -1,31 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="dlls" version="1.0.0.0" processorArchitecture="x86"/>
- <file name="icuin54.dll"/>
- <file name="icuuc54.dll"/>
- <file name="icudt54.dll"/>
+ <file name="7z.dll"/>
+ <file name="archive.dll"/>
+ <file name="d3dcompiler_47.dll"/>
<file name="libeay32.dll"/>
- <file name="ssleay32.dll"/>
+ <file name="libEGL.dll"/>
+ <file name="libGLESV2.dll"/>
+ <file name="liblz4.dll"/>
+ <file name="opengl32sw.dll"/>
<file name="Qt5Core.dll"/>
- <file name="Qt5Declarative.dll"/>
<file name="Qt5Gui.dll"/>
- <file name="Qt5Multimedia.dll"/>
- <file name="Qt5MultimediaWidgets.dll"/>
<file name="Qt5Network.dll"/>
- <file name="Qt5OpenGL.dll"/>
<file name="Qt5Positioning.dll"/>
<file name="Qt5PrintSupport.dll"/>
<file name="Qt5Qml.dll"/>
<file name="Qt5Quick.dll"/>
- <file name="Qt5Sensors.dll"/>
- <file name="Qt5Script.dll"/>
- <file name="Qt5Sql.dll"/>
+ <file name="Qt5QuickWidgets.dll"/>
+ <file name="Qt5WebChannel.dll"/>
+ <file name="Qt5SerialPort.dll"/>
<file name="Qt5Svg.dll"/>
- <file name="Qt5WebChannel.dll"/>
- <file name="Qt5WebKit.dll"/>
- <file name="Qt5WebKitWidgets.dll"/>
+ <file name="Qt5WebEngineCore.dll"/>
+ <file name="Qt5WebEngineWidgets.dll"/>
<file name="Qt5Widgets.dll"/>
- <file name="Qt5WinExtras.dll"/>
- <file name="Qt5Xml.dll"/>
- <file name="Qt5XmlPatterns.dll"/>
+ <file name="Qt5WinExtras.dll"/>
+ <file name="ssleay32.dll"/>
</assembly> \ No newline at end of file
diff --git a/src/editexecutablesdialog.ui b/src/editexecutablesdialog.ui
index b3543c95..bdbb8bd1 100644
--- a/src/editexecutablesdialog.ui
+++ b/src/editexecutablesdialog.ui
@@ -10,6 +10,12 @@
<height>460</height>
</rect>
</property>
+ <property name="minimumSize">
+ <size>
+ <width>200</width>
+ <height>200</height>
+ </size>
+ </property>
<property name="windowTitle">
<string>Modify Executables</string>
</property>
diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp
index 9be4cdd9..9a70f8bd 100644
--- a/src/installationmanager.cpp
+++ b/src/installationmanager.cpp
@@ -187,6 +187,7 @@ bool InstallationManager::unpackSingleFile(const QString &fileName)
m_InstallationProgress->setWindowTitle(tr("Extracting files"));
m_InstallationProgress->setWindowModality(Qt::WindowModal);
+ m_InstallationProgress->setFixedSize(600, 100);
m_InstallationProgress->show();
bool res = m_ArchiveHandler->extract(QDir::tempPath(),
@@ -274,6 +275,7 @@ QStringList InstallationManager::extractFiles(const QStringList &filesOrig, bool
m_InstallationProgress->windowFlags() & (~Qt::WindowContextHelpButtonHint));
m_InstallationProgress->setWindowTitle(tr("Extracting files"));
m_InstallationProgress->setWindowModality(Qt::WindowModal);
+ m_InstallationProgress->setFixedSize(600, 100);
m_InstallationProgress->show();
// unpack only the files we need for the installer
@@ -419,9 +421,10 @@ void InstallationManager::updateProgress(float percentage)
void InstallationManager::updateProgressFile(QString const &fileName)
{
- if (m_InstallationProgress != nullptr) {
- m_InstallationProgress->setLabelText(fileName);
- }
+ if (m_InstallationProgress != nullptr) {
+ m_InstallationProgress->setLabelText(fileName);
+ QCoreApplication::processEvents();
+ }
}
@@ -563,6 +566,7 @@ bool InstallationManager::doInstall(GuessedValue<QString> &modName, int modID,
m_InstallationProgress->setWindowFlags(
m_InstallationProgress->windowFlags() & (~Qt::WindowContextHelpButtonHint));
m_InstallationProgress->setWindowModality(Qt::WindowModal);
+ m_InstallationProgress->setFixedSize(600, 100);
m_InstallationProgress->show();
if (!m_ArchiveHandler->extract(targetDirectory,
new MethodCallback<InstallationManager, void, float>(this, &InstallationManager::updateProgress),
diff --git a/src/loadmechanism.cpp b/src/loadmechanism.cpp
index e476c56d..7ad36ac7 100644
--- a/src/loadmechanism.cpp
+++ b/src/loadmechanism.cpp
@@ -129,21 +129,29 @@ void LoadMechanism::deactivateScriptExtender()
throw MyException(QObject::tr("game doesn't support a script extender"));
}
- QDir pluginsDir(game->gameDirectory().absolutePath() + "/data/" + extender->name() + "/plugins");
+ QDir pluginsDir(game->gameDirectory().absolutePath() + "/data/" + extender->PluginPath());
#pragma message("implement this for usvfs")
- /*
- QString hookDLLName = ToQString(AppConfig::hookDLLName());
- if (QFile(pluginsDir.absoluteFilePath(hookDLLName)).exists()) {
- // remove dll from SE plugins directory
- if (!pluginsDir.remove(hookDLLName)) {
- throw MyException(QObject::tr("Failed to delete %1").arg(pluginsDir.absoluteFilePath(hookDLLName)));
- }
- }
+ QString vfsDLLName = "";
+ if (extender->getArch() == IMAGE_FILE_MACHINE_I386) {
+ vfsDLLName = ToQString(AppConfig::vfs32DLLName());
+ }
+ else if (extender->getArch() == IMAGE_FILE_MACHINE_AMD64)
+ {
+ vfsDLLName = ToQString(AppConfig::vfs64DLLName());
+ }
+ qDebug("USVFS DLL Name: " + vfsDLLName.toLatin1());
+ if (vfsDLLName != "") {
+ if (QFile(pluginsDir.absoluteFilePath(vfsDLLName)).exists()) {
+ // remove dll from SE plugins directory
+ if (!pluginsDir.remove(vfsDLLName)) {
+ throw MyException(QObject::tr("Failed to delete %1").arg(pluginsDir.absoluteFilePath(vfsDLLName)));
+ }
+ }
+ }
removeHintFile(pluginsDir);
- */
} catch (const std::exception &e) {
QMessageBox::critical(nullptr, QObject::tr("Failed to deactivate script extender loading"), e.what());
}
@@ -188,34 +196,45 @@ void LoadMechanism::activateScriptExtender()
throw MyException(QObject::tr("game doesn't support a script extender"));
}
- QDir pluginsDir(game->gameDirectory().absolutePath() + "/data/" + extender->name() + "/plugins");
+ QDir pluginsDir(game->gameDirectory().absolutePath() + "/data/" + extender->PluginPath());
if (!pluginsDir.exists()) {
pluginsDir.mkpath(".");
}
#pragma message("implement this for usvfs")
-/*
- QString targetPath = pluginsDir.absoluteFilePath(ToQString(AppConfig::hookDLLName()));
- QString hookDLLPath = qApp->applicationDirPath() + "/" + QString::fromStdWString(AppConfig::hookDLLName());
+ std::wstring vfsDLL = L"";
+ if (extender->getArch() == IMAGE_FILE_MACHINE_I386) {
+ vfsDLL = AppConfig::vfs32DLLName();
+ }
+ else if (extender->getArch() == IMAGE_FILE_MACHINE_AMD64)
+ {
+ vfsDLL = AppConfig::vfs64DLLName();
+ }
+ if (vfsDLL != L"") {
+ QString targetPath = pluginsDir.absoluteFilePath(ToQString(vfsDLL));
+ QString vfsDLLPath = qApp->applicationDirPath() + "/" + QString::fromStdWString(vfsDLL);
- QFile dllFile(targetPath);
+ qDebug("DLL USVFS Target Path: " + targetPath.toLatin1());
+ qDebug("DLL USVFS VFS DLL Path: " + vfsDLLPath.toLatin1());
- if (dllFile.exists()) {
- // may be outdated
- if (!hashIdentical(targetPath, hookDLLPath)) {
- dllFile.remove();
- }
- }
+ QFile dllFile(targetPath);
- if (!dllFile.exists()) {
- // install dll to SE plugins
- if (!QFile::copy(hookDLLPath, targetPath)) {
- throw MyException(QObject::tr("Failed to copy %1 to %2").arg(hookDLLPath, targetPath));
- }
- }
+ if (dllFile.exists()) {
+ // may be outdated
+ if (!hashIdentical(targetPath, vfsDLLPath)) {
+ dllFile.remove();
+ }
+ }
+
+ if (!dllFile.exists()) {
+ // install dll to SE plugins
+ if (!QFile::copy(vfsDLLPath, targetPath)) {
+ throw MyException(QObject::tr("Failed to copy %1 to %2").arg(vfsDLLPath, targetPath));
+ }
+ }
+ }
writeHintFile(pluginsDir);
-*/
} catch (const std::exception &e) {
QMessageBox::critical(nullptr, QObject::tr("Failed to set up script extender loading"), e.what());
}
@@ -278,14 +297,17 @@ void LoadMechanism::activate(EMechanism mechanism)
{
switch (mechanism) {
case LOAD_MODORGANIZER: {
+ qDebug("Load Mechanism: Mod Organizer");
deactivateProxyDLL();
deactivateScriptExtender();
} break;
case LOAD_SCRIPTEXTENDER: {
+ qDebug("Load Mechanism: ScriptExtender");
deactivateProxyDLL();
activateScriptExtender();
} break;
case LOAD_PROXYDLL: {
+ qDebug("Load Mechanism: Proxy DLL");
deactivateScriptExtender();
activateProxyDLL();
} break;
diff --git a/src/main.cpp b/src/main.cpp
index d14641a4..526563a2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -318,6 +318,9 @@ MOBase::IPluginGame *determineCurrentGame(QString const &moPath, QSettings &sett
}
}
+ //The following code would try to determine the right game to mange but it would usually find the wrong one
+ //so it was commented out.
+ /*
//OK, we are in a new setup or existing info is useless.
//See if MO has been installed inside a game directory
for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
@@ -341,6 +344,7 @@ MOBase::IPluginGame *determineCurrentGame(QString const &moPath, QSettings &sett
//OK, chop off the last directory and try again
} while (gameDir.cdUp());
}
+ */
//Then try a selection dialogue.
if (!gamePath.isEmpty() || !gameName.isEmpty()) {
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 7c853578..cdc32918 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -145,6 +145,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QVariantList>
#include <QWhatsThis>
#include <QWidgetAction>
+#include <QWebEngineProfile>
#include <QDebug>
#include <QtGlobal>
@@ -199,6 +200,10 @@ MainWindow::MainWindow(QSettings &initSettings
, m_PluginContainer(pluginContainer)
, m_DidUpdateMasterList(false)
{
+ QWebEngineProfile::defaultProfile()->setPersistentCookiesPolicy(QWebEngineProfile::NoPersistentCookies);
+ QWebEngineProfile::defaultProfile()->setHttpCacheMaximumSize(52428800);
+ QWebEngineProfile::defaultProfile()->setCachePath(m_OrganizerCore.settings().getCacheDirectory());
+ QWebEngineProfile::defaultProfile()->setPersistentStoragePath(m_OrganizerCore.settings().getCacheDirectory());
ui->setupUi(this);
updateWindowTitle(QString(), false);
@@ -352,6 +357,9 @@ MainWindow::MainWindow(QSettings &initSettings
connect(this, SIGNAL(styleChanged(QString)), this, SLOT(updateStyle(QString)));
+ connect(ui->espList->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(esplistSelectionsChanged(QItemSelection)));
+ connect(ui->modList->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(modlistSelectionsChanged(QItemSelection)));
+
m_UpdateProblemsTimer.setSingleShot(true);
connect(&m_UpdateProblemsTimer, SIGNAL(timeout()), this, SLOT(updateProblemsButton()));
@@ -840,6 +848,7 @@ void MainWindow::showEvent(QShowEvent *event)
m_OrganizerCore.settings().registerAsNXMHandler(false);
m_WasVisible = true;
+ updateProblemsButton();
}
}
@@ -867,6 +876,7 @@ void MainWindow::cleanup()
ui->logList->setModel(nullptr);
}
+ QWebEngineProfile::defaultProfile()->clearAllVisitedLinks();
m_IntegratedBrowser.close();
}
@@ -1684,7 +1694,7 @@ void MainWindow::wikiTriggered()
void MainWindow::issueTriggered()
{
- ::ShellExecuteW(nullptr, L"open", L"http://issue.tannin.eu/tbg", nullptr, nullptr, SW_SHOWNORMAL);
+ ::ShellExecuteW(nullptr, L"open", L"http://github.com/LePresidente/modorganizer/issues", nullptr, nullptr, SW_SHOWNORMAL);
}
void MainWindow::tutorialTriggered()
@@ -1943,9 +1953,10 @@ void MainWindow::fileMoved(const QString &filePath, const QString &oldOriginName
QString fullNewPath = ToQString(newOrigin.getPath()) + "\\" + filePath;
WIN32_FIND_DATAW findData;
- ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData);
-
+ HANDLE hFind;
+ hFind = ::FindFirstFileW(ToWString(fullNewPath).c_str(), &findData);
filePtr->addOrigin(newOrigin.getID(), findData.ftCreationTime, L"");
+ FindClose(hFind);
}
if (m_OrganizerCore.directoryStructure()->originExists(ToWString(oldOriginName))) {
FilesOrigin &oldOrigin = m_OrganizerCore.directoryStructure()->getOriginByName(ToWString(oldOriginName));
@@ -2113,6 +2124,18 @@ void MainWindow::modlistSelectionChanged(const QModelIndex &current, const QMode
ui->modList->verticalScrollBar()->repaint();
}
+void MainWindow::modlistSelectionsChanged(const QItemSelection &selected)
+{
+ m_OrganizerCore.pluginList()->highlightPlugins(selected, *m_OrganizerCore.directoryStructure(), *m_OrganizerCore.currentProfile());
+ ui->espList->verticalScrollBar()->repaint();
+}
+
+void MainWindow::esplistSelectionsChanged(const QItemSelection &selected)
+{
+ m_OrganizerCore.modList()->highlightMods(selected, *m_OrganizerCore.directoryStructure());
+ ui->modList->verticalScrollBar()->repaint();
+}
+
void MainWindow::modListSortIndicatorChanged(int, Qt::SortOrder)
{
ui->modList->verticalScrollBar()->repaint();
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 06c51203..cec6c407 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -520,6 +520,9 @@ private slots:
void modlistSelectionChanged(const QModelIndex &current, const QModelIndex &previous);
void modListSortIndicatorChanged(int column, Qt::SortOrder order);
+ void modlistSelectionsChanged(const QItemSelection &current);
+ void esplistSelectionsChanged(const QItemSelection &current);
+
private slots: // ui slots
// actions
void on_actionAdd_Profile_triggered();
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 4b5467ed..26b9e375 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -791,7 +791,7 @@ p, li { white-space: pre-wrap; }
</layout>
</item>
<item>
- <widget class="QTreeView" name="espList">
+ <widget class="PluginListView" name="espList">
<property name="minimumSize">
<size>
<width>250</width>
@@ -846,7 +846,7 @@ p, li { white-space: pre-wrap; }
&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; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This list contains the esps and esms contained in the active mods. These require their own load order. Use drag&amp;amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.&lt;br /&gt;There is a great tool named &amp;quot;BOSS&amp;quot; to automatically sort these files.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This list contains the esps, esms, and esls contained in the active mods. These require their own load order. Use drag&amp;amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.&lt;br /&gt;There is a great tool named &amp;quot;BOSS&amp;quot; to automatically sort these files.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="dragEnabled">
<bool>true</bool>
@@ -1412,6 +1412,11 @@ Right now this has very limited functionality</string>
<extends>QTreeView</extends>
<header>modlistview.h</header>
</customwidget>
+ <customwidget>
+ <class>PluginListView</class>
+ <extends>QTreeView</extends>
+ <header>pluginlistview.h</header>
+ </customwidget>
</customwidgets>
<resources>
<include location="resources.qrc"/>
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index 7cb4b4ba..77df6216 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -99,6 +99,7 @@ QString ModInfo::getContentTypeName(int contentType)
case CONTENT_SCRIPT: return tr("Scripts");
case CONTENT_SKSE: return tr("SKSE Plugins");
case CONTENT_SKYPROC: return tr("SkyProc Tools");
+ case CONTENT_MCM: return tr("MCM Data");
default: throw MyException(tr("invalid content type %1").arg(contentType));
}
}
@@ -300,6 +301,11 @@ void ModInfo::setVersion(const VersionInfo &version)
m_Version = version;
}
+void ModInfo::setPluginSelected(const bool &isSelected)
+{
+ m_PluginSelected = isSelected;
+}
+
void ModInfo::addCategory(const QString &categoryName)
{
int id = CategoryFactory::instance().getCategoryID(categoryName);
diff --git a/src/modinfo.h b/src/modinfo.h
index 501588ec..c62df549 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -67,7 +67,8 @@ public:
FLAG_CONFLICT_OVERWRITE,
FLAG_CONFLICT_OVERWRITTEN,
FLAG_CONFLICT_MIXED,
- FLAG_CONFLICT_REDUNDANT
+ FLAG_CONFLICT_REDUNDANT,
+ FLAG_PLUGIN_SELECTED
};
enum EContent {
@@ -79,7 +80,8 @@ public:
CONTENT_SOUND,
CONTENT_SCRIPT,
CONTENT_SKSE,
- CONTENT_SKYPROC
+ CONTENT_SKYPROC,
+ CONTENT_MCM
};
static const int NUM_CONTENT_TYPES = CONTENT_SKYPROC + 1;
@@ -88,7 +90,8 @@ public:
HIGHLIGHT_NONE = 0,
HIGHLIGHT_INVALID = 1,
HIGHLIGHT_CENTER = 2,
- HIGHLIGHT_IMPORTANT = 4
+ HIGHLIGHT_IMPORTANT = 4,
+ HIGHLIGHT_PLUGIN = 8
};
enum EEndorsedState {
@@ -268,6 +271,12 @@ public:
virtual void setVersion(const MOBase::VersionInfo &version);
/**
+ * @brief Controls if mod should be highlighted based on plugin selection
+ * @param isSelected whether or not the plugin has a selected mod
+ **/
+ virtual void setPluginSelected(const bool &isSelected);
+
+ /**
* @brief set the newest version of this mod on the nexus
*
* this can be used to overwrite the version of a mod without actually
@@ -598,6 +607,8 @@ protected:
MOBase::VersionInfo m_Version;
+ bool m_PluginSelected = false;
+
private:
static QMutex s_Mutex;
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index e1a2183c..c586c6b6 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -19,6 +19,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "modinfodialog.h"
#include "ui_modinfodialog.h"
+#include "descriptionpage.h"
#include "iplugingame.h"
#include "nexusinterface.h"
@@ -38,6 +39,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QMenu>
#include <QFileSystemModel>
#include <QInputDialog>
+#include <QPointer>
#include <Shlwapi.h>
@@ -85,11 +87,14 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
ui->notesEdit->setText(modInfo->notes());
+ ui->descriptionView->setPage(new DescriptionPage);
+
connect(&m_ThumbnailMapper, SIGNAL(mapped(const QString&)), this, SIGNAL(thumbnailClickedSignal(const QString&)));
connect(this, SIGNAL(thumbnailClickedSignal(const QString&)), this, SLOT(thumbnailClicked(const QString&)));
connect(m_ModInfo.data(), SIGNAL(modDetailsUpdated(bool)), this, SLOT(modDetailsUpdated(bool)));
- connect(ui->descriptionView, SIGNAL(linkClicked(QUrl)), this, SLOT(linkClicked(QUrl)));
- ui->descriptionView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+ connect(ui->descriptionView->page(), SIGNAL(linkClicked(QUrl)), this, SLOT(linkClicked(QUrl)));
+ //TODO: No easy way to delegate links
+ //ui->descriptionView->page()->acceptNavigationRequest(QWebEnginePage::DelegateAllLinks);
if (directory->originExists(ToWString(modInfo->name()))) {
m_Origin = &directory->getOriginByName(ToWString(modInfo->name()));
@@ -313,7 +318,8 @@ void ModInfoDialog::refreshLists()
ui->iniFileList->addItem(namePart);
}
} else if (fileName.endsWith(".esp", Qt::CaseInsensitive) ||
- fileName.endsWith(".esm", Qt::CaseInsensitive)) {
+ fileName.endsWith(".esm", Qt::CaseInsensitive) ||
+ fileName.endsWith(".esl", Qt::CaseInsensitive)) {
QString relativePath = fileName.mid(m_RootPath.length() + 1);
if (relativePath.contains('/')) {
QFileInfo fileInfo(fileName);
@@ -824,11 +830,13 @@ void ModInfoDialog::modDetailsUpdated(bool success)
"<body>%1</body>"
"</html>").arg(BBCode::convertToHTML(nexusDescription));
+ ui->descriptionView->page()->setHtml(descriptionAsHTML);
+
// QString descriptionAsHTML = BBCode::convertToHTML(result["description"].toString());
- ui->descriptionView->setHtml(descriptionAsHTML);
+ // ui->descriptionView->setHtml(descriptionAsHTML);
} else {
// ui->descriptionView->setHtml(result["summary"].toString().append(QString("\r\n") + tr("(description incomplete, please visit nexus)")));
- ui->descriptionView->setHtml(tr("(description incomplete, please visit nexus)"));
+ ui->descriptionView->page()->setHtml(tr("(description incomplete, please visit nexus)"));
}
updateVersionColor();
@@ -874,7 +882,7 @@ void ModInfoDialog::on_modIDEdit_editingFinished()
if (oldID != modID){
m_ModInfo->setNexusID(modID);
- ui->descriptionView->setHtml("");
+ ui->descriptionView->page()->setHtml("");
if (modID != 0) {
m_RequestStarted = false;
refreshNexusData(modID);
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index a03edef7..25822fd0 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -279,10 +279,10 @@
<item row="1" column="1">
<widget class="QListWidget" name="inactiveESPList">
<property name="toolTip">
- <string>List of esps and esms that can not be loaded by the game.</string>
+ <string>List of esps, esms, and esls that can not be loaded by the game.</string>
</property>
<property name="whatsThis">
- <string>List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.
+ <string>List of esps, esms, and esls contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.
They usually contain optional functionality, see the readme.
Most mods do not have optional esps, so chances are good you are looking at an empty list.</string>
@@ -678,7 +678,7 @@ p, li { white-space: pre-wrap; }
</layout>
</item>
<item>
- <widget class="QWebView" name="descriptionView">
+ <widget class="QWebEngineView" name="descriptionView">
<property name="url">
<url>
<string>about:blank</string>
@@ -807,9 +807,9 @@ p, li { white-space: pre-wrap; }
</widget>
<customwidgets>
<customwidget>
- <class>QWebView</class>
+ <class>QQuickWidget</class>
<extends>QWidget</extends>
- <header>QtWebKitWidgets/QWebView</header>
+ <header>QtQuickWidgets/QQuickWidget</header>
</customwidget>
</customwidgets>
<resources>
diff --git a/src/modinfoforeign.cpp b/src/modinfoforeign.cpp
index 4ba16bb1..6ad8b6d8 100644
--- a/src/modinfoforeign.cpp
+++ b/src/modinfoforeign.cpp
@@ -30,12 +30,16 @@ std::vector<ModInfo::EFlag> ModInfoForeign::getFlags() const
std::vector<ModInfo::EFlag> result = ModInfoWithConflictInfo::getFlags();
result.push_back(FLAG_FOREIGN);
+ if (m_PluginSelected) {
+ result.push_back(ModInfo::FLAG_PLUGIN_SELECTED);
+ }
+
return result;
}
int ModInfoForeign::getHighlight() const
{
- return 0;
+ return m_PluginSelected ? ModInfo::HIGHLIGHT_PLUGIN : ModInfo::HIGHLIGHT_NONE;
}
QString ModInfoForeign::getDescription() const
diff --git a/src/modinfooverwrite.cpp b/src/modinfooverwrite.cpp
index 0104998a..6b8c9bd9 100644
--- a/src/modinfooverwrite.cpp
+++ b/src/modinfooverwrite.cpp
@@ -29,12 +29,18 @@ std::vector<ModInfo::EFlag> ModInfoOverwrite::getFlags() const
{
std::vector<ModInfo::EFlag> result;
result.push_back(FLAG_OVERWRITE);
+ if (m_PluginSelected)
+ result.push_back(FLAG_PLUGIN_SELECTED);
return result;
}
int ModInfoOverwrite::getHighlight() const
{
- return (isValid() ? HIGHLIGHT_IMPORTANT : HIGHLIGHT_INVALID) | HIGHLIGHT_CENTER;
+ int highlight = (isValid() ? HIGHLIGHT_IMPORTANT : HIGHLIGHT_INVALID) | HIGHLIGHT_CENTER;
+ auto flags = getFlags();
+ if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_PLUGIN_SELECTED) != flags.end())
+ highlight |= HIGHLIGHT_PLUGIN;
+ return highlight;
}
QString ModInfoOverwrite::getDescription() const
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp
index 231e5497..9d94002b 100644
--- a/src/modinforegular.cpp
+++ b/src/modinforegular.cpp
@@ -420,6 +420,9 @@ std::vector<ModInfo::EFlag> ModInfoRegular::getFlags() const
if (m_Notes.length() != 0) {
result.push_back(ModInfo::FLAG_NOTES);
}
+ if (m_PluginSelected) {
+ result.push_back(ModInfo::FLAG_PLUGIN_SELECTED);
+ }
return result;
}
@@ -430,7 +433,7 @@ std::vector<ModInfo::EContent> ModInfoRegular::getContents() const
if (m_LastContentCheck.isNull() || (m_LastContentCheck.secsTo(now) > 60)) {
m_CachedContent.clear();
QDir dir(absolutePath());
- if (dir.entryList(QStringList() << "*.esp" << "*.esm").size() > 0) {
+ if (dir.entryList(QStringList() << "*.esp" << "*.esm" << "*.esl").size() > 0) {
m_CachedContent.push_back(CONTENT_PLUGIN);
}
if (dir.entryList(QStringList() << "*.bsa" << "*.ba2").size() > 0) {
@@ -442,7 +445,7 @@ std::vector<ModInfo::EContent> ModInfoRegular::getContents() const
->feature<ScriptExtender>();
if (extender != nullptr) {
- QString sePluginPath = extender->name() + "/plugins";
+ QString sePluginPath = extender->PluginPath();
if (dir.exists(sePluginPath))
m_CachedContent.push_back(CONTENT_SKSE);
}
@@ -458,6 +461,8 @@ std::vector<ModInfo::EContent> ModInfoRegular::getContents() const
m_CachedContent.push_back(CONTENT_SCRIPT);
if (dir.exists("SkyProc Patchers"))
m_CachedContent.push_back(CONTENT_SKYPROC);
+ if (dir.exists("MCM"))
+ m_CachedContent.push_back(CONTENT_MCM);
m_LastContentCheck = QTime::currentTime();
}
@@ -469,14 +474,19 @@ std::vector<ModInfo::EContent> ModInfoRegular::getContents() const
int ModInfoRegular::getHighlight() const
{
- return isValid() ? HIGHLIGHT_NONE: HIGHLIGHT_INVALID;
+ if (!isValid())
+ return HIGHLIGHT_INVALID;
+ auto flags = getFlags();
+ if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_PLUGIN_SELECTED) != flags.end())
+ return HIGHLIGHT_PLUGIN;
+ return HIGHLIGHT_NONE;
}
QString ModInfoRegular::getDescription() const
{
if (!isValid()) {
- return tr("%1 contains no esp/esm and no asset (textures, meshes, interface, ...) directory").arg(name());
+ return tr("%1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory").arg(name());
} else {
const std::set<int> &categories = getCategories();
std::wostringstream categoryString;
diff --git a/src/modlist.cpp b/src/modlist.cpp
index fca98aac..c6341251 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -60,7 +60,7 @@ ModList::ModList(QObject *parent)
, m_FontMetrics(QFont())
, m_DropOnItems(false)
{
- m_ContentIcons[ModInfo::CONTENT_PLUGIN] = std::make_tuple(":/MO/gui/content/plugin", tr("Game plugins (esp/esm)"));
+ m_ContentIcons[ModInfo::CONTENT_PLUGIN] = std::make_tuple(":/MO/gui/content/plugin", tr("Game Plugins (ESP/ESM/ESL)"));
m_ContentIcons[ModInfo::CONTENT_INTERFACE] = std::make_tuple(":/MO/gui/content/interface", tr("Interface"));
m_ContentIcons[ModInfo::CONTENT_MESH] = std::make_tuple(":/MO/gui/content/mesh", tr("Meshes"));
m_ContentIcons[ModInfo::CONTENT_BSA] = std::make_tuple(":/MO/gui/content/bsa", tr("BSA"));
@@ -69,6 +69,7 @@ ModList::ModList(QObject *parent)
m_ContentIcons[ModInfo::CONTENT_SKYPROC] = std::make_tuple(":/MO/gui/content/skyproc", tr("SkyProc Patcher"));
m_ContentIcons[ModInfo::CONTENT_SOUND] = std::make_tuple(":/MO/gui/content/sound", tr("Sound or Music"));
m_ContentIcons[ModInfo::CONTENT_TEXTURE] = std::make_tuple(":/MO/gui/content/texture", tr("Textures"));
+ m_ContentIcons[ModInfo::CONTENT_MCM] = std::make_tuple(":/MO/gui/content/menu", tr("MCM Configuration"));
m_LastCheck.start();
}
@@ -337,6 +338,7 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
int highlight = modInfo->getHighlight();
if (highlight & ModInfo::HIGHLIGHT_IMPORTANT) return QBrush(Qt::darkRed);
else if (highlight & ModInfo::HIGHLIGHT_INVALID) return QBrush(Qt::darkGray);
+ else if (highlight & ModInfo::HIGHLIGHT_PLUGIN) return QBrush(Qt::darkBlue);
} else if (column == COL_VERSION) {
if (!modInfo->getNewestVersion().isValid()) {
return QVariant();
@@ -349,7 +351,9 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
return QVariant();
} else if ((role == Qt::BackgroundRole)
|| (role == ViewMarkingScrollBar::DEFAULT_ROLE)) {
- if (m_Overwrite.find(modIndex) != m_Overwrite.end()) {
+ if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_PLUGIN) {
+ return QColor(0, 0, 255, 32);
+ } else if (m_Overwrite.find(modIndex) != m_Overwrite.end()) {
return QColor(0, 255, 0, 32);
} else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) {
return QColor(255, 0, 0, 32);
@@ -684,6 +688,38 @@ int ModList::timeElapsedSinceLastChecked() const
return m_LastCheck.elapsed();
}
+void ModList::highlightMods(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry)
+{
+ for (unsigned int i = 0; i < ModInfo::getNumMods(); ++i) {
+ ModInfo::getByIndex(i)->setPluginSelected(false);
+ }
+ for (QModelIndex idx : selected.indexes()) {
+ QString modName = idx.data().toString();
+
+ const MOShared::FileEntry::Ptr fileEntry = directoryEntry.findFile(modName.toStdWString());
+ if (fileEntry.get() != nullptr) {
+ QString fileName;
+ bool archive = false;
+ std::vector<int> origins;
+ {
+ std::vector<int> alternatives = fileEntry->getAlternatives();
+ origins.push_back(fileEntry->getOrigin(archive));
+ origins.insert(origins.end(), alternatives.begin(), alternatives.end());
+ }
+ for (int originId : origins) {
+ MOShared::FilesOrigin &origin = directoryEntry.getOriginByID(originId);
+ for (unsigned int i = 0; i < ModInfo::getNumMods(); ++i) {
+ if (ModInfo::getByIndex(i)->internalName() == QString::fromStdWString(origin.getName())) {
+ ModInfo::getByIndex(i)->setPluginSelected(true);
+ break;
+ }
+ }
+ }
+ }
+ }
+ notifyChange(0, rowCount() - 1);
+}
+
IModList::ModStates ModList::state(unsigned int modIndex) const
{
IModList::ModStates result;
@@ -1026,7 +1062,7 @@ QString ModList::getColumnToolTip(int column)
case COL_FLAGS: return tr("Emblemes to highlight things that might require attention.");
case COL_CONTENT: return tr("Depicts the content of the mod:<br>"
"<table cellspacing=7>"
- "<tr><td><img src=\":/MO/gui/content/plugin\" width=32/></td><td>Game plugins (esp/esm)</tr>"
+ "<tr><td><img src=\":/MO/gui/content/plugin\" width=32/></td><td>Game plugins (esp/esm/esl)</tr>"
"<tr><td><img src=\":/MO/gui/content/interface\" width=32/></td><td>Interface</tr>"
"<tr><td><img src=\":/MO/gui/content/mesh\" width=32/></td><td>Meshes</tr>"
"<tr><td><img src=\":/MO/gui/content/bsa\" width=32/></td><td>BSA</tr>"
diff --git a/src/modlist.h b/src/modlist.h
index 358fd583..bd715107 100644
--- a/src/modlist.h
+++ b/src/modlist.h
@@ -27,6 +27,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "profile.h"
#include <imodlist.h>
+#include <directoryentry.h>
#include <QFile>
#include <QListWidget>
@@ -113,6 +114,8 @@ public:
int timeElapsedSinceLastChecked() const;
+ void highlightMods(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry);
+
public:
/// \copydoc MOBase::IModList::displayName
diff --git a/src/organizer_en.ts b/src/organizer_en.ts
index da3a3c6e..cd6277df 100644
--- a/src/organizer_en.ts
+++ b/src/organizer_en.ts
@@ -64,7 +64,7 @@
</message>
<message>
<location filename="activatemodsdialog.ui" line="20"/>
- <source>This is a list of esps and esms that were active when the save game was created.</source>
+ <source>This is a list of esps, esms, and esls that were active when the save game was created.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -73,7 +73,7 @@
&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; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This is a list of esps and esms that were active when the save game was created.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This is a list of esps, esms, and esls that were active when the save game was created.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;For each esp, the right column contains the mod (or mods) that can be enabled to make the missing esps/esms available.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;If you hit Ok, all the mods selected in the right columns and all missing esps that have become available will be activated.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@@ -820,148 +820,148 @@ p, li { white-space: pre-wrap; }
<context>
<name>EditExecutablesDialog</name>
<message>
- <location filename="editexecutablesdialog.ui" line="14"/>
+ <location filename="editexecutablesdialog.ui" line="20"/>
<source>Modify Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="20"/>
+ <location filename="editexecutablesdialog.ui" line="26"/>
<source>List of configured executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="23"/>
+ <location filename="editexecutablesdialog.ui" line="29"/>
<source>This is a list of your configured executables. Executables in grey are automatically recognised and can not be modified.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="41"/>
+ <location filename="editexecutablesdialog.ui" line="47"/>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="48"/>
- <location filename="editexecutablesdialog.ui" line="51"/>
+ <location filename="editexecutablesdialog.ui" line="54"/>
+ <location filename="editexecutablesdialog.ui" line="57"/>
<source>Name of the executable. This is only for display purposes.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="62"/>
+ <location filename="editexecutablesdialog.ui" line="68"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="69"/>
- <location filename="editexecutablesdialog.ui" line="72"/>
+ <location filename="editexecutablesdialog.ui" line="75"/>
+ <location filename="editexecutablesdialog.ui" line="78"/>
<source>Binary to run</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="79"/>
+ <location filename="editexecutablesdialog.ui" line="85"/>
<source>Browse filesystem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="82"/>
+ <location filename="editexecutablesdialog.ui" line="88"/>
<source>Browse filesystem for the executable to run.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="85"/>
- <location filename="editexecutablesdialog.ui" line="106"/>
+ <location filename="editexecutablesdialog.ui" line="91"/>
+ <location filename="editexecutablesdialog.ui" line="112"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="96"/>
+ <location filename="editexecutablesdialog.ui" line="102"/>
<source>Start in</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="117"/>
+ <location filename="editexecutablesdialog.ui" line="123"/>
<source>Arguments</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="124"/>
- <location filename="editexecutablesdialog.ui" line="127"/>
+ <location filename="editexecutablesdialog.ui" line="130"/>
+ <location filename="editexecutablesdialog.ui" line="133"/>
<source>Arguments to pass to the application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="138"/>
+ <location filename="editexecutablesdialog.ui" line="144"/>
<source>Allow the Steam AppID to be used for this executable to be changed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="141"/>
+ <location filename="editexecutablesdialog.ui" line="147"/>
<source>Allow the Steam AppID to be used for this executable to be changed.
Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game.
Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID. This overwrite is already preconfigured.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="146"/>
+ <location filename="editexecutablesdialog.ui" line="152"/>
<source>Overwrite Steam AppID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="156"/>
+ <location filename="editexecutablesdialog.ui" line="162"/>
<source>Steam AppID to use for this executable that differs from the games AppID.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="159"/>
+ <location filename="editexecutablesdialog.ui" line="165"/>
<source>Steam AppID to use for this executable that differs from the games AppID.
Every game/tool distributed through Steam has a unique ID. MO needs to know this ID to start those programs directly, otherwise the program is started by steam and then MO will not work. By default, MO will use the AppID for the game (usually 72850).
Right now the only case I know of where this needs to be overwritten is for the Skyrim Creation Kit which has its own AppID (usually 202480). This overwrite is already preconfigured.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="172"/>
+ <location filename="editexecutablesdialog.ui" line="178"/>
<source>If this is enabled, new files are created in the specified mod instead of the &quot;Overwrite&quot; mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="175"/>
+ <location filename="editexecutablesdialog.ui" line="181"/>
<source>Create Files in Mod instead of Overwrite (*)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="191"/>
+ <location filename="editexecutablesdialog.ui" line="197"/>
<source>Use Application&apos;s Icon for shortcuts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="198"/>
+ <location filename="editexecutablesdialog.ui" line="204"/>
<source>(*) This setting is profile-specific</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="207"/>
- <location filename="editexecutablesdialog.ui" line="210"/>
+ <location filename="editexecutablesdialog.ui" line="213"/>
+ <location filename="editexecutablesdialog.ui" line="216"/>
<source>Add an executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="213"/>
+ <location filename="editexecutablesdialog.ui" line="219"/>
<location filename="editexecutablesdialog.cpp" line="214"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="224"/>
- <location filename="editexecutablesdialog.ui" line="227"/>
+ <location filename="editexecutablesdialog.ui" line="230"/>
+ <location filename="editexecutablesdialog.ui" line="233"/>
<source>Remove the selected executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="230"/>
+ <location filename="editexecutablesdialog.ui" line="236"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="258"/>
+ <location filename="editexecutablesdialog.ui" line="264"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -1131,87 +1131,87 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="installationmanager.cpp" line="188"/>
- <location filename="installationmanager.cpp" line="275"/>
+ <location filename="installationmanager.cpp" line="276"/>
<source>Extracting files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="464"/>
+ <location filename="installationmanager.cpp" line="467"/>
<source>failed to create backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="473"/>
+ <location filename="installationmanager.cpp" line="476"/>
<source>Mod Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="473"/>
+ <location filename="installationmanager.cpp" line="476"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="526"/>
+ <location filename="installationmanager.cpp" line="529"/>
<source>Invalid name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="527"/>
+ <location filename="installationmanager.cpp" line="530"/>
<source>The name you entered is invalid, please enter a different one.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="652"/>
+ <location filename="installationmanager.cpp" line="656"/>
<source>File format &quot;%1&quot; not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="813"/>
+ <location filename="installationmanager.cpp" line="817"/>
<source>None of the available installer plugins were able to handle that archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="823"/>
+ <location filename="installationmanager.cpp" line="827"/>
<source>no error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="826"/>
+ <location filename="installationmanager.cpp" line="830"/>
<source>7z.dll not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="829"/>
+ <location filename="installationmanager.cpp" line="833"/>
<source>7z.dll isn&apos;t valid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="832"/>
+ <location filename="installationmanager.cpp" line="836"/>
<source>archive not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="835"/>
+ <location filename="installationmanager.cpp" line="839"/>
<source>failed to open archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="838"/>
+ <location filename="installationmanager.cpp" line="842"/>
<source>unsupported archive type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="841"/>
+ <location filename="installationmanager.cpp" line="845"/>
<source>internal library error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="844"/>
+ <location filename="installationmanager.cpp" line="848"/>
<source>archive invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="848"/>
+ <location filename="installationmanager.cpp" line="852"/>
<source>unknown archive error</source>
<translation type="unfinished"></translation>
</message>
@@ -1325,13 +1325,13 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="mainwindow.ui" line="253"/>
- <location filename="mainwindow.ui" line="757"/>
+ <location filename="mainwindow.ui" line="760"/>
<source>Restore Backup...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="267"/>
- <location filename="mainwindow.ui" line="777"/>
+ <location filename="mainwindow.ui" line="780"/>
<source>Create Backup</source>
<translation type="unfinished"></translation>
</message>
@@ -1362,8 +1362,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="mainwindow.ui" line="513"/>
- <location filename="mainwindow.ui" line="894"/>
- <location filename="mainwindow.ui" line="1135"/>
+ <location filename="mainwindow.ui" line="897"/>
+ <location filename="mainwindow.ui" line="1138"/>
<source>Namefilter</source>
<translation type="unfinished"></translation>
</message>
@@ -1431,74 +1431,74 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="839"/>
+ <location filename="mainwindow.ui" line="842"/>
<source>List of available esp/esm files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="842"/>
+ <location filename="mainwindow.ui" line="845"/>
<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; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This list contains the esps and esms contained in the active mods. These require their own load order. Use drag&amp;amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.&lt;br /&gt;There is a great tool named &amp;quot;BOSS&amp;quot; to automatically sort these files.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This list contains the esps, esms, and esls contained in the active mods. These require their own load order. Use drag&amp;amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.&lt;br /&gt;There is a great tool named &amp;quot;BOSS&amp;quot; to automatically sort these files.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="904"/>
+ <location filename="mainwindow.ui" line="907"/>
<source>Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="922"/>
+ <location filename="mainwindow.ui" line="925"/>
<source>refresh data-directory overview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="925"/>
+ <location filename="mainwindow.ui" line="928"/>
<source>Refresh the overview. This may take a moment.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="928"/>
- <location filename="mainwindow.cpp" line="2896"/>
- <location filename="mainwindow.cpp" line="3651"/>
+ <location filename="mainwindow.ui" line="931"/>
+ <location filename="mainwindow.cpp" line="2929"/>
+ <location filename="mainwindow.cpp" line="3684"/>
<source>Refresh</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="944"/>
+ <location filename="mainwindow.ui" line="947"/>
<source>This is an overview of your data directory as visible to the game (and tools). </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="954"/>
+ <location filename="mainwindow.ui" line="957"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="959"/>
+ <location filename="mainwindow.ui" line="962"/>
<source>Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="969"/>
<location filename="mainwindow.ui" line="972"/>
+ <location filename="mainwindow.ui" line="975"/>
<source>Filter the above list so that only conflicts are displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="975"/>
+ <location filename="mainwindow.ui" line="978"/>
<source>Show only conflicts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="983"/>
+ <location filename="mainwindow.ui" line="986"/>
<source>Saves</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1007"/>
+ <location filename="mainwindow.ui" line="1010"/>
<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; }
@@ -1509,155 +1509,155 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1027"/>
+ <location filename="mainwindow.ui" line="1030"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1062"/>
+ <location filename="mainwindow.ui" line="1065"/>
<source>This is a list of mods you downloaded from Nexus. Double click one to install it. You can also drag an archive into here.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1115"/>
+ <location filename="mainwindow.ui" line="1118"/>
<source>Show Hidden</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1177"/>
+ <location filename="mainwindow.ui" line="1180"/>
<source>Tool Bar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1220"/>
+ <location filename="mainwindow.ui" line="1223"/>
<source>Install Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1223"/>
+ <location filename="mainwindow.ui" line="1226"/>
<source>Install &amp;Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1226"/>
+ <location filename="mainwindow.ui" line="1229"/>
<source>Install a new mod from an archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1229"/>
+ <location filename="mainwindow.ui" line="1232"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1238"/>
+ <location filename="mainwindow.ui" line="1241"/>
<source>Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1241"/>
+ <location filename="mainwindow.ui" line="1244"/>
<source>&amp;Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1244"/>
+ <location filename="mainwindow.ui" line="1247"/>
<source>Configure Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1247"/>
+ <location filename="mainwindow.ui" line="1250"/>
<source>Ctrl+P</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1256"/>
+ <location filename="mainwindow.ui" line="1259"/>
<source>Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1259"/>
+ <location filename="mainwindow.ui" line="1262"/>
<source>&amp;Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1262"/>
+ <location filename="mainwindow.ui" line="1265"/>
<source>Configure the executables that can be started through Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1265"/>
+ <location filename="mainwindow.ui" line="1268"/>
<source>Ctrl+E</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1274"/>
- <location filename="mainwindow.ui" line="1280"/>
+ <location filename="mainwindow.ui" line="1277"/>
+ <location filename="mainwindow.ui" line="1283"/>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1277"/>
+ <location filename="mainwindow.ui" line="1280"/>
<source>&amp;Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1283"/>
+ <location filename="mainwindow.ui" line="1286"/>
<source>Ctrl+I</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1292"/>
+ <location filename="mainwindow.ui" line="1295"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1295"/>
+ <location filename="mainwindow.ui" line="1298"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1298"/>
+ <location filename="mainwindow.ui" line="1301"/>
<source>Configure settings and workarounds</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1301"/>
+ <location filename="mainwindow.ui" line="1304"/>
<source>Ctrl+S</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1310"/>
+ <location filename="mainwindow.ui" line="1313"/>
<source>Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1313"/>
+ <location filename="mainwindow.ui" line="1316"/>
<source>Search nexus network for more mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1316"/>
+ <location filename="mainwindow.ui" line="1319"/>
<source>Ctrl+N</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1328"/>
- <location filename="mainwindow.cpp" line="3592"/>
+ <location filename="mainwindow.ui" line="1331"/>
+ <location filename="mainwindow.cpp" line="3625"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1331"/>
+ <location filename="mainwindow.ui" line="1334"/>
<source>Mod Organizer is up-to-date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1343"/>
- <location filename="mainwindow.cpp" line="597"/>
+ <location filename="mainwindow.ui" line="1346"/>
+ <location filename="mainwindow.cpp" line="605"/>
<source>No Problems</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1346"/>
+ <location filename="mainwindow.ui" line="1349"/>
<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!
@@ -1665,621 +1665,621 @@ Right now this has very limited functionality</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1358"/>
<location filename="mainwindow.ui" line="1361"/>
+ <location filename="mainwindow.ui" line="1364"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1364"/>
+ <location filename="mainwindow.ui" line="1367"/>
<source>Ctrl+H</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1373"/>
+ <location filename="mainwindow.ui" line="1376"/>
<source>Endorse MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1376"/>
- <location filename="mainwindow.cpp" line="3670"/>
+ <location filename="mainwindow.ui" line="1379"/>
+ <location filename="mainwindow.cpp" line="3703"/>
<source>Endorse Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1381"/>
+ <location filename="mainwindow.ui" line="1384"/>
<source>Copy Log to Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1384"/>
+ <location filename="mainwindow.ui" line="1387"/>
<source>Ctrl+C</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1393"/>
+ <location filename="mainwindow.ui" line="1396"/>
<source>Change Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1396"/>
+ <location filename="mainwindow.ui" line="1399"/>
<source>Open the game selection dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="286"/>
+ <location filename="mainwindow.cpp" line="291"/>
<source>Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="287"/>
+ <location filename="mainwindow.cpp" line="292"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="288"/>
+ <location filename="mainwindow.cpp" line="293"/>
<source>Start Menu</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="585"/>
+ <location filename="mainwindow.cpp" line="593"/>
<source>Problems</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="586"/>
+ <location filename="mainwindow.cpp" line="594"/>
<source>There are potential problems with your setup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="598"/>
+ <location filename="mainwindow.cpp" line="606"/>
<source>Everything seems to be in order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="659"/>
+ <location filename="mainwindow.cpp" line="667"/>
<source>Help on UI</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="663"/>
+ <location filename="mainwindow.cpp" line="671"/>
<source>Documentation Wiki</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="667"/>
+ <location filename="mainwindow.cpp" line="675"/>
<source>Report Issue</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="671"/>
+ <location filename="mainwindow.cpp" line="679"/>
<source>Tutorials</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="710"/>
+ <location filename="mainwindow.cpp" line="718"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="711"/>
+ <location filename="mainwindow.cpp" line="719"/>
<source>About Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="763"/>
+ <location filename="mainwindow.cpp" line="771"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="764"/>
+ <location filename="mainwindow.cpp" line="772"/>
<source>Please enter a name for the new profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="772"/>
+ <location filename="mainwindow.cpp" line="780"/>
<source>failed to create profile: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="816"/>
+ <location filename="mainwindow.cpp" line="824"/>
<source>Show tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="817"/>
+ <location filename="mainwindow.cpp" line="825"/>
<source>You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the &quot;Help&quot;-menu.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="850"/>
+ <location filename="mainwindow.cpp" line="859"/>
<source>Downloads in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="851"/>
+ <location filename="mainwindow.cpp" line="860"/>
<source>There are still downloads in progress, do you really want to quit?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="953"/>
+ <location filename="mainwindow.cpp" line="963"/>
<source>Plugin &quot;%1&quot; failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="955"/>
+ <location filename="mainwindow.cpp" line="965"/>
<source>Plugin &quot;%1&quot; failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="992"/>
+ <location filename="mainwindow.cpp" line="1002"/>
<source>Browse Mod Page</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1120"/>
+ <location filename="mainwindow.cpp" line="1136"/>
<source>Also in: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1131"/>
+ <location filename="mainwindow.cpp" line="1147"/>
<source>No conflict</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1243"/>
+ <location filename="mainwindow.cpp" line="1259"/>
<source>&lt;Edit...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1392"/>
+ <location filename="mainwindow.cpp" line="1408"/>
<source>Activating Network Proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1525"/>
+ <location filename="mainwindow.cpp" line="1541"/>
<source>Choose Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1526"/>
+ <location filename="mainwindow.cpp" line="1542"/>
<source>Mod Archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1684"/>
+ <location filename="mainwindow.cpp" line="1704"/>
<source>Start Tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1685"/>
+ <location filename="mainwindow.cpp" line="1705"/>
<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="1820"/>
+ <location filename="mainwindow.cpp" line="1840"/>
<source>failed to spawn notepad.exe: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1848"/>
+ <location filename="mainwindow.cpp" line="1868"/>
<source>failed to open %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1922"/>
+ <location filename="mainwindow.cpp" line="1942"/>
<source>failed to change origin name: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1945"/>
+ <location filename="mainwindow.cpp" line="1966"/>
<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="1969"/>
+ <location filename="mainwindow.cpp" line="1990"/>
<source>&lt;Contains %1&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2004"/>
+ <location filename="mainwindow.cpp" line="2025"/>
<source>&lt;Checked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2005"/>
+ <location filename="mainwindow.cpp" line="2026"/>
<source>&lt;Unchecked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2006"/>
+ <location filename="mainwindow.cpp" line="2027"/>
<source>&lt;Update&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2007"/>
+ <location filename="mainwindow.cpp" line="2028"/>
<source>&lt;Managed by MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2008"/>
+ <location filename="mainwindow.cpp" line="2029"/>
<source>&lt;Managed outside MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2009"/>
+ <location filename="mainwindow.cpp" line="2030"/>
<source>&lt;No category&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2010"/>
+ <location filename="mainwindow.cpp" line="2031"/>
<source>&lt;Conflicted&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2011"/>
+ <location filename="mainwindow.cpp" line="2032"/>
<source>&lt;Not Endorsed&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2057"/>
+ <location filename="mainwindow.cpp" line="2078"/>
<source>failed to rename mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2070"/>
+ <location filename="mainwindow.cpp" line="2091"/>
<source>Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2071"/>
+ <location filename="mainwindow.cpp" line="2092"/>
<source>This will replace the existing mod &quot;%1&quot;. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2074"/>
+ <location filename="mainwindow.cpp" line="2095"/>
<source>failed to remove mod &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2078"/>
- <location filename="mainwindow.cpp" line="3490"/>
- <location filename="mainwindow.cpp" line="3514"/>
+ <location filename="mainwindow.cpp" line="2099"/>
+ <location filename="mainwindow.cpp" line="3523"/>
+ <location filename="mainwindow.cpp" line="3547"/>
<source>failed to rename &quot;%1&quot; to &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2126"/>
- <location filename="mainwindow.cpp" line="2807"/>
- <location filename="mainwindow.cpp" line="2815"/>
- <location filename="mainwindow.cpp" line="3073"/>
+ <location filename="mainwindow.cpp" line="2159"/>
+ <location filename="mainwindow.cpp" line="2840"/>
+ <location filename="mainwindow.cpp" line="2848"/>
+ <location filename="mainwindow.cpp" line="3106"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2127"/>
+ <location filename="mainwindow.cpp" line="2160"/>
<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="2138"/>
+ <location filename="mainwindow.cpp" line="2171"/>
<source>failed to remove mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2173"/>
- <location filename="mainwindow.cpp" line="2176"/>
+ <location filename="mainwindow.cpp" line="2206"/>
+ <location filename="mainwindow.cpp" line="2209"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2173"/>
+ <location filename="mainwindow.cpp" line="2206"/>
<source>Installation file no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2177"/>
+ <location filename="mainwindow.cpp" line="2210"/>
<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="2194"/>
+ <location filename="mainwindow.cpp" line="2227"/>
<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="2210"/>
- <location filename="mainwindow.cpp" line="2237"/>
+ <location filename="mainwindow.cpp" line="2243"/>
+ <location filename="mainwindow.cpp" line="2270"/>
<source>You need to be logged in with Nexus to endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2285"/>
+ <location filename="mainwindow.cpp" line="2318"/>
<source>Failed to display overwrite dialog: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2414"/>
+ <location filename="mainwindow.cpp" line="2447"/>
<source>Nexus ID for this Mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2424"/>
+ <location filename="mainwindow.cpp" line="2457"/>
<source>Web page for this mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2451"/>
- <location filename="mainwindow.cpp" line="2478"/>
- <location filename="mainwindow.cpp" line="2924"/>
+ <location filename="mainwindow.cpp" line="2484"/>
+ <location filename="mainwindow.cpp" line="2511"/>
+ <location filename="mainwindow.cpp" line="2957"/>
<source>Create Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2452"/>
+ <location filename="mainwindow.cpp" line="2485"/>
<source>This will create an empty mod.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2461"/>
- <location filename="mainwindow.cpp" line="2488"/>
+ <location filename="mainwindow.cpp" line="2494"/>
+ <location filename="mainwindow.cpp" line="2521"/>
<source>A mod with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2479"/>
+ <location filename="mainwindow.cpp" line="2512"/>
<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="2719"/>
+ <location filename="mainwindow.cpp" line="2752"/>
<source>Not logged in, endorsement information will be wrong</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2727"/>
+ <location filename="mainwindow.cpp" line="2760"/>
<source>Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2728"/>
+ <location filename="mainwindow.cpp" line="2761"/>
<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="2748"/>
- <location filename="mainwindow.cpp" line="3560"/>
+ <location filename="mainwindow.cpp" line="2781"/>
+ <location filename="mainwindow.cpp" line="3593"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2749"/>
+ <location filename="mainwindow.cpp" line="2782"/>
<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="2807"/>
+ <location filename="mainwindow.cpp" line="2840"/>
<source>Really enable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2815"/>
+ <location filename="mainwindow.cpp" line="2848"/>
<source>Really disable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2823"/>
+ <location filename="mainwindow.cpp" line="2856"/>
<source>Choose what to export</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2825"/>
+ <location filename="mainwindow.cpp" line="2858"/>
<source>Everything</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2825"/>
+ <location filename="mainwindow.cpp" line="2858"/>
<source>All installed mods are included in the list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2826"/>
+ <location filename="mainwindow.cpp" line="2859"/>
<source>Active Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2826"/>
+ <location filename="mainwindow.cpp" line="2859"/>
<source>Only active (checked) mods from your current profile are included</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2827"/>
+ <location filename="mainwindow.cpp" line="2860"/>
<source>Visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2827"/>
+ <location filename="mainwindow.cpp" line="2860"/>
<source>All mods visible in the mod list are included</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2870"/>
+ <location filename="mainwindow.cpp" line="2903"/>
<source>export failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2887"/>
+ <location filename="mainwindow.cpp" line="2920"/>
<source>Install Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2889"/>
+ <location filename="mainwindow.cpp" line="2922"/>
<source>Create empty mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2891"/>
+ <location filename="mainwindow.cpp" line="2924"/>
<source>Enable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2892"/>
+ <location filename="mainwindow.cpp" line="2925"/>
<source>Disable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2894"/>
+ <location filename="mainwindow.cpp" line="2927"/>
<source>Check all for update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2898"/>
+ <location filename="mainwindow.cpp" line="2931"/>
<source>Export to csv...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2917"/>
+ <location filename="mainwindow.cpp" line="2950"/>
<source>All Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2923"/>
+ <location filename="mainwindow.cpp" line="2956"/>
<source>Sync to Mods...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2927"/>
+ <location filename="mainwindow.cpp" line="2960"/>
<source>Restore Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2928"/>
+ <location filename="mainwindow.cpp" line="2961"/>
<source>Remove Backup...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2932"/>
+ <location filename="mainwindow.cpp" line="2965"/>
<source>Add/Remove Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2937"/>
+ <location filename="mainwindow.cpp" line="2970"/>
<source>Replace Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2942"/>
+ <location filename="mainwindow.cpp" line="2975"/>
<source>Primary Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2948"/>
+ <location filename="mainwindow.cpp" line="2981"/>
<source>Change versioning scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2952"/>
+ <location filename="mainwindow.cpp" line="2985"/>
<source>Un-ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2954"/>
+ <location filename="mainwindow.cpp" line="2987"/>
<source>Ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2959"/>
+ <location filename="mainwindow.cpp" line="2992"/>
<source>Rename Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2960"/>
+ <location filename="mainwindow.cpp" line="2993"/>
<source>Remove Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2961"/>
+ <location filename="mainwindow.cpp" line="2994"/>
<source>Reinstall Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2965"/>
+ <location filename="mainwindow.cpp" line="2998"/>
<source>Un-Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2968"/>
- <location filename="mainwindow.cpp" line="2972"/>
+ <location filename="mainwindow.cpp" line="3001"/>
+ <location filename="mainwindow.cpp" line="3005"/>
<source>Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2969"/>
+ <location filename="mainwindow.cpp" line="3002"/>
<source>Won&apos;t endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2975"/>
+ <location filename="mainwindow.cpp" line="3008"/>
<source>Endorsement state unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2984"/>
+ <location filename="mainwindow.cpp" line="3017"/>
<source>Ignore missing data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2988"/>
+ <location filename="mainwindow.cpp" line="3021"/>
<source>Visit on Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2990"/>
+ <location filename="mainwindow.cpp" line="3023"/>
<source>Visit web page</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2993"/>
+ <location filename="mainwindow.cpp" line="3026"/>
<source>Open in explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2997"/>
+ <location filename="mainwindow.cpp" line="3030"/>
<source>Information...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3004"/>
- <location filename="mainwindow.cpp" line="4067"/>
+ <location filename="mainwindow.cpp" line="3037"/>
+ <location filename="mainwindow.cpp" line="4100"/>
<source>Exception: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3006"/>
- <location filename="mainwindow.cpp" line="4069"/>
+ <location filename="mainwindow.cpp" line="3039"/>
+ <location filename="mainwindow.cpp" line="4102"/>
<source>Unknown exception</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3034"/>
+ <location filename="mainwindow.cpp" line="3067"/>
<source>&lt;All&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3036"/>
+ <location filename="mainwindow.cpp" line="3069"/>
<source>&lt;Multiple&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3070"/>
+ <location filename="mainwindow.cpp" line="3103"/>
<source>%1 more</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="3074"/>
+ <location filename="mainwindow.cpp" line="3107"/>
<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>
@@ -2287,12 +2287,12 @@ This function will guess the versioning scheme under the assumption that the ins
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3119"/>
+ <location filename="mainwindow.cpp" line="3152"/>
<source>Enable Mods...</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="3134"/>
+ <location filename="mainwindow.cpp" line="3167"/>
<source>Delete %n save(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2300,319 +2300,319 @@ This function will guess the versioning scheme under the assumption that the ins
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3176"/>
+ <location filename="mainwindow.cpp" line="3209"/>
<source>failed to remove %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3198"/>
+ <location filename="mainwindow.cpp" line="3231"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3240"/>
+ <location filename="mainwindow.cpp" line="3273"/>
<source>Can&apos;t change download directory while downloads are in progress!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3362"/>
+ <location filename="mainwindow.cpp" line="3395"/>
<source>failed to write to file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3368"/>
+ <location filename="mainwindow.cpp" line="3401"/>
<source>%1 written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3409"/>
+ <location filename="mainwindow.cpp" line="3442"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3409"/>
+ <location filename="mainwindow.cpp" line="3442"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3435"/>
+ <location filename="mainwindow.cpp" line="3468"/>
<source>Enter Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3436"/>
+ <location filename="mainwindow.cpp" line="3469"/>
<source>Please enter a name for the executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3450"/>
+ <location filename="mainwindow.cpp" line="3483"/>
<source>Not an executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3450"/>
+ <location filename="mainwindow.cpp" line="3483"/>
<source>This is not a recognized executable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3475"/>
- <location filename="mainwindow.cpp" line="3500"/>
+ <location filename="mainwindow.cpp" line="3508"/>
+ <location filename="mainwindow.cpp" line="3533"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3475"/>
+ <location filename="mainwindow.cpp" line="3508"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3478"/>
- <location filename="mainwindow.cpp" line="3503"/>
+ <location filename="mainwindow.cpp" line="3511"/>
+ <location filename="mainwindow.cpp" line="3536"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3478"/>
- <location filename="mainwindow.cpp" line="3503"/>
+ <location filename="mainwindow.cpp" line="3511"/>
+ <location filename="mainwindow.cpp" line="3536"/>
<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="3500"/>
+ <location filename="mainwindow.cpp" line="3533"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3533"/>
+ <location filename="mainwindow.cpp" line="3566"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3546"/>
+ <location filename="mainwindow.cpp" line="3579"/>
<source>failed to generate preview for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3560"/>
+ <location filename="mainwindow.cpp" line="3593"/>
<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="3594"/>
+ <location filename="mainwindow.cpp" line="3627"/>
<source>Update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3631"/>
+ <location filename="mainwindow.cpp" line="3664"/>
<source>Open/Execute</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3632"/>
+ <location filename="mainwindow.cpp" line="3665"/>
<source>Add as Executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3636"/>
+ <location filename="mainwindow.cpp" line="3669"/>
<source>Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3642"/>
+ <location filename="mainwindow.cpp" line="3675"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3644"/>
+ <location filename="mainwindow.cpp" line="3677"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3650"/>
+ <location filename="mainwindow.cpp" line="3683"/>
<source>Write To File...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3671"/>
+ <location filename="mainwindow.cpp" line="3704"/>
<source>Do you want to endorse Mod Organizer on %1 now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3774"/>
+ <location filename="mainwindow.cpp" line="3807"/>
<source>Thank you!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3774"/>
+ <location filename="mainwindow.cpp" line="3807"/>
<source>Thank you for your endorsement!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3809"/>
+ <location filename="mainwindow.cpp" line="3842"/>
<source>Request to Nexus failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3824"/>
- <location filename="mainwindow.cpp" line="3875"/>
+ <location filename="mainwindow.cpp" line="3857"/>
+ <location filename="mainwindow.cpp" line="3908"/>
<source>failed to read %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3836"/>
- <location filename="mainwindow.cpp" line="4254"/>
+ <location filename="mainwindow.cpp" line="3869"/>
+ <location filename="mainwindow.cpp" line="4287"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3836"/>
+ <location filename="mainwindow.cpp" line="3869"/>
<source>failed to extract %1 (errorcode %2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3867"/>
+ <location filename="mainwindow.cpp" line="3900"/>
<source>Extract BSA</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3886"/>
+ <location filename="mainwindow.cpp" line="3919"/>
<source>This archive contains invalid hashes. Some files may be broken.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3934"/>
+ <location filename="mainwindow.cpp" line="3967"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3935"/>
+ <location filename="mainwindow.cpp" line="3968"/>
<source>This will restart MO, continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3975"/>
+ <location filename="mainwindow.cpp" line="4008"/>
<source>Edit Categories...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3976"/>
+ <location filename="mainwindow.cpp" line="4009"/>
<source>Deselect filter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4027"/>
+ <location filename="mainwindow.cpp" line="4060"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4038"/>
+ <location filename="mainwindow.cpp" line="4071"/>
<source>Enable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4039"/>
+ <location filename="mainwindow.cpp" line="4072"/>
<source>Disable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4058"/>
+ <location filename="mainwindow.cpp" line="4091"/>
<source>Unlock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4061"/>
+ <location filename="mainwindow.cpp" line="4094"/>
<source>Lock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4203"/>
+ <location filename="mainwindow.cpp" line="4236"/>
<source>depends on missing &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4207"/>
+ <location filename="mainwindow.cpp" line="4240"/>
<source>incompatible with &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4229"/>
+ <location filename="mainwindow.cpp" line="4266"/>
<source>Please wait while LOOT is running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4327"/>
+ <location filename="mainwindow.cpp" line="4360"/>
<source>loot failed. Exit code was: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4349"/>
+ <location filename="mainwindow.cpp" line="4382"/>
<source>failed to start loot</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4352"/>
+ <location filename="mainwindow.cpp" line="4385"/>
<source>failed to run loot: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4356"/>
+ <location filename="mainwindow.cpp" line="4389"/>
<source>Errors occured</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4409"/>
+ <location filename="mainwindow.cpp" line="4443"/>
<source>Backup of load order created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4419"/>
+ <location filename="mainwindow.cpp" line="4453"/>
<source>Choose backup to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4432"/>
+ <location filename="mainwindow.cpp" line="4466"/>
<source>No Backups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4432"/>
+ <location filename="mainwindow.cpp" line="4466"/>
<source>There are no backups to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4453"/>
- <location filename="mainwindow.cpp" line="4475"/>
+ <location filename="mainwindow.cpp" line="4487"/>
+ <location filename="mainwindow.cpp" line="4509"/>
<source>Restore failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4454"/>
- <location filename="mainwindow.cpp" line="4476"/>
+ <location filename="mainwindow.cpp" line="4488"/>
+ <location filename="mainwindow.cpp" line="4510"/>
<source>Failed to restore the backup. Errorcode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4465"/>
+ <location filename="mainwindow.cpp" line="4499"/>
<source>Backup of modlist created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4565"/>
+ <location filename="mainwindow.cpp" line="4599"/>
<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="4567"/>
+ <location filename="mainwindow.cpp" line="4601"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4568"/>
+ <location filename="mainwindow.cpp" line="4602"/>
<source>Rename new file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4569"/>
+ <location filename="mainwindow.cpp" line="4603"/>
<source>Ignore file</source>
<translation type="unfinished"></translation>
</message>
@@ -2675,16 +2675,21 @@ This function will guess the versioning scheme under the assumption that the ins
</message>
<message>
<location filename="modinfo.cpp" line="102"/>
+ <source>MCM Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modinfo.cpp" line="103"/>
<source>invalid content type %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="125"/>
+ <location filename="modinfo.cpp" line="126"/>
<source>invalid mod index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="154"/>
+ <location filename="modinfo.cpp" line="155"/>
<source>remove: invalid mod index %1</source>
<translation type="unfinished"></translation>
</message>
@@ -2793,12 +2798,12 @@ This function will guess the versioning scheme under the assumption that the ins
</message>
<message>
<location filename="modinfodialog.ui" line="282"/>
- <source>List of esps and esms that can not be loaded by the game.</source>
+ <source>List of esps, esms, and esls that can not be loaded by the game.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="modinfodialog.ui" line="285"/>
- <source>List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.
+ <source>List of esps, esms, and esls contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.
They usually contain optional functionality, see the readme.
Most mods do not have optional esps, so chances are good you are looking at an empty list.</source>
@@ -2989,227 +2994,227 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="175"/>
+ <location filename="modinfodialog.cpp" line="180"/>
<source>&amp;Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="176"/>
+ <location filename="modinfodialog.cpp" line="181"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="177"/>
+ <location filename="modinfodialog.cpp" line="182"/>
<source>&amp;Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="178"/>
+ <location filename="modinfodialog.cpp" line="183"/>
<source>&amp;Unhide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="179"/>
+ <location filename="modinfodialog.cpp" line="184"/>
<source>&amp;Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="180"/>
+ <location filename="modinfodialog.cpp" line="185"/>
<source>&amp;New Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="429"/>
- <location filename="modinfodialog.cpp" line="444"/>
+ <location filename="modinfodialog.cpp" line="435"/>
+ <location filename="modinfodialog.cpp" line="450"/>
<source>Save changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="429"/>
- <location filename="modinfodialog.cpp" line="444"/>
+ <location filename="modinfodialog.cpp" line="435"/>
+ <location filename="modinfodialog.cpp" line="450"/>
<source>Save changes to &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="634"/>
+ <location filename="modinfodialog.cpp" line="640"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="634"/>
+ <location filename="modinfodialog.cpp" line="640"/>
<source>A file with that name exists, please enter a new one</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="651"/>
+ <location filename="modinfodialog.cpp" line="657"/>
<source>failed to move file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="676"/>
+ <location filename="modinfodialog.cpp" line="682"/>
<source>failed to create directory &quot;optional&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="716"/>
- <location filename="modinfodialog.cpp" line="1220"/>
+ <location filename="modinfodialog.cpp" line="722"/>
+ <location filename="modinfodialog.cpp" line="1228"/>
<source>Info requested, please wait</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="770"/>
+ <location filename="modinfodialog.cpp" line="776"/>
<source>Main</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="771"/>
+ <location filename="modinfodialog.cpp" line="777"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="772"/>
+ <location filename="modinfodialog.cpp" line="778"/>
<source>Optional</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="773"/>
+ <location filename="modinfodialog.cpp" line="779"/>
<source>Old</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="774"/>
+ <location filename="modinfodialog.cpp" line="780"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="775"/>
+ <location filename="modinfodialog.cpp" line="781"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="786"/>
+ <location filename="modinfodialog.cpp" line="792"/>
<source>Current Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="790"/>
+ <location filename="modinfodialog.cpp" line="796"/>
<source>No update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="831"/>
+ <location filename="modinfodialog.cpp" line="839"/>
<source>(description incomplete, please visit nexus)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="846"/>
+ <location filename="modinfodialog.cpp" line="854"/>
<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="924"/>
+ <location filename="modinfodialog.cpp" line="932"/>
<source>Failed to delete %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="935"/>
- <location filename="modinfodialog.cpp" line="940"/>
+ <location filename="modinfodialog.cpp" line="943"/>
+ <location filename="modinfodialog.cpp" line="948"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="935"/>
+ <location filename="modinfodialog.cpp" line="943"/>
<source>Are sure you want to delete &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="940"/>
+ <location filename="modinfodialog.cpp" line="948"/>
<source>Are sure you want to delete the selected files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1014"/>
- <location filename="modinfodialog.cpp" line="1020"/>
+ <location filename="modinfodialog.cpp" line="1022"/>
+ <location filename="modinfodialog.cpp" line="1028"/>
<source>New Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1026"/>
+ <location filename="modinfodialog.cpp" line="1034"/>
<source>Failed to create &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1130"/>
- <location filename="modinfodialog.cpp" line="1154"/>
+ <location filename="modinfodialog.cpp" line="1138"/>
+ <location filename="modinfodialog.cpp" line="1162"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1130"/>
+ <location filename="modinfodialog.cpp" line="1138"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1133"/>
- <location filename="modinfodialog.cpp" line="1157"/>
+ <location filename="modinfodialog.cpp" line="1141"/>
+ <location filename="modinfodialog.cpp" line="1165"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1133"/>
- <location filename="modinfodialog.cpp" line="1157"/>
+ <location filename="modinfodialog.cpp" line="1141"/>
+ <location filename="modinfodialog.cpp" line="1165"/>
<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="1144"/>
- <location filename="modinfodialog.cpp" line="1167"/>
+ <location filename="modinfodialog.cpp" line="1152"/>
+ <location filename="modinfodialog.cpp" line="1175"/>
<source>failed to rename %1 to %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1154"/>
+ <location filename="modinfodialog.cpp" line="1162"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1200"/>
+ <location filename="modinfodialog.cpp" line="1208"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1202"/>
+ <location filename="modinfodialog.cpp" line="1210"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1243"/>
+ <location filename="modinfodialog.cpp" line="1251"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1243"/>
+ <location filename="modinfodialog.cpp" line="1251"/>
<source>Please enter a name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1247"/>
- <location filename="modinfodialog.cpp" line="1250"/>
+ <location filename="modinfodialog.cpp" line="1255"/>
+ <location filename="modinfodialog.cpp" line="1258"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1247"/>
+ <location filename="modinfodialog.cpp" line="1255"/>
<source>Invalid name. Must be a valid file name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1250"/>
+ <location filename="modinfodialog.cpp" line="1258"/>
<source>A tweak by that name exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1264"/>
+ <location filename="modinfodialog.cpp" line="1272"/>
<source>Create Tweak</source>
<translation type="unfinished"></translation>
</message>
@@ -3225,7 +3230,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>ModInfoOverwrite</name>
<message>
- <location filename="modinfooverwrite.cpp" line="42"/>
+ <location filename="modinfooverwrite.cpp" line="48"/>
<source>This pseudo mod contains files from the virtual data tree that got modified (i.e. by the construction kit)</source>
<translation type="unfinished"></translation>
</message>
@@ -3239,12 +3244,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinforegular.cpp" line="479"/>
- <source>%1 contains no esp/esm and no asset (textures, meshes, interface, ...) directory</source>
+ <location filename="modinforegular.cpp" line="489"/>
+ <source>%1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory</source>
+ <oldsource>%1 contains no esp/esm and no asset (textures, meshes, interface, ...) directory</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinforegular.cpp" line="483"/>
+ <location filename="modinforegular.cpp" line="493"/>
<source>Categories: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
@@ -3253,7 +3259,8 @@ p, li { white-space: pre-wrap; }
<name>ModList</name>
<message>
<location filename="modlist.cpp" line="63"/>
- <source>Game plugins (esp/esm)</source>
+ <source>Game Plugins (ESP/ESM/ESL)</source>
+ <oldsource>Game plugins (esp/esm/esl)</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -3297,173 +3304,179 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="132"/>
+ <location filename="modlist.cpp" line="72"/>
+ <source>MCM Configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="133"/>
<source>This entry contains files that have been created inside the virtual data tree (i.e. by the construction kit)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="141"/>
+ <location filename="modlist.cpp" line="142"/>
<source>Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="142"/>
+ <location filename="modlist.cpp" line="143"/>
<source>No valid game data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="143"/>
+ <location filename="modlist.cpp" line="144"/>
<source>Not endorsed yet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="145"/>
+ <location filename="modlist.cpp" line="146"/>
<source>Overwrites files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="146"/>
+ <location filename="modlist.cpp" line="147"/>
<source>Overwritten files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="147"/>
+ <location filename="modlist.cpp" line="148"/>
<source>Overwrites &amp; Overwritten</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="148"/>
+ <location filename="modlist.cpp" line="149"/>
<source>Redundant</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="225"/>
+ <location filename="modlist.cpp" line="226"/>
<source>Non-MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="255"/>
+ <location filename="modlist.cpp" line="256"/>
<source>invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="379"/>
+ <location filename="modlist.cpp" line="383"/>
<source>installed version: &quot;%1&quot;, newest version: &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="381"/>
+ <location filename="modlist.cpp" line="385"/>
<source>The newest version on Nexus seems to be older than the one you have installed. This could either mean the version you have has been withdrawn (i.e. due to a bug) or the author uses a non-standard versioning scheme and that newest version is actually newer. Either way you may want to &quot;upgrade&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="389"/>
+ <location filename="modlist.cpp" line="393"/>
<source>Categories: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="418"/>
+ <location filename="modlist.cpp" line="422"/>
<source>Invalid name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="870"/>
+ <location filename="modlist.cpp" line="906"/>
<source>drag&amp;drop failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="940"/>
+ <location filename="modlist.cpp" line="976"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="941"/>
+ <location filename="modlist.cpp" line="977"/>
<source>Are you sure you want to remove &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1004"/>
+ <location filename="modlist.cpp" line="1040"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1005"/>
+ <location filename="modlist.cpp" line="1041"/>
<source>Content</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1006"/>
+ <location filename="modlist.cpp" line="1042"/>
<source>Mod Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1007"/>
+ <location filename="modlist.cpp" line="1043"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1008"/>
+ <location filename="modlist.cpp" line="1044"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1009"/>
+ <location filename="modlist.cpp" line="1045"/>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1010"/>
+ <location filename="modlist.cpp" line="1046"/>
<source>Nexus ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1011"/>
+ <location filename="modlist.cpp" line="1047"/>
<source>Installation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1012"/>
- <location filename="modlist.cpp" line="1042"/>
+ <location filename="modlist.cpp" line="1048"/>
+ <location filename="modlist.cpp" line="1078"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1020"/>
+ <location filename="modlist.cpp" line="1056"/>
<source>Name of your mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1021"/>
+ <location filename="modlist.cpp" line="1057"/>
<source>Version of the mod (if available)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1022"/>
+ <location filename="modlist.cpp" line="1058"/>
<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="1024"/>
+ <location filename="modlist.cpp" line="1060"/>
<source>Category of the mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1025"/>
+ <location filename="modlist.cpp" line="1061"/>
<source>Id of the mod as used on Nexus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1026"/>
+ <location filename="modlist.cpp" line="1062"/>
<source>Emblemes to highlight things that might require attention.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1027"/>
- <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)&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;/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;/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;/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;/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;/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;/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;/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;/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;/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;/tr&gt;&lt;/table&gt;</source>
+ <location filename="modlist.cpp" line="1063"/>
+ <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;/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;/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;/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;/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;/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;/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;/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;/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;/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;/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;/tr&gt;&lt;/table&gt;</source>
+ <oldsource>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)&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;/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;/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;/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;/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;/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;/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;/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;/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;/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;/tr&gt;&lt;/table&gt;</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1041"/>
+ <location filename="modlist.cpp" line="1077"/>
<source>Time this mod was installed</source>
<translation type="unfinished"></translation>
</message>
@@ -3551,189 +3564,189 @@ p, li { white-space: pre-wrap; }
<context>
<name>OrganizerCore</name>
<message>
- <location filename="organizercore.cpp" line="304"/>
- <location filename="organizercore.cpp" line="331"/>
+ <location filename="organizercore.cpp" line="306"/>
+ <location filename="organizercore.cpp" line="333"/>
<source>Failed to write settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="305"/>
+ <location filename="organizercore.cpp" line="307"/>
<source>An error occured trying to update MO settings to %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="326"/>
+ <location filename="organizercore.cpp" line="328"/>
<source>File is write protected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="328"/>
+ <location filename="organizercore.cpp" line="330"/>
<source>Invalid file format (probably a bug)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="329"/>
+ <location filename="organizercore.cpp" line="331"/>
<source>Unknown error %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="332"/>
+ <location filename="organizercore.cpp" line="334"/>
<source>An error occured trying to write back MO settings to %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="569"/>
- <location filename="organizercore.cpp" line="580"/>
+ <location filename="organizercore.cpp" line="577"/>
+ <location filename="organizercore.cpp" line="588"/>
<source>Download started</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="583"/>
+ <location filename="organizercore.cpp" line="591"/>
<source>Download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="809"/>
- <location filename="organizercore.cpp" line="864"/>
+ <location filename="organizercore.cpp" line="827"/>
+ <location filename="organizercore.cpp" line="882"/>
<source>Installation successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="817"/>
- <location filename="organizercore.cpp" line="874"/>
+ <location filename="organizercore.cpp" line="835"/>
+ <location filename="organizercore.cpp" line="892"/>
<source>Configure Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="818"/>
- <location filename="organizercore.cpp" line="875"/>
+ <location filename="organizercore.cpp" line="836"/>
+ <location filename="organizercore.cpp" line="893"/>
<source>This mod contains ini tweaks. Do you want to configure them now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="828"/>
- <location filename="organizercore.cpp" line="885"/>
+ <location filename="organizercore.cpp" line="846"/>
+ <location filename="organizercore.cpp" line="903"/>
<source>mod &quot;%1&quot; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="831"/>
- <location filename="organizercore.cpp" line="892"/>
+ <location filename="organizercore.cpp" line="849"/>
+ <location filename="organizercore.cpp" line="910"/>
<source>Installation cancelled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="832"/>
- <location filename="organizercore.cpp" line="893"/>
+ <location filename="organizercore.cpp" line="850"/>
+ <location filename="organizercore.cpp" line="911"/>
<source>The mod was not installed completely.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1066"/>
+ <location filename="organizercore.cpp" line="1084"/>
<source>Executable &quot;%1&quot; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1092"/>
+ <location filename="organizercore.cpp" line="1110"/>
<source>Start Steam?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1093"/>
+ <location filename="organizercore.cpp" line="1111"/>
<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="1116"/>
+ <location filename="organizercore.cpp" line="1134"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1164"/>
+ <location filename="organizercore.cpp" line="1182"/>
<source>No profile set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1354"/>
+ <location filename="organizercore.cpp" line="1401"/>
<source>Failed to refresh list of esps: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1420"/>
- <source>Multiple esps activated, please check that they don&apos;t conflict.</source>
+ <location filename="organizercore.cpp" line="1481"/>
+ <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="1487"/>
+ <location filename="organizercore.cpp" line="1548"/>
<source>Download?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1488"/>
+ <location filename="organizercore.cpp" line="1549"/>
<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="1619"/>
+ <location filename="organizercore.cpp" line="1680"/>
<source>failed to update mod list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1626"/>
- <location filename="organizercore.cpp" line="1643"/>
+ <location filename="organizercore.cpp" line="1687"/>
+ <location filename="organizercore.cpp" line="1704"/>
<source>login successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1650"/>
+ <location filename="organizercore.cpp" line="1711"/>
<source>Login failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1651"/>
+ <location filename="organizercore.cpp" line="1712"/>
<source>Login failed, try again?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1660"/>
+ <location filename="organizercore.cpp" line="1721"/>
<source>login failed: %1. Download will not be associated with an account</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1668"/>
+ <location filename="organizercore.cpp" line="1729"/>
<source>login failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1678"/>
+ <location filename="organizercore.cpp" line="1739"/>
<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="1714"/>
- <source>Too many esps and esms enabled</source>
+ <location filename="organizercore.cpp" line="1775"/>
+ <source>Too many esps, esms, and esls enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1717"/>
- <location filename="organizercore.cpp" line="1735"/>
+ <location filename="organizercore.cpp" line="1778"/>
+ <location filename="organizercore.cpp" line="1796"/>
<source>Description missing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1726"/>
+ <location filename="organizercore.cpp" line="1787"/>
<source>The game doesn&apos;t allow more than 255 active plugins (including the official ones) to be loaded. You have to disable some unused plugins or merge some plugins into one. You can find a guide here: &lt;a href=&quot;http://wiki.step-project.com/Guide:Merging_Plugins&quot;&gt;http://wiki.step-project.com/Guide:Merging_Plugins&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1759"/>
+ <location filename="organizercore.cpp" line="1820"/>
<source>failed to save load order: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1831"/>
+ <location filename="organizercore.cpp" line="1892"/>
<source>The designated write target &quot;%1&quot; is not enabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -3830,109 +3843,110 @@ Continue?</source>
<context>
<name>PluginList</name>
<message>
- <location filename="pluginlist.cpp" line="90"/>
+ <location filename="pluginlist.cpp" line="91"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="91"/>
+ <location filename="pluginlist.cpp" line="92"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="92"/>
+ <location filename="pluginlist.cpp" line="93"/>
<source>Mod Index</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="93"/>
+ <location filename="pluginlist.cpp" line="94"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="94"/>
- <location filename="pluginlist.cpp" line="106"/>
+ <location filename="pluginlist.cpp" line="95"/>
+ <location filename="pluginlist.cpp" line="107"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="102"/>
+ <location filename="pluginlist.cpp" line="103"/>
<source>Name of your mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="103"/>
+ <location filename="pluginlist.cpp" line="104"/>
<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="105"/>
- <source>The modindex determins the formids of objects originating from this mods.</source>
+ <location filename="pluginlist.cpp" line="106"/>
+ <source>The modindex determines the formids of objects originating from this mods.</source>
+ <oldsource>The modindex determins the formids of objects originating from this mods.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="159"/>
+ <location filename="pluginlist.cpp" line="182"/>
<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="232"/>
+ <location filename="pluginlist.cpp" line="255"/>
<source>esp not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="239"/>
- <location filename="pluginlist.cpp" line="251"/>
+ <location filename="pluginlist.cpp" line="262"/>
+ <location filename="pluginlist.cpp" line="274"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="239"/>
+ <location filename="pluginlist.cpp" line="262"/>
<source>Really enable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="251"/>
+ <location filename="pluginlist.cpp" line="274"/>
<source>Really disable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="322"/>
+ <location filename="pluginlist.cpp" line="345"/>
<source>The file containing locked plugin indices is broken</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="757"/>
+ <location filename="pluginlist.cpp" line="813"/>
<source>This plugin can&apos;t be disabled (enforced by the game)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="759"/>
+ <location filename="pluginlist.cpp" line="815"/>
<source>&lt;b&gt;Origin&lt;/b&gt;: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="761"/>
+ <location filename="pluginlist.cpp" line="817"/>
<source>Author</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="764"/>
+ <location filename="pluginlist.cpp" line="820"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="767"/>
+ <location filename="pluginlist.cpp" line="823"/>
<source>Missing Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="774"/>
+ <location filename="pluginlist.cpp" line="830"/>
<source>Enabled Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="943"/>
+ <location filename="pluginlist.cpp" line="1001"/>
<source>failed to restore load order for %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4285,15 +4299,15 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="250"/>
- <location filename="categories.cpp" line="285"/>
- <location filename="categories.cpp" line="295"/>
- <location filename="categories.cpp" line="305"/>
+ <location filename="categories.cpp" line="271"/>
+ <location filename="categories.cpp" line="306"/>
+ <location filename="categories.cpp" line="316"/>
+ <location filename="categories.cpp" line="326"/>
<source>invalid index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="316"/>
+ <location filename="categories.cpp" line="337"/>
<source>invalid category id %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4338,7 +4352,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="gameinfoimpl.cpp" line="42"/>
+ <location filename="gameinfoimpl.cpp" line="43"/>
<source>invalid game type %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4438,66 +4452,72 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="loadmechanism.cpp" line="129"/>
- <location filename="loadmechanism.cpp" line="188"/>
+ <location filename="loadmechanism.cpp" line="196"/>
<source>game doesn&apos;t support a script extender</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="148"/>
+ <location filename="loadmechanism.cpp" line="149"/>
+ <source>Failed to delete %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="loadmechanism.cpp" line="156"/>
<source>Failed to deactivate script extender loading</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="168"/>
+ <location filename="loadmechanism.cpp" line="176"/>
<source>Failed to remove %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="170"/>
- <location filename="loadmechanism.cpp" line="264"/>
+ <location filename="loadmechanism.cpp" line="178"/>
+ <location filename="loadmechanism.cpp" line="283"/>
<source>Failed to rename %1 to %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="177"/>
+ <location filename="loadmechanism.cpp" line="185"/>
<source>Failed to deactivate proxy-dll loading</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="220"/>
+ <location filename="loadmechanism.cpp" line="239"/>
<source>Failed to set up script extender loading</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="245"/>
+ <location filename="loadmechanism.cpp" line="264"/>
<source>Failed to delete old proxy-dll %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="248"/>
+ <location filename="loadmechanism.cpp" line="233"/>
<location filename="loadmechanism.cpp" line="267"/>
+ <location filename="loadmechanism.cpp" line="286"/>
<source>Failed to copy %1 to %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="260"/>
+ <location filename="loadmechanism.cpp" line="279"/>
<source>Failed to overwrite %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="loadmechanism.cpp" line="272"/>
+ <location filename="loadmechanism.cpp" line="291"/>
<source>Failed to set up proxy-dll loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cpp" line="93"/>
- <location filename="organizercore.cpp" line="607"/>
+ <location filename="organizercore.cpp" line="615"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="main.cpp" line="94"/>
- <location filename="organizercore.cpp" line="608"/>
+ <location filename="organizercore.cpp" line="616"/>
<source>Failed to create &quot;%1&quot;. Your user account probably lacks permission.</source>
<translation type="unfinished"></translation>
</message>
@@ -4509,7 +4529,8 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="main.cpp" line="150"/>
- <source>ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened</source>
+ <source>ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to modorganizer@gmail.com, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened</source>
+ <oldsource>ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file (%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. Please include a short description of what you were doing when the crash happened</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -4523,75 +4544,75 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="347"/>
+ <location filename="main.cpp" line="351"/>
<source>Could not use configuration settings for game &quot;%1&quot;, path &quot;%2&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="351"/>
- <location filename="main.cpp" line="369"/>
+ <location filename="main.cpp" line="355"/>
+ <location filename="main.cpp" line="373"/>
<source>Please select the game to manage</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="379"/>
+ <location filename="main.cpp" line="383"/>
<source>No game identified in &quot;%1&quot;. The directory is required to contain the game binary and its launcher.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="481"/>
+ <location filename="main.cpp" line="485"/>
<source>Please select the game edition you have (MO can&apos;t start the game correctly if this is set incorrectly!)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="524"/>
+ <location filename="main.cpp" line="528"/>
<source>failed to start application: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="608"/>
+ <location filename="main.cpp" line="612"/>
<location filename="settings.cpp" line="901"/>
<source>Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="609"/>
+ <location filename="main.cpp" line="613"/>
<source>An instance of Mod Organizer is already running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="620"/>
+ <location filename="main.cpp" line="624"/>
<source>Failed to set up instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="829"/>
+ <location filename="mainwindow.cpp" line="837"/>
<source>Please use &quot;Help&quot; from the toolbar to get usage instructions to all elements</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1207"/>
- <location filename="mainwindow.cpp" line="3322"/>
+ <location filename="mainwindow.cpp" line="1223"/>
+ <location filename="mainwindow.cpp" line="3355"/>
<source>&lt;Manage...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1219"/>
+ <location filename="mainwindow.cpp" line="1235"/>
<source>failed to parse profile %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="139"/>
+ <location filename="organizercore.cpp" line="141"/>
<source>Failed to start &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="142"/>
+ <location filename="organizercore.cpp" line="144"/>
<source>Waiting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="143"/>
+ <location filename="organizercore.cpp" line="145"/>
<source>Please press OK once you&apos;re logged into steam.</source>
<translation type="unfinished"></translation>
</message>
@@ -4612,12 +4633,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="398"/>
+ <location filename="pluginlist.cpp" line="421"/>
<source>failed to access %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="412"/>
+ <location filename="pluginlist.cpp" line="435"/>
<source>failed to set file time %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4764,52 +4785,52 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="165"/>
+ <location filename="selfupdater.cpp" line="172"/>
<source>New update available (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="170"/>
+ <location filename="selfupdater.cpp" line="177"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="187"/>
+ <location filename="selfupdater.cpp" line="194"/>
<source>Download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="188"/>
+ <location filename="selfupdater.cpp" line="195"/>
<source>Failed to find correct download, please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="203"/>
+ <location filename="selfupdater.cpp" line="210"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="204"/>
+ <location filename="selfupdater.cpp" line="211"/>
<source>Download in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="295"/>
+ <location filename="selfupdater.cpp" line="302"/>
<source>Download failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="306"/>
+ <location filename="selfupdater.cpp" line="313"/>
<source>Failed to install update: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="329"/>
+ <location filename="selfupdater.cpp" line="336"/>
<source>Failed to start %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="339"/>
+ <location filename="selfupdater.cpp" line="346"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@@ -5318,7 +5339,7 @@ Uncheck this if you want to use Mod Organizer with total conversions (like Nehri
<source>By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods.
However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can&apos;t be resolved correctly.
-If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps and esms) displayed in the right pane are completely unaffected by this feature.</source>
+If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps, esms, and esls) displayed in the right pane are completely unaffected by this feature.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -5624,22 +5645,26 @@ On Windows XP:
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="47"/>
- <source>&lt;img src=&quot;:/MO/gui/emblem_conflict_overwrite&quot; /&gt; indicates that the mod overwrites files that are also available in another mod.</source>
+ <source>&lt;img src=&quot;qrc:///MO/gui/emblem_conflict_overwrite&quot; /&gt; indicates that the mod overwrites files that are also available in another mod.</source>
+ <oldsource>&lt;img src=&quot;:/MO/gui/emblem_conflict_overwrite&quot; /&gt; indicates that the mod overwrites files that are also available in another mod.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="51"/>
- <source>&lt;img src=&quot;:/MO/gui/emblem_conflict_overwritten&quot; /&gt; indicates that the mod is &lt;b&gt;partially&lt;/b&gt; overwritten by another.</source>
+ <source>&lt;img src=&quot;qrc:///MO/gui/emblem_conflict_overwritten&quot; /&gt; indicates that the mod is &lt;b&gt;partially&lt;/b&gt; overwritten by another.</source>
+ <oldsource>&lt;img src=&quot;:/MO/gui/emblem_conflict_overwritten&quot; /&gt; indicates that the mod is &lt;b&gt;partially&lt;/b&gt; overwritten by another.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="55"/>
- <source>&lt;img src=&quot;:/MO/gui/emblem_conflict_mixed&quot; /&gt; indicates that both of the above is true.</source>
+ <source>&lt;img src=&quot;qrc:///MO/gui/emblem_conflict_mixed&quot; /&gt; indicates that both of the above is true.</source>
+ <oldsource>&lt;img src=&quot;:/MO/gui/emblem_conflict_mixed&quot; /&gt; indicates that both of the above is true.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="59"/>
- <source>&lt;img src=&quot;:/MO/gui/emblem_conflict_redundant&quot; /&gt; indicates that the mod is completely overwrtten by another. You could as well disable it.</source>
+ <source>&lt;img src=&quot;qrc:///MO/gui/emblem_conflict_redundant&quot; /&gt; indicates that the mod is completely overwrtten by another. You could as well disable it.</source>
+ <oldsource>&lt;img src=&quot;:/MO/gui/emblem_conflict_redundant&quot; /&gt; indicates that the mod is completely overwrtten by another. You could as well disable it.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -5669,7 +5694,8 @@ On Windows XP:
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="96"/>
- <source>I told you in the &quot;First Steps&quot; tutorial how the esp/esm plugins contain changes to the game world like modifications to the terrain or existing NPCs. Each change like this is stored in a record, hence the name &quot;record conflict&quot;. For example when two mods try to change the same location, only one change can become active.</source>
+ <source>I told you in the &quot;First Steps&quot; tutorial how the esp/esm/esl plugins contain changes to the game world like modifications to the terrain or existing NPCs. Each change like this is stored in a record, hence the name &quot;record conflict&quot;. For example when two mods try to change the same location, only one change can become active.</source>
+ <oldsource>I told you in the &quot;First Steps&quot; tutorial how the esp/esm plugins contain changes to the game world like modifications to the terrain or existing NPCs. Each change like this is stored in a record, hence the name &quot;record conflict&quot;. For example when two mods try to change the same location, only one change can become active.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -5679,7 +5705,8 @@ On Windows XP:
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="108"/>
- <source>Please open the &quot;ESPs&quot;-tab...</source>
+ <source>Please open the &quot;Plugins&quot;-tab...</source>
+ <oldsource>Please open the &quot;ESPs&quot;-tab...</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -5689,17 +5716,20 @@ On Windows XP:
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="122"/>
- <source>Unlike with file conflicts, MO does not provide help on finding conflicts. The good news is, there already is a perfect tool for that called BOSS. BOSS is available on the Nexus and integrates neatly with MO. Basically, if you don&apos;t have BOSS yet, install it once this tutorial is over.</source>
+ <source>Unlike with file conflicts, MO does not provide help on finding conflicts. The good news is, there already is a perfect tool for that called LOOT. LOOT is available on the Nexus and integrates neatly with MO. Basically, if you don&apos;t have LOOT yet, install it once this tutorial is over.</source>
+ <oldsource>Unlike with file conflicts, MO does not provide help on finding conflicts. The good news is, there already is a perfect tool for that called BOSS. BOSS is available on the Nexus and integrates neatly with MO. Basically, if you don&apos;t have BOSS yet, install it once this tutorial is over.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="128"/>
- <source>After you installed BOSS in the default location (follow its instructions), start MO again and BOSS should automatically appear as an Executable...</source>
+ <source>After you installed LOOT in the default location (follow its instructions), start MO again and LOOT should automatically appear as an Executable...</source>
+ <oldsource>After you installed BOSS in the default location (follow its instructions), start MO again and BOSS should automatically appear as an Executable...</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="tutorials/tutorial_conflictresolution_main.js" line="133"/>
- <source>When you run BOSS, it will automatically re-organize plugins for best compatibility (overwriting your manual changes). It will also open a report in your browser that warns about incompatibilities. You should read the report, at least for new mods.</source>
+ <source>When you run LOOT, it will automatically re-organize plugins for best compatibility (overwriting your manual changes). It will also open a report in your browser that warns about incompatibilities. You should read the report, at least for new mods.</source>
+ <oldsource>When you run BOSS, it will automatically re-organize plugins for best compatibility (overwriting your manual changes). It will also open a report in your browser that warns about incompatibilities. You should read the report, at least for new mods.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -5905,112 +5935,108 @@ Please open the &quot;Nexus&quot;-tab</source>
<context>
<name>tutorial_primer_main</name>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="60"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="71"/>
<source>This window shows all the mods that are installed. The column headers can be used for sorting. Only checked mods are active in the current profile.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="61"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="72"/>
<source>Each profile is a separate set of enabled mods and ini settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="62"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="73"/>
<source>The dropdown allows various ways of grouping the mods shown in the mod list.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="63"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="74"/>
<source>Show/hide the category pane.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="64"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="75"/>
<source>Quickly filter the mod list as you type.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="65"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="76"/>
<source>Switch between information views.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="66"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="77"/>
<source>This shows mod categories and some meta categories (in angle-brackets). Select some to filter the mod list. For example select &quot;&lt;Checked&gt;&quot; to show only active mods.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="67"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="78"/>
<source>Customizable list for choosing the program to run.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="68"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="79"/>
<source>When this button is clicked, Mod Organizer creates a virtual directory structure then runs the program selected to the left.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="69"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="80"/>
<source>Will create a shortcut for quick access. The shortcut can be placed in the toolbar at the top, in the Start Menu or on the Windows Desktop.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="70"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="81"/>
<source>Log messages produced by MO. Please note that messages with a light bulb usually don&apos;t require your attention.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="72"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="83"/>
<source>Configure Mod Organizer.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="73"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="84"/>
<source>Reports potential Problems about the current setup.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="74"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="85"/>
<source>Activates if there is an update for MO. Please note that if, for any reason, MO can&apos;t communicate with NMM, this will not work either.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="78"/>
- <source>Plugins (esp/esm files) of the mods in the current profile. They need to be checked to be loaded.</source>
+ <location filename="tutorials/tutorial_primer_main.js" line="89"/>
+ <source>Plugins (esp/esm/esl files) of the mods in the current profile. They need to be checked to be loaded.</source>
+ <oldsource>Plugins (esp/esm files) of the mods in the current profile. They need to be checked to be loaded.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="79"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="90"/>
<source>Automatically sort plugins using the bundled LOOT application.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="80"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="91"/>
<source>Quickly filter plugin list as you type.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="83"/>
- <source>All the asset archives (.bsa files) for all active mods.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="tutorials/tutorial_primer_main.js" line="86"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="97"/>
<source>The directory tree and all files that the program will see.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="89"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="100"/>
<source>Save game browser. Shows all the saves for the current profile and whether or not the current mod-load status is correct.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="92"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="103"/>
<source>Shows the mods that have been downloaded and if they’ve been installed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="tutorials/tutorial_primer_main.js" line="100"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="111"/>
<source>Click to quit</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/organizer_en_US.ts b/src/organizer_en_US.ts
index 075132c2..4e657785 100644
--- a/src/organizer_en_US.ts
+++ b/src/organizer_en_US.ts
@@ -54,7 +54,7 @@
</message>
<message>
<location filename="activatemodsdialog.ui" line="20"/>
- <source>This is a list of esps and esms that were active when the save game was created.</source>
+ <source>This is a list of esps, esms, and esls that were active when the save game was created.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -63,7 +63,7 @@
&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; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This is a list of esps and esms that were active when the save game was created.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This is a list of esps, esms, and esls that were active when the save game was created.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;For each esp, the right column contains the mod (or mods) that can be enabled to make the missing esps/esms available.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;If you hit Ok, all the mods selected in the right columns and all missing esps that have become available will be activated.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
@@ -1467,7 +1467,7 @@ p, li { white-space: pre-wrap; }
&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; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;MS Shell Dlg 2&apos;; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This list contains the esps and esms contained in the active mods. These require their own load order. Use drag&amp;amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.&lt;br /&gt;There is a great tool named &amp;quot;BOSS&amp;quot; to automatically sort these files.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This list contains the esps, esms, and esls contained in the active mods. These require their own load order. Use drag&amp;amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.&lt;br /&gt;There is a great tool named &amp;quot;BOSS&amp;quot; to automatically sort these files.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1993,7 +1993,7 @@ Continue?</source>
</message>
<message>
<location filename="mainwindow.cpp" line="2240"/>
- <source>Too many esps and esms enabled</source>
+ <source>Too many esps, esms, and esls enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2937,12 +2937,12 @@ This function will guess the versioning scheme under the assumption that the ins
</message>
<message>
<location filename="modinfodialog.ui" line="282"/>
- <source>List of esps and esms that can not be loaded by the game.</source>
+ <source>List of esps, esms, and esls that can not be loaded by the game.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="modinfodialog.ui" line="285"/>
- <source>List of esps and esms contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.
+ <source>List of esps, esms, and esls contained in this plugin that currently can not be loaded by the game. They will not even appear in the esp-list in the main MO-window.
They usually contain optional functionality, see the readme.
Most mods do not have optional esps, so chances are good you are looking at an empty list.</source>
@@ -5177,7 +5177,7 @@ Uncheck this if you want to use Mod Organizer with total conversions (like Nehri
<source>By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods.
However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can&apos;t be resolved correctly.
-If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps and esms) displayed in the right pane are completely unaffected by this feature.</source>
+If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps, esms, and esls) displayed in the right pane are completely unaffected by this feature.</source>
<translation type="unfinished"></translation>
</message>
<message>
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index d9ed6ab6..f8a368c9 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -99,22 +99,24 @@ static bool renameFile(const QString &oldName, const QString &newName,
return QFile::rename(oldName, newName);
}
-static std::wstring getProcessName(DWORD processId)
+static std::wstring getProcessName(HANDLE process)
{
- HANDLE process = ::OpenProcess(PROCESS_QUERY_INFORMATION, false, processId);
+ wchar_t buffer[MAX_PATH];
+ wchar_t *fileName = L"unknown";
- wchar_t buffer[MAX_PATH];
- if (::GetProcessImageFileNameW(process, buffer, MAX_PATH) != 0) {
- wchar_t *fileName = wcsrchr(buffer, L'\\');
- if (fileName == nullptr) {
- fileName = buffer;
- } else {
- fileName += 1;
- }
- return fileName;
- } else {
- return std::wstring(L"unknown");
- }
+ if (process == nullptr) return fileName;
+
+ if (::GetProcessImageFileNameW(process, buffer, MAX_PATH) != 0) {
+ fileName = wcsrchr(buffer, L'\\');
+ if (fileName == nullptr) {
+ fileName = buffer;
+ }
+ else {
+ fileName += 1;
+ }
+ }
+
+ return fileName;
}
static void startSteam(QWidget *widget)
@@ -363,6 +365,12 @@ bool OrganizerCore::testForSteam()
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processIDs[i]);
if (process != nullptr) {
+
+ ON_BLOCK_EXIT([&]() {
+ if (process != INVALID_HANDLE_VALUE)
+ ::CloseHandle(process);
+ });
+
HMODULE module;
DWORD ignore;
@@ -1238,75 +1246,102 @@ bool OrganizerCore::waitForApplication(HANDLE handle, LPDWORD exitCode)
bool OrganizerCore::waitForProcessCompletion(HANDLE handle, LPDWORD exitCode)
{
- HANDLE processHandle = handle;
+ DWORD startPID = ::GetProcessId(handle);
- static const DWORD maxCount = 5;
- size_t numProcesses = maxCount;
- LPDWORD processes = new DWORD[maxCount];
+ static const DWORD maxCount = 5;
+ size_t numProcesses = maxCount;
+ LPDWORD processes = new DWORD[maxCount];
+ std::map<DWORD, HANDLE> handles;
- DWORD currentProcess = 0UL;
- bool tryAgain = true;
+ bool tryAgain = true;
+ DWORD moProcess = -1;
- DWORD res;
- // Wait for a an event on the handle, a key press, mouse click or timeout
- //TODO: Remove MOBase::isOneOf from this query as it was always returning true.
- while (
- res = ::MsgWaitForMultipleObjects(1, &handle, false, 500,
- QS_KEY | QS_MOUSE),
- ((res != WAIT_FAILED) || (res != WAIT_OBJECT_0)) &&
- ((m_UserInterface == nullptr) || !m_UserInterface->unlockClicked())) {
+ DWORD res;
+ // Wait for a an event on the handle, a key press, mouse click or timeout
+ while (
+ res = ::MsgWaitForMultipleObjects(1, &handle, false, 500,
+ QS_KEY | QS_MOUSEBUTTON),
+ ((m_UserInterface == nullptr) || !m_UserInterface->unlockClicked())) {
- if (!::GetVFSProcessList(&numProcesses, processes)) {
- break;
- }
+ if (!::GetVFSProcessList(&numProcesses, processes)) {
+ break;
+ }
- bool found = false;
- size_t count =
- std::min<size_t>(static_cast<size_t>(maxCount), numProcesses);
- for (size_t i = 0; i < count; ++i) {
- std::wstring processName = getProcessName(processes[i]);
- if (!boost::starts_with(processName, L"ModOrganizer.exe")) {
- currentProcess = processes[i];
- m_UserInterface->setProcessName(QString::fromStdWString(processName));
- processHandle = ::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, currentProcess);
- found = true;
- }
- }
- if (!found) {
- // it's possible the previous process has deregistered before
- // the new one has registered, so we should try one more time
- // with a little delay
- if (tryAgain) {
- tryAgain = false;
- QThread::msleep(500);
- continue;
- } else {
- break;
- }
- } else {
- tryAgain = true;
- }
+ // Get USvFS processes, build a handle map, and allow to continue if invalid PIDs are supplied
+ bool found = false;
+ size_t count =
+ std::min<size_t>(static_cast<size_t>(maxCount), numProcesses);
+ for (size_t i = 0; i < count; ++i) {
+ DWORD currentProcess = processes[i];
+ if (currentProcess != moProcess && handles.count(currentProcess) == 0) {
+ HANDLE currentHandle = ::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, currentProcess);
+ std::wstring processName = getProcessName(currentHandle);
+ if (!boost::starts_with(processName, L"ModOrganizer.exe")) {
+ found = true;
+ if (currentHandle == nullptr || currentHandle == INVALID_HANDLE_VALUE) continue;
+ handles.insert(std::pair<DWORD, HANDLE>(currentProcess, currentHandle));
+ }
+ else
+ {
+ moProcess = processes[i];
+ ::CloseHandle(currentHandle);
+ }
+ }
+ }
- // keep processing events so the app doesn't appear dead
- QCoreApplication::processEvents();
- }
+ // Clean up tracked handles
+ for (std::map<DWORD, HANDLE>::iterator checkHandle = handles.begin(); checkHandle != handles.end(); ++checkHandle) {
+ if (checkHandle->second != nullptr && checkHandle->second != INVALID_HANDLE_VALUE) {
+ DWORD processExit;
+ BOOL codeCheck = ::GetExitCodeProcess(checkHandle->second, &processExit);
+ if (!codeCheck || processExit != STILL_ACTIVE) {
+ if (!codeCheck) qDebug() << "Checking the process failed: Error Code " << ::GetLastError();
+ ::CloseHandle(checkHandle->second);
+ checkHandle = handles.erase(checkHandle);
+ }
+ }
+ }
- if (exitCode != nullptr) {
- //This is actually wrong if the process we started finished before we
- //got the event and so we end up with a job handle.
- if (! ::GetExitCodeProcess(processHandle, exitCode))
- {
- DWORD error = ::GetLastError();
- qDebug() << "Failed to get process exit code: Error " << error;
- }
- }
+ // Update the lock process name with the name of the lowest active PID - though this may not actually be the main process
+ if (handles.size() > 0)
+ m_UserInterface->setProcessName(QString::fromStdWString(getProcessName(handles.begin()->second)));
- ::CloseHandle(processHandle);
- if (handle != processHandle) {
- ::CloseHandle(handle);
- }
+ // If the main wait process dies, we need a backup wait process until the subprocesses close
+ if ((res == WAIT_FAILED) || (res == WAIT_OBJECT_0)) {
+ if (handles.size() > 0) {
+ // By the time we get here, the main wait function should always immediately continue
+ // Passing in a handle doesn't seem to work for subprocesses
+ ::MsgWaitForMultipleObjects(0, NULL, FALSE, 500, QS_KEY | QS_MOUSEBUTTON);
+ }
+ }
- return res == WAIT_OBJECT_0;
+ // Give the process list a short time to populate
+ // Required for initial USVFS boot and process switching
+ if (handles.size() == 0 && !found) {
+ if (tryAgain) {
+ tryAgain = false;
+ QThread::msleep(500);
+ continue;
+ }
+ else {
+ break;
+ }
+ }
+ else {
+ tryAgain = true;
+ }
+
+ // keep processing events so the app doesn't appear dead
+ QCoreApplication::processEvents();
+ }
+
+ //Cleanup
+ if (handle != INVALID_HANDLE_VALUE) {
+ ::CloseHandle(handle);
+ }
+ delete[] processes;
+
+ return res == WAIT_OBJECT_0;
}
bool OrganizerCore::onAboutToRun(
@@ -1413,6 +1448,20 @@ void OrganizerCore::updateModActiveState(int index, bool active)
m_PluginList.enableESP(esm, active);
}
int enabled = 0;
+ for (const QString &esl :
+ dir.entryList(QStringList() << "*.esl", QDir::Files)) {
+ const FileEntry::Ptr file = m_DirectoryStructure->findFile(ToWString(esl));
+ if (file.get() == nullptr) {
+ qWarning("failed to activate %s", qPrintable(esl));
+ continue;
+ }
+
+ if (active != m_PluginList.isEnabled(esl)
+ && file->getAlternatives().empty()) {
+ m_PluginList.enableESP(esl, active);
+ ++enabled;
+ }
+ }
QStringList esps = dir.entryList(QStringList() << "*.esp", QDir::Files);
for (const QString &esp : esps) {
const FileEntry::Ptr file = m_DirectoryStructure->findFile(ToWString(esp));
@@ -1429,7 +1478,7 @@ void OrganizerCore::updateModActiveState(int index, bool active)
}
if (active && (enabled > 1)) {
MessageDialog::showMessage(
- tr("Multiple esps activated, please check that they don't conflict."),
+ tr("Multiple esps/esls activated, please check that they don't conflict."),
qApp->activeWindow());
}
m_PluginList.refreshLoadOrder();
@@ -1645,8 +1694,8 @@ void OrganizerCore::loginSuccessful(bool necessary)
task();
}
- m_PostLoginTasks.clear();
- NexusInterface::instance()->loginCompleted();
+ m_PostLoginTasks.clear();
+ NexusInterface::instance()->loginCompleted();
}
void OrganizerCore::loginSuccessfulUpdate(bool necessary)
@@ -1723,7 +1772,7 @@ QString OrganizerCore::shortDescription(unsigned int key) const
{
switch (key) {
case PROBLEM_TOOMANYPLUGINS: {
- return tr("Too many esps and esms enabled");
+ return tr("Too many esps, esms, and esls enabled");
} break;
default: {
return tr("Description missing");
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp
index a4d8561c..61d33fe9 100644
--- a/src/pluginlist.cpp
+++ b/src/pluginlist.cpp
@@ -21,6 +21,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "settings.h"
#include "scopeguard.h"
#include "modinfo.h"
+#include "viewmarkingscrollbar.h"
#include <utility.h>
#include <iplugingame.h>
#include <espfile.h>
@@ -102,11 +103,40 @@ QString PluginList::getColumnToolTip(int column)
case COL_NAME: return tr("Name of your mods");
case COL_PRIORITY: return tr("Load priority of your mod. The higher, the more \"important\" it is and thus "
"overwrites data from plugins with lower priority.");
- case COL_MODINDEX: return tr("The modindex determins the formids of objects originating from this mods.");
+ case COL_MODINDEX: return tr("The modindex determines the formids of objects originating from this mods.");
default: return tr("unknown");
}
}
+void PluginList::highlightPlugins(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry, const Profile &profile)
+{
+ for (auto &esp : m_ESPs) {
+ esp.m_ModSelected = false;
+ }
+ for (QModelIndex idx : selected.indexes()) {
+ ModInfo::Ptr selectedMod = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
+ if (!selectedMod.isNull() && profile.modEnabled(idx.data(Qt::UserRole + 1).toInt())) {
+ QDir dir(selectedMod->absolutePath());
+ QStringList plugins = dir.entryList(QStringList() << "*.esp" << "*.esm" << "*.esl");
+ MOShared::FilesOrigin origin = directoryEntry.getOriginByName(selectedMod->internalName().toStdWString());
+ if (plugins.size() > 0) {
+ for (auto plugin : plugins) {
+ MOShared::FileEntry::Ptr file = directoryEntry.findFile(plugin.toStdWString());
+ if (file->getOrigin() != origin.getID()) {
+ const std::vector<int> alternatives = file->getAlternatives();
+ if (std::find(alternatives.begin(), alternatives.end(), origin.getID()) == alternatives.end())
+ continue;
+ }
+ std::map<QString, int>::iterator iter = m_ESPsByName.find(plugin.toLower());
+ if (iter != m_ESPsByName.end()) {
+ m_ESPs[iter->second].m_ModSelected = true;
+ }
+ }
+ }
+ }
+ }
+ emit dataChanged(this->index(0, 0), this->index(m_ESPs.size() - 1, this->columnCount() - 1));
+}
void PluginList::refresh(const QString &profileName
, const DirectoryEntry &baseDirectory
@@ -135,7 +165,7 @@ void PluginList::refresh(const QString &profileName
QString extension = filename.right(3).toLower();
- if ((extension == "esp") || (extension == "esm")) {
+ if ((extension == "esp") || (extension == "esm") || (extension == "esl")) {
bool forceEnabled = Settings::instance().forceEnableCoreFiles() &&
std::find(primaryPlugins.begin(), primaryPlugins.end(), filename.toLower()) != primaryPlugins.end();
@@ -593,6 +623,16 @@ bool PluginList::isMaster(const QString &name) const
}
}
+bool PluginList::isLight(const QString &name) const
+{
+ auto iter = m_ESPsByName.find(name.toLower());
+ if (iter == m_ESPsByName.end()) {
+ return false;
+ } else {
+ return m_ESPs[iter->second].m_IsLight;
+ }
+}
+
QStringList PluginList::masters(const QString &name) const
{
auto iter = m_ESPsByName.find(name.toLower());
@@ -676,18 +716,18 @@ void PluginList::testMasters()
// emit layoutAboutToBeChanged();
std::set<QString> enabledMasters;
- for (auto iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) {
- if (iter->m_Enabled) {
- enabledMasters.insert(iter->m_Name.toLower());
+ for (const auto& iter: m_ESPs) {
+ if (iter.m_Enabled) {
+ enabledMasters.insert(iter.m_Name.toLower());
}
}
- for (auto iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) {
- iter->m_MasterUnset.clear();
- if (iter->m_Enabled) {
- for (auto master = iter->m_Masters.begin(); master != iter->m_Masters.end(); ++master) {
- if (enabledMasters.find(master->toLower()) == enabledMasters.end()) {
- iter->m_MasterUnset.insert(*master);
+ for (auto& iter: m_ESPs) {
+ iter.m_MasterUnset.clear();
+ if (iter.m_Enabled) {
+ for (const auto& master: iter.m_Masters) {
+ if (enabledMasters.find(master.toLower()) == enabledMasters.end()) {
+ iter.m_MasterUnset.insert(master);
}
}
}
@@ -703,7 +743,7 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const
if ((role == Qt::DisplayRole)
|| (role == Qt::EditRole)) {
switch (modelIndex.column()) {
- case COL_NAME: {
+ case COL_NAME: {
return m_ESPs[index].m_Name;
} break;
case COL_PRIORITY: {
@@ -713,7 +753,21 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const
if (m_ESPs[index].m_LoadOrder == -1) {
return QString();
} else {
- return QString("%1").arg(m_ESPs[index].m_LoadOrder, 2, 16, QChar('0')).toUpper();
+ int numESLs = 0;
+ std::vector<ESPInfo> sortESPs(m_ESPs);
+ std::sort(sortESPs.begin(), sortESPs.end());
+ for (auto sortedESP: sortESPs) {
+ if (sortedESP.m_LoadOrder == m_ESPs[index].m_LoadOrder)
+ break;
+ if (sortedESP.m_IsLight && sortedESP.m_LoadOrder != -1)
+ ++numESLs;
+ }
+ if (m_ESPs[index].m_IsLight) {
+ int ESLpos = 254 + ((numESLs+1) / 4096);
+ return QString("%1:%2").arg(ESLpos, 2, 16, QChar('0')).arg((numESLs)%4096).toUpper();
+ } else {
+ return QString("%1").arg(m_ESPs[index].m_LoadOrder - numESLs, 2, 16, QChar('0')).toUpper();
+ }
}
} break;
default: {
@@ -728,14 +782,23 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const
}
} else if (role == Qt::ForegroundRole) {
if ((modelIndex.column() == COL_NAME) &&
- m_ESPs[index].m_ForceEnabled) {
+ m_ESPs[index].m_ForceEnabled) {
return QBrush(Qt::gray);
}
+ } else if (role == Qt::BackgroundRole
+ || (role == ViewMarkingScrollBar::DEFAULT_ROLE)) {
+ if (m_ESPs[index].m_ModSelected) {
+ return QColor(0, 0, 255, 32);
+ } else {
+ return QVariant();
+ }
} else if (role == Qt::FontRole) {
QFont result;
if (m_ESPs[index].m_IsMaster) {
result.setItalic(true);
result.setWeight(QFont::Bold);
+ } else if (m_ESPs[index].m_IsLight) {
+ result.setItalic(true);
}
return result;
} else if (role == Qt::TextAlignmentRole) {
@@ -895,16 +958,18 @@ void PluginList::setPluginPriority(int row, int &newPriority)
{
int newPriorityTemp = newPriority;
- if (!m_ESPs[row].m_IsMaster) {
+ if (!m_ESPs[row].m_IsMaster && !m_ESPs[row].m_IsLight) {
// don't allow esps to be moved above esms
while ((newPriorityTemp < static_cast<int>(m_ESPsByPriority.size() - 1)) &&
- m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster) {
+ (m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster ||
+ m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsLight)) {
++newPriorityTemp;
}
} else {
// don't allow esms to be moved below esps
while ((newPriorityTemp > 0) &&
- !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster) {
+ !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsMaster &&
+ !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).m_IsLight) {
--newPriorityTemp;
}
// also don't allow "regular" esms to be moved above primary plugins
@@ -1106,11 +1171,14 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled,
const QString &originName, const QString &fullPath,
bool hasIni)
: m_Name(name), m_FullPath(fullPath), m_Enabled(enabled), m_ForceEnabled(enabled),
- m_Priority(0), m_LoadOrder(-1), m_OriginName(originName), m_HasIni(hasIni)
+ m_Priority(0), m_LoadOrder(-1), m_OriginName(originName), m_HasIni(hasIni), m_ModSelected(false)
{
try {
ESP::File file(ToWString(fullPath));
m_IsMaster = file.isMaster();
+ auto extension = name.right(3).toLower();
+ m_IsLight = (extension == "esl"); // The .isLight() header is apparently meaningless.
+
m_Author = QString::fromLatin1(file.author().c_str());
m_Description = QString::fromLatin1(file.description().c_str());
std::set<std::string> masters = file.masters();
@@ -1118,8 +1186,9 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled,
m_Masters.insert(QString(iter->c_str()));
}
} catch (const std::exception &e) {
- qCritical("failed to parse esp file %s: %s", qPrintable(fullPath), e.what());
+ qCritical("failed to parse plugin file %s: %s", qPrintable(fullPath), e.what());
m_IsMaster = false;
+ m_IsLight = false;
}
}
diff --git a/src/pluginlist.h b/src/pluginlist.h
index 78623cae..8d1a5491 100644
--- a/src/pluginlist.h
+++ b/src/pluginlist.h
@@ -22,6 +22,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <directoryentry.h>
#include <ipluginlist.h>
+#include "profile.h"
namespace MOBase { class IPluginGame; }
#include <QString>
@@ -200,6 +201,8 @@ public:
static QString getColumnName(int column);
static QString getColumnToolTip(int column);
+ void highlightPlugins(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry, const Profile &profile);
+
void refreshLoadOrder();
void disconnectSlots();
@@ -213,6 +216,7 @@ public:
virtual int loadOrder(const QString &name) const;
virtual bool onRefreshed(const std::function<void()> &callback);
virtual bool isMaster(const QString &name) const;
+ virtual bool isLight(const QString &name) const;
virtual QStringList masters(const QString &name) const;
virtual QString origin(const QString &name) const;
virtual void setLoadOrder(const QStringList &pluginList) override;
@@ -275,11 +279,17 @@ private:
FILETIME m_Time;
QString m_OriginName;
bool m_IsMaster;
+ bool m_IsLight;
+ bool m_ModSelected;
QString m_Author;
QString m_Description;
bool m_HasIni;
std::set<QString> m_Masters;
mutable std::set<QString> m_MasterUnset;
+ bool operator < (const ESPInfo& str) const
+ {
+ return (m_LoadOrder < str.m_LoadOrder);
+ }
};
struct AdditionalInfo {
diff --git a/src/pluginlistview.cpp b/src/pluginlistview.cpp
new file mode 100644
index 00000000..0fcf8183
--- /dev/null
+++ b/src/pluginlistview.cpp
@@ -0,0 +1,58 @@
+#include "pluginlistview.h"
+#include <QUrl>
+#include <QMimeData>
+#include <QProxyStyle>
+
+
+class PluginListViewStyle : public QProxyStyle {
+public:
+ PluginListViewStyle(QStyle *style, int indentation);
+
+ void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
+ QPainter *painter, const QWidget *widget = 0) const;
+private:
+ int m_Indentation;
+};
+
+PluginListViewStyle::PluginListViewStyle(QStyle *style, int indentation)
+ : QProxyStyle(style), m_Indentation(indentation)
+{
+}
+
+void PluginListViewStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
+ QPainter *painter, const QWidget *widget) const
+{
+ if (element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull()) {
+ QStyleOption opt(*option);
+ opt.rect.setLeft(m_Indentation);
+ if (widget) {
+ opt.rect.setRight(widget->width() - 5); // 5 is an arbitrary value that seems to work ok
+ }
+ QProxyStyle::drawPrimitive(element, &opt, painter, widget);
+ }
+ else {
+ QProxyStyle::drawPrimitive(element, option, painter, widget);
+ }
+}
+
+PluginListView::PluginListView(QWidget *parent)
+ : QTreeView(parent)
+ , m_Scrollbar(new ViewMarkingScrollBar(this->model(), this))
+{
+ setVerticalScrollBar(m_Scrollbar);
+}
+
+void PluginListView::dragEnterEvent(QDragEnterEvent *event)
+{
+ emit dropModeUpdate(event->mimeData()->hasUrls());
+
+ QTreeView::dragEnterEvent(event);
+}
+
+void PluginListView::setModel(QAbstractItemModel *model)
+{
+ QTreeView::setModel(model);
+ setVerticalScrollBar(new ViewMarkingScrollBar(model, this));
+}
+
+#pragma once
diff --git a/src/pluginlistview.h b/src/pluginlistview.h
new file mode 100644
index 00000000..bdd4ee61
--- /dev/null
+++ b/src/pluginlistview.h
@@ -0,0 +1,24 @@
+#ifndef PLUGINLISTVIEW_H
+#define PLUGINLISTVIEW_H
+
+#include <QTreeView>
+#include <QDragEnterEvent>
+#include "viewmarkingscrollbar.h"
+
+class PluginListView : public QTreeView
+{
+ Q_OBJECT
+public:
+ explicit PluginListView(QWidget *parent = 0);
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void setModel(QAbstractItemModel *model);
+signals:
+ void dropModeUpdate(bool dropOnRows);
+
+ public slots:
+private:
+
+ ViewMarkingScrollBar *m_Scrollbar;
+};
+
+#endif // PLUGINLISTVIEW_H
diff --git a/src/resources.qrc b/src/resources.qrc
index d357801c..e88eda06 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -82,6 +82,7 @@
<file alias="mesh">resources/contents/breastplate.png</file>
<file alias="string">resources/contents/conversation.png</file>
<file alias="bsa">resources/contents/locked-chest.png</file>
+ <file alias="menu">resources/contents/config.png</file>
</qresource>
<qresource prefix="/qt/etc">
<file>qt.conf</file>
diff --git a/src/resources/contents/config.png b/src/resources/contents/config.png
new file mode 100644
index 00000000..3896d885
--- /dev/null
+++ b/src/resources/contents/config.png
Binary files differ
diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp
index d78b020b..273e9b45 100644
--- a/src/selfupdater.cpp
+++ b/src/selfupdater.cpp
@@ -124,6 +124,7 @@ void SelfUpdater::testForUpdate()
{
// TODO: if prereleases are disabled we could just request the latest release
// directly
+ try {
m_GitHub.releases(GitHub::Repository("LePresidente", "modorganizer"),
[this](const QJsonArray &releases) {
QJsonObject newest;
@@ -155,6 +156,11 @@ void SelfUpdater::testForUpdate()
}
}
});
+ }
+ //Catch all is bad by design, should be improved
+ catch (...) {
+ qDebug("Unable to connect to github.com to check version");
+ }
}
void SelfUpdater::startUpdate()
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index a38530da..f5e37ea6 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -970,7 +970,7 @@ Uncheck this if you want to use Mod Organizer with total conversions (like Nehri
<string>By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods.
However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly.
-If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps and esms) displayed in the right pane are completely unaffected by this feature.</string>
+If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps, esms, and esls) displayed in the right pane are completely unaffected by this feature.</string>
</property>
<property name="text">
<string>Display mods installed outside MO</string>
diff --git a/src/shared/appconfig.inc b/src/shared/appconfig.inc
index ac6c210f..e98757d3 100644
--- a/src/shared/appconfig.inc
+++ b/src/shared/appconfig.inc
@@ -14,6 +14,8 @@ APPPARAM(std::wstring, iniFileName, L"ModOrganizer.ini")
APPPARAM(std::wstring, proxyDLLTarget, L"steam_api.dll")
APPPARAM(std::wstring, proxyDLLOrig, L"steam_api_orig.dll") // needs to be identical to the value used in proxydll-project
APPPARAM(std::wstring, proxyDLLSource, L"proxy.dll")
+APPPARAM(std::wstring, vfs32DLLName, L"usvfs_x86.dll")
+APPPARAM(std::wstring, vfs64DLLName, L"usvfs_x64.dll")
APPPARAM(const wchar_t*, localSavePlaceholder, L"__MOProfileSave__\\")
APPPARAM(std::wstring, firstStepsTutorial, L"tutorial_firststeps_main.js")
diff --git a/src/tutorials/Highlight.qml b/src/tutorials/Highlight.qml
index 55474c91..b6fb7676 100644
--- a/src/tutorials/Highlight.qml
+++ b/src/tutorials/Highlight.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
Rectangle {
radius: 10
diff --git a/src/tutorials/Tooltip.qml b/src/tutorials/Tooltip.qml
index 6424d9ab..cca71efa 100644
--- a/src/tutorials/Tooltip.qml
+++ b/src/tutorials/Tooltip.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
Rectangle {
diff --git a/src/tutorials/TooltipArea.qml b/src/tutorials/TooltipArea.qml
index 48a50f76..8d404beb 100644
--- a/src/tutorials/TooltipArea.qml
+++ b/src/tutorials/TooltipArea.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
Rectangle {
radius: 2
@@ -17,7 +17,7 @@ Rectangle {
anchors.fill: parent
hoverEnabled: true
- onMousePositionChanged: {
+ onPositionChanged: {
if (parent.parent.width - (parent.x + mouseX) < tooltip.width + 50) {
tooltip.x = parent.x + mouseX - 15 - tooltip.width
} else {
diff --git a/src/tutorials/TutorialDescription.qml b/src/tutorials/TutorialDescription.qml
index 498573d2..4079b70d 100644
--- a/src/tutorials/TutorialDescription.qml
+++ b/src/tutorials/TutorialDescription.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
// rectangle for description texts
Rectangle {
diff --git a/src/tutorials/TutorialOverlay.qml b/src/tutorials/TutorialOverlay.qml
index 15fe9603..47e5065d 100644
--- a/src/tutorials/TutorialOverlay.qml
+++ b/src/tutorials/TutorialOverlay.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
import "tutorials.js" as Logic
Rectangle {
diff --git a/src/tutorials/tutorial_conflictresolution_main.js b/src/tutorials/tutorial_conflictresolution_main.js
index 3a7160c6..a60a5c8d 100644
--- a/src/tutorials/tutorial_conflictresolution_main.js
+++ b/src/tutorials/tutorial_conflictresolution_main.js
@@ -44,19 +44,19 @@ function getTutorialSteps() {
},
function() {
unhighlight()
- tutorial.text = qsTr("<img src=\":/MO/gui/emblem_conflict_overwrite\" /> indicates that the mod overwrites files that are also available in another mod.")
+ tutorial.text = qsTr("<img src=\"qrc:///MO/gui/emblem_conflict_overwrite\" /> indicates that the mod overwrites files that are also available in another mod.")
waitForClick()
},
function() {
- tutorial.text = qsTr("<img src=\":/MO/gui/emblem_conflict_overwritten\" /> indicates that the mod is <b>partially</b> overwritten by another.")
+ tutorial.text = qsTr("<img src=\"qrc:///MO/gui/emblem_conflict_overwritten\" /> indicates that the mod is <b>partially</b> overwritten by another.")
waitForClick()
},
function() {
- tutorial.text = qsTr("<img src=\":/MO/gui/emblem_conflict_mixed\" /> indicates that both of the above is true.")
+ tutorial.text = qsTr("<img src=\"qrc:///MO/gui/emblem_conflict_mixed\" /> indicates that both of the above is true.")
waitForClick()
},
function() {
- tutorial.text = qsTr("<img src=\":/MO/gui/emblem_conflict_redundant\" /> indicates that the mod is completely overwrtten by another. You could as well disable it.");
+ tutorial.text = qsTr("<img src=\"qrc:///MO/gui/emblem_conflict_redundant\" /> indicates that the mod is completely overwrtten by another. You could as well disable it.");
waitForClick()
},
function() {
@@ -65,7 +65,7 @@ function getTutorialSteps() {
},
function() {
tutorial.text = qsTr("Option A: Switch to the \"Data\"-tab if necessary")
- if (!tutorialControl.waitForTabOpen("tabWidget", 2)) {
+ if (!tutorialControl.waitForTabOpen("tabWidget", 1)) {
highlightItem("tabWidget", false)
waitForClick()
} else {
@@ -93,7 +93,7 @@ function getTutorialSteps() {
waitForClick()
},
function() {
- tutorial.text = qsTr("I told you in the \"First Steps\" tutorial how the esp/esm plugins contain changes to the game world "
+ tutorial.text = qsTr("I told you in the \"First Steps\" tutorial how the esp/esm/esl plugins contain changes to the game world "
+"like modifications to the terrain or existing NPCs. Each change like this is stored in a record, hence the "
+"name \"record conflict\". For example when two mods try to change the same location, only one change can become active.")
waitForClick()
@@ -105,7 +105,7 @@ function getTutorialSteps() {
waitForClick()
},
function() {
- tutorial.text = qsTr("Please open the \"ESPs\"-tab...")
+ tutorial.text = qsTr("Please open the \"Plugins\"-tab...")
highlightItem("tabWidget", true)
if (!tutorialControl.waitForTabOpen("tabWidget", 0)) {
nextStep()
@@ -120,17 +120,17 @@ function getTutorialSteps() {
function() {
unhighlight()
tutorial.text = qsTr("Unlike with file conflicts, MO does not provide help on finding conflicts. The good news is, there "
- +"already is a perfect tool for that called BOSS. BOSS is available on the Nexus and integrates "
- +"neatly with MO. Basically, if you don't have BOSS yet, install it once this tutorial is over.")
+ +"already is a perfect tool for that called LOOT. LOOT is available on the Nexus and integrates "
+ +"neatly with MO. Basically, if you don't have LOOT yet, install it once this tutorial is over.")
waitForClick()
},
function() {
- tutorial.text = qsTr("After you installed BOSS in the default location (follow its instructions), start MO again and BOSS should automatically appear as an Executable...")
+ tutorial.text = qsTr("After you installed LOOT in the default location (follow its instructions), start MO again and LOOT should automatically appear as an Executable...")
highlightItem("startGroup", false)
waitForClick()
},
function() {
- tutorial.text = qsTr("When you run BOSS, it will automatically re-organize plugins for best compatibility (overwriting your manual changes). "
+ tutorial.text = qsTr("When you run LOOT, it will automatically re-organize plugins for best compatibility (overwriting your manual changes). "
+"It will also open a report in your browser that warns about incompatibilities. You should read the report, at least "
+"for new mods.")
waitForClick()
diff --git a/src/tutorials/tutorial_firststeps_settings.js b/src/tutorials/tutorial_firststeps_settings.js
index dd5c6e9c..1dd77d2e 100644
--- a/src/tutorials/tutorial_firststeps_settings.js
+++ b/src/tutorials/tutorial_firststeps_settings.js
@@ -4,7 +4,7 @@ function getTutorialSteps()
function() {
highlightItem("tabWidget", true)
tutorial.text = qsTr("You can use your regular browser to download from Nexus.\nPlease open the \"Nexus\"-tab")
- tutorialControl.waitForTabOpen("tabWidget", 1)
+ tutorialControl.waitForTabOpen("tabWidget", 2)
},
function() {
diff --git a/src/tutorials/tutorial_primer_main.js b/src/tutorials/tutorial_primer_main.js
index 12df2c86..5d5597c1 100644
--- a/src/tutorials/tutorial_primer_main.js
+++ b/src/tutorials/tutorial_primer_main.js
@@ -4,29 +4,40 @@
var tooltips = []
function tooltipWidget(widgetName, explanation, maxheight, clickable) {
- var rect = tutorialControl.getRect(widgetName)
- var component = Qt.createComponent("TooltipArea.qml")
- if (component.status === Component.Error) {
- console.log("b" + component.errorString())
- }
- if (typeof clickable === 'undefined') {
- clickable = false
- }
- if ((typeof maxheight === 'undefined') || maxheight === 0) {
- maxheight = rect.height
- }
+ var component = Qt.createComponent("TooltipArea.qml")
+ if (component.status === Component.Ready)
+ finishCreation(component, widgetName, explanation, maxheight, clickable);
+ else
+ component.statusChanged.connect(function() {
+ finishCreation(component, widgetName, explanation, maxheight, clickable);
+ });
+}
- var obj = component.createObject(tutToplevel,
- { "x" : rect.x,
- "y" : rect.y,
- "width" : rect.width,
- "height" : maxheight
- })
- obj.tooltipText = explanation
- obj.clickable = clickable
- obj.visible = true
+function finishCreation(component, widgetName, explanation, maxheight, clickable) {
+ if (component.status === Component.Ready) {
+ var rect = tutorialControl.getRect(widgetName)
+ if (typeof clickable === 'undefined') {
+ clickable = false
+ }
+ if ((typeof maxheight === 'undefined') || maxheight === 0) {
+ maxheight = rect.height
+ }
- tooltips.push(obj)
+ var obj = component.createObject(tutToplevel,
+ {
+ "x": rect.x,
+ "y": rect.y,
+ "width": rect.width,
+ "height": maxheight
+ })
+ obj.tooltipText = explanation
+ obj.clickable = clickable
+ obj.visible = true
+
+ tooltips.push(obj)
+ } else if (component.status === Component.Error) {
+ console.log("Error loading component: " + component.errorString())
+ }
}
function tooltipAction(actionName, explanation, maxheight, clickable) {
@@ -75,20 +86,20 @@ function setupTooptips() {
switch (manager.findControl("tabWidget").currentIndex) {
case 0:
- tooltipWidget("espList", qsTr("Plugins (esp/esm files) of the mods in the current profile. They need to be checked to be loaded."))
+ tooltipWidget("espList", qsTr("Plugins (esp/esm/esl files) of the mods in the current profile. They need to be checked to be loaded."))
tooltipWidget("bossButton", qsTr("Automatically sort plugins using the bundled LOOT application."))
tooltipWidget("espFilterEdit", qsTr("Quickly filter plugin list as you type."))
break
+ // case 1:
+ // tooltipWidget("bsaList", qsTr("All the asset archives (.bsa files) for all active mods."))
+ // break
case 1:
- tooltipWidget("bsaList", qsTr("All the asset archives (.bsa files) for all active mods."))
- break
- case 2:
tooltipWidget("dataTree", qsTr("The directory tree and all files that the program will see."))
break
- case 3:
+ case 2:
tooltipWidget("savegameList", qsTr("Save game browser. Shows all the saves for the current profile and whether or not the current mod-load status is correct."))
break
- case 4:
+ case 3:
tooltipWidget("downloadView", qsTr("Shows the mods that have been downloaded and if they’ve been installed."))
break
}
diff --git a/src/tutorials/tutorials_installdialog.qml b/src/tutorials/tutorials_installdialog.qml
index 33f0a660..9cc21097 100644
--- a/src/tutorials/tutorials_installdialog.qml
+++ b/src/tutorials/tutorials_installdialog.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
TutorialOverlay {
id: tutorial
diff --git a/src/tutorials/tutorials_mainwindow.qml b/src/tutorials/tutorials_mainwindow.qml
index 0012b686..0d660a29 100644
--- a/src/tutorials/tutorials_mainwindow.qml
+++ b/src/tutorials/tutorials_mainwindow.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
TutorialOverlay {
id: tutorial
diff --git a/src/tutorials/tutorials_modinfodialog.qml b/src/tutorials/tutorials_modinfodialog.qml
index e9a56cb3..74f6adfa 100644
--- a/src/tutorials/tutorials_modinfodialog.qml
+++ b/src/tutorials/tutorials_modinfodialog.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
TutorialOverlay {
id: tutorial
diff --git a/src/tutorials/tutorials_nexusdialog.qml b/src/tutorials/tutorials_nexusdialog.qml
index 6a7af6d6..9fb9aafd 100644
--- a/src/tutorials/tutorials_nexusdialog.qml
+++ b/src/tutorials/tutorials_nexusdialog.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
TutorialOverlay {
id: tutorial
diff --git a/src/tutorials/tutorials_settingsdialog.qml b/src/tutorials/tutorials_settingsdialog.qml
index e9a56cb3..74f6adfa 100644
--- a/src/tutorials/tutorials_settingsdialog.qml
+++ b/src/tutorials/tutorials_settingsdialog.qml
@@ -1,4 +1,4 @@
-import QtQuick 1.1
+import QtQuick 2.7
TutorialOverlay {
id: tutorial
diff --git a/src/version.rc b/src/version.rc
index e3a2c832..f8b62a2f 100644
--- a/src/version.rc
+++ b/src/version.rc
@@ -1,7 +1,7 @@
#include "Winver.h"
-#define VER_FILEVERSION 2,0,8,3
-#define VER_FILEVERSION_STR "2.0.8.3beta\0"
+#define VER_FILEVERSION 2,1,0
+#define VER_FILEVERSION_STR "2.1.0beta\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION