summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt101
-rw-r--r--src/ModOrganizer.pro4
-rw-r--r--src/bbcode.cpp106
-rw-r--r--src/browserdialog.cpp20
-rw-r--r--src/browserview.cpp4
-rw-r--r--src/categories.cpp4
-rw-r--r--src/categoriesdialog.cpp6
-rw-r--r--src/csvbuilder.cpp2
-rw-r--r--src/directoryrefresher.cpp2
-rw-r--r--src/directoryrefresher.h15
-rw-r--r--src/disableproxyplugindialog.h2
-rw-r--r--src/dlls.manifest.debug.qt567
-rw-r--r--src/dlls.manifest.qt553
-rw-r--r--src/downloadmanager.cpp48
-rw-r--r--src/downloadmanager.h16
-rw-r--r--src/editexecutablesdialog.cpp2
-rw-r--r--src/env.cpp6
-rw-r--r--src/envmetrics.cpp2
-rw-r--r--src/envshell.cpp14
-rw-r--r--src/executableslist.cpp2
-rw-r--r--src/filedialogmemory.h2
-rw-r--r--src/filerenamer.cpp4
-rw-r--r--src/filetree.cpp4
-rw-r--r--src/filetreemodel.cpp4
-rw-r--r--src/glob_matching.h4
-rw-r--r--src/iconfetcher.cpp6
-rw-r--r--src/iconfetcher.h7
-rw-r--r--src/installationmanager.cpp1
-rw-r--r--src/instancemanager.cpp2
-rw-r--r--src/instancemanagerdialog.cpp2
-rw-r--r--src/loghighlighter.cpp1
-rw-r--r--src/loglist.cpp5
-rw-r--r--src/loot.cpp2
-rw-r--r--src/lootdialog.cpp2
-rw-r--r--src/mainwindow.cpp29
-rw-r--r--src/mainwindow.h2
-rw-r--r--src/moapplication.cpp9
-rw-r--r--src/moapplication.h2
-rw-r--r--src/modinfo.cpp10
-rw-r--r--src/modinfo.h4
-rw-r--r--src/modinfodialogconflicts.cpp2
-rw-r--r--src/modinfodialogfiletree.cpp4
-rw-r--r--src/modinfodialogimages.cpp4
-rw-r--r--src/modinfodialognexus.cpp2
-rw-r--r--src/modinforegular.cpp8
-rw-r--r--src/modinforegular.h2
-rw-r--r--src/modlistsortproxy.cpp4
-rw-r--r--src/modlistviewactions.cpp8
-rw-r--r--src/moshortcut.cpp1
-rw-r--r--src/moshortcut.h3
-rw-r--r--src/nexusinterface.cpp76
-rw-r--r--src/nexusinterface.h4
-rw-r--r--src/nxmaccessmanager.cpp6
-rw-r--r--src/nxmaccessmanager.h2
-rw-r--r--src/organizer_en.ts3021
-rw-r--r--src/organizercore.cpp21
-rw-r--r--src/pch.h7
-rw-r--r--src/pluginlist.cpp262
-rw-r--r--src/pluginlist.h21
-rw-r--r--src/pluginlistproxy.cpp22
-rw-r--r--src/pluginlistproxy.h9
-rw-r--r--src/pluginlistsortproxy.cpp6
-rw-r--r--src/pluginlistview.cpp7
-rw-r--r--src/processrunner.cpp4
-rw-r--r--src/qtgroupingproxy.cpp74
-rw-r--r--src/qtgroupingproxy.h2
-rw-r--r--src/selfupdater.cpp1
-rw-r--r--src/settingsdialoggeneral.cpp9
-rw-r--r--src/spawn.cpp9
-rw-r--r--src/statusbar.cpp2
-rw-r--r--src/stylesheets/Transparent-Style-101-Green.qss506
-rw-r--r--src/stylesheets/Transparent-Style-BOS.qss758
-rw-r--r--src/stylesheets/Transparent-Style-Skyrim.qss758
-rw-r--r--src/texteditor.cpp10
-rw-r--r--src/tutorials/TutorialDescription.qml2
-rw-r--r--src/version.rc8
76 files changed, 2567 insertions, 3656 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7f1f642a..500b0ca5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,15 +1,31 @@
cmake_minimum_required(VERSION 3.16)
-# appveyor does not build modorganizer in its standard location, so use
-# DEPENDENCIES_DIR to find cmake_common
-if(DEFINED DEPENDENCIES_DIR)
- include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/src.cmake)
-else()
- include(../cmake_common/src.cmake)
-endif()
+add_executable(organizer)
+set_target_properties(organizer PROPERTIES OUTPUT_NAME "ModOrganizer")
+mo2_configure_executable(organizer
+ WARNINGS OFF
+ EXTRA_TRANSLATIONS ${MO2_SUPER_PATH}/game_gamebryo/src ${MO2_UIBASE_PATH}/src
+ PRIVATE_DEPENDS
+ uibase githubpp bsatk esptk archive usvfs lootcli boost::program_options
+ Qt::WebEngineWidgets Qt::WebSockets)
+target_link_libraries(organizer PUBLIC Shlwapi)
+mo2_install_target(organizer)
+install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.qt5"
+ DESTINATION bin/dlls
+ RENAME dlls.manifest)
+
+install(DIRECTORY
+ "${CMAKE_CURRENT_SOURCE_DIR}/stylesheets"
+ "${CMAKE_CURRENT_SOURCE_DIR}/tutorials"
+ DESTINATION bin)
+
+install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/resources/markdown.html"
+ DESTINATION bin/resources)
+
+mo2_deploy_qt(BINARIES ModOrganizer.exe uibase.dll plugins/bsa_packer.dll)
-add_filter(NAME src/application GROUPS
+mo2_add_filter(NAME src/application GROUPS
iuserinterface
commandline
main
@@ -21,12 +37,12 @@ add_filter(NAME src/application GROUPS
updatedialog
)
-add_filter(NAME src/browser GROUPS
+mo2_add_filter(NAME src/browser GROUPS
browserdialog
browserview
)
-add_filter(NAME src/core GROUPS
+mo2_add_filter(NAME src/core GROUPS
categories
archivefiletree
installationmanager
@@ -41,7 +57,7 @@ add_filter(NAME src/core GROUPS
uilocker
)
-add_filter(NAME src/dialogs GROUPS
+mo2_add_filter(NAME src/dialogs GROUPS
aboutdialog
activatemodsdialog
categoriesdialog
@@ -62,13 +78,13 @@ add_filter(NAME src/dialogs GROUPS
waitingonclosedialog
)
-add_filter(NAME src/downloads GROUPS
+mo2_add_filter(NAME src/downloads GROUPS
downloadlist
downloadlistview
downloadmanager
)
-add_filter(NAME src/env GROUPS
+mo2_add_filter(NAME src/env GROUPS
env
envdump
envfs
@@ -80,24 +96,24 @@ add_filter(NAME src/env GROUPS
envwindows
)
-add_filter(NAME src/executables GROUPS
+mo2_add_filter(NAME src/executables GROUPS
executableslist
editexecutablesdialog
)
-add_filter(NAME src/instances GROUPS
+mo2_add_filter(NAME src/instances GROUPS
createinstancedialog
createinstancedialogpages
instancemanager
instancemanagerdialog
)
-add_filter(NAME src/loot GROUPS
+mo2_add_filter(NAME src/loot GROUPS
loot
lootdialog
)
-add_filter(NAME src/mainwindow GROUPS
+mo2_add_filter(NAME src/mainwindow GROUPS
datatab
downloadstab
iconfetcher
@@ -109,7 +125,7 @@ add_filter(NAME src/mainwindow GROUPS
statusbar
)
-add_filter(NAME src/modinfo GROUPS
+mo2_add_filter(NAME src/modinfo GROUPS
modinfo
modinfobackup
modinfoforeign
@@ -119,7 +135,7 @@ add_filter(NAME src/modinfo GROUPS
modinfowithconflictinfo
)
-add_filter(NAME src/modinfo/dialog GROUPS
+mo2_add_filter(NAME src/modinfo/dialog GROUPS
modinfodialog
modinfodialogcategories
modinfodialogconflicts
@@ -133,18 +149,18 @@ add_filter(NAME src/modinfo/dialog GROUPS
modinfodialogtextfiles
)
-add_filter(NAME src/modinfo/dialog/widgets GROUPS
+mo2_add_filter(NAME src/modinfo/dialog/widgets GROUPS
modidlineedit
)
-add_filter(NAME src/modlist GROUPS
+mo2_add_filter(NAME src/modlist GROUPS
modlist
modlistdropinfo
modlistsortproxy
modlistbypriorityproxy
)
-add_filter(NAME src/modlist/view GROUPS
+mo2_add_filter(NAME src/modlist/view GROUPS
filterlist
modlistview
modlistviewactions
@@ -155,25 +171,25 @@ add_filter(NAME src/modlist/view GROUPS
modlistversiondelegate
)
-add_filter(NAME src/plugins GROUPS
+mo2_add_filter(NAME src/plugins GROUPS
pluginlist
pluginlistsortproxy
pluginlistview
pluginlistcontextmenu
)
-add_filter(NAME src/previews GROUPS
+mo2_add_filter(NAME src/previews GROUPS
previewdialog
previewgenerator
)
-add_filter(NAME src/profiles GROUPS
+mo2_add_filter(NAME src/profiles GROUPS
profile
profileinputdialog
profilesdialog
)
-add_filter(NAME src/proxies GROUPS
+mo2_add_filter(NAME src/proxies GROUPS
downloadmanagerproxy
modlistproxy
organizerproxy
@@ -181,7 +197,7 @@ add_filter(NAME src/proxies GROUPS
proxyutils
)
-add_filter(NAME src/register GROUPS
+mo2_add_filter(NAME src/register GROUPS
shared/directoryentry
shared/fileentry
shared/filesorigin
@@ -191,12 +207,12 @@ add_filter(NAME src/register GROUPS
directoryrefresher
)
-add_filter(NAME src/settings GROUPS
+mo2_add_filter(NAME src/settings GROUPS
settings
settingsutilities
)
-add_filter(NAME src/settingsdialog GROUPS
+mo2_add_filter(NAME src/settingsdialog GROUPS
settingsdialog
settingsdialogdiagnostics
settingsdialoggeneral
@@ -209,7 +225,7 @@ add_filter(NAME src/settingsdialog GROUPS
disableproxyplugindialog
)
-add_filter(NAME src/utilities GROUPS
+mo2_add_filter(NAME src/utilities GROUPS
shared/appconfig
bbcode
csvbuilder
@@ -224,7 +240,7 @@ add_filter(NAME src/utilities GROUPS
glob_matching
)
-add_filter(NAME src/widgets GROUPS
+mo2_add_filter(NAME src/widgets GROUPS
colortable
genericicondelegate
filerenamer
@@ -239,26 +255,3 @@ add_filter(NAME src/widgets GROUPS
modelutils
copyeventfilter
)
-
-
-requires_project(game_features githubpp bsatk esptk archive usvfs)
-
-target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
- ${modorganizer_super_path}/lootcli/include
-)
-
-
-install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.qt5"
- DESTINATION bin/dlls
- RENAME dlls.manifest)
-
-install(FILES ${qm_files} DESTINATION bin/translations)
-
-install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/stylesheets"
- "${CMAKE_CURRENT_SOURCE_DIR}/tutorials"
- DESTINATION bin)
-
-deploy_qt(BINARIES ModOrganizer.exe uibase.dll plugins/bsa_packer.dll)
-
-install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../qdds.dll" DESTINATION bin/dlls/imageformats)
-install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/resources/markdown.html" DESTINATION bin/resources)
diff --git a/src/ModOrganizer.pro b/src/ModOrganizer.pro
index fc679a01..c4fd534e 100644
--- a/src/ModOrganizer.pro
+++ b/src/ModOrganizer.pro
@@ -40,6 +40,10 @@ greaterThan(QT_MAJOR_VERSION, 4) {
QTLIBNAMES += Core Declarative Gui Network OpenGL Script Sql Svg Webkit Xml XmlPatterns
}
+greaterThan(QT_MAJOR_VERSION, 5) {
+ QTLIBNAMES += OpenGLWidgets
+}
+
QTLIBSUFFIX = $${QT_MAJOR_VERSION}.dll
CONFIG(debug, debug|release): QTLIBSUFFIX = "d$${QTLIBSUFFIX}" # Can't use Debug: .. here, it ignores the line - no idea why, as it works in BossDummy.pro
diff --git a/src/bbcode.cpp b/src/bbcode.cpp
index e56c4ea2..36b60a66 100644
--- a/src/bbcode.cpp
+++ b/src/bbcode.cpp
@@ -19,7 +19,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "bbcode.h"
#include <log.h>
-#include <QRegExp>
+#include <QRegularExpression>
#include <map>
namespace BBCode {
@@ -28,7 +28,7 @@ namespace log = MOBase::log;
class BBCodeMap {
- typedef std::map<QString, std::pair<QRegExp, QString> > TagMap;
+ typedef std::map<QString, std::pair<QRegularExpression, QString> > TagMap;
public:
@@ -40,8 +40,8 @@ public:
QString convertTag(QString input, int &length)
{
// extract the tag name
- m_TagNameExp.indexIn(input, 1, QRegExp::CaretAtOffset);
- QString tagName = m_TagNameExp.cap(0).toLower();
+ auto match = m_TagNameExp.match(input, 1, QRegularExpression::NormalMatch, QRegularExpression::AnchoredMatchOption);
+ QString tagName = match.captured(0).toLower();
TagMap::iterator tagIter = m_TagMap.find(tagName);
if (tagIter != m_TagMap.end()) {
// recognized tag
@@ -50,18 +50,27 @@ public:
}
int closeTagPos = 0;
+ int nextTagPos = 0;
+ int nextTagSearchIndex = input.indexOf("]");
int closeTagLength = 0;
if (tagName == "*") {
// ends at the next bullet point
- closeTagPos = input.indexOf(QRegExp("(\\[\\*\\]|</ul>)", Qt::CaseInsensitive), 3);
+ closeTagPos = input.indexOf(QRegularExpression("(\\[\\*\\]|</ul>)", QRegularExpression::CaseInsensitiveOption), 3);
// leave closeTagLength at 0 because we don't want to "eat" the next bullet point
} else if (tagName == "line") {
// ends immediately after the tag
closeTagPos = 6;
// leave closeTagLength at 0 because there is no close tag to skip over
} else {
+ QRegularExpression nextTag(QString("\\[%1[=\\]]?").arg(tagName), QRegularExpression::CaseInsensitiveOption);
QString closeTag = QString("[/%1]").arg(tagName);
closeTagPos = input.indexOf(closeTag, 0, Qt::CaseInsensitive);
+ nextTagPos = nextTag.match(input, nextTagSearchIndex).capturedStart(0);
+ while (nextTagPos != -1 && closeTagPos != -1 && nextTagPos < closeTagPos) {
+ closeTagPos = input.indexOf(closeTag, closeTagPos + closeTag.size(), Qt::CaseInsensitive);
+ nextTagSearchIndex = input.indexOf("]", nextTagPos);
+ nextTagPos = nextTag.match(input, nextTagSearchIndex).capturedStart(0);
+ }
if (closeTagPos == -1) {
// workaround to improve compatibility: add fake closing tag
input.append(closeTag);
@@ -73,11 +82,13 @@ public:
if (closeTagPos > -1) {
length = closeTagPos + closeTagLength;
QString temp = input.mid(0, length);
- if (tagIter->second.first.indexIn(temp) == 0) {
+ tagIter->second.first.setPatternOptions(QRegularExpression::PatternOption::DotMatchesEverythingOption);
+ auto match = tagIter->second.first.match(temp);
+ if (match.hasMatch()) {
if (tagIter->second.second.isEmpty()) {
if (tagName == "color") {
- QString color = tagIter->second.first.cap(1);
- QString content = tagIter->second.first.cap(2);
+ QString color = match.captured(1);
+ QString content = match.captured(2);
if (color.at(0) == '#') {
return temp.replace(tagIter->second.first, QString("<font style=\"color: %1;\">%2</font>").arg(color, content));
} else {
@@ -92,7 +103,7 @@ public:
}
} else {
if (tagName == "*") {
- temp.remove(QRegExp("(\\[/\\*\\])?(<br/>)?$"));
+ temp.remove(QRegularExpression("(\\[/\\*\\])?(<br/>)?$"));
}
return temp.replace(tagIter->second.first, tagIter->second.second);
}
@@ -113,86 +124,87 @@ public:
private:
BBCodeMap()
- : m_TagNameExp("^[a-zA-Z*]*=?")
+ : m_TagNameExp("[a-zA-Z*]*=?")
{
- m_TagMap["b"] = std::make_pair(QRegExp("\\[b\\](.*)\\[/b\\]"),
+ m_TagMap["b"] = std::make_pair(QRegularExpression("\\[b\\](.*)\\[/b\\]"),
"<b>\\1</b>");
- m_TagMap["i"] = std::make_pair(QRegExp("\\[i\\](.*)\\[/i\\]"),
+ m_TagMap["i"] = std::make_pair(QRegularExpression("\\[i\\](.*)\\[/i\\]"),
"<i>\\1</i>");
- m_TagMap["u"] = std::make_pair(QRegExp("\\[u\\](.*)\\[/u\\]"),
+ m_TagMap["u"] = std::make_pair(QRegularExpression("\\[u\\](.*)\\[/u\\]"),
"<u>\\1</u>");
- m_TagMap["s"] = std::make_pair(QRegExp("\\[s\\](.*)\\[/s\\]"),
+ m_TagMap["s"] = std::make_pair(QRegularExpression("\\[s\\](.*)\\[/s\\]"),
"<s>\\1</s>");
- m_TagMap["sub"] = std::make_pair(QRegExp("\\[sub\\](.*)\\[/sub\\]"),
+ m_TagMap["sub"] = std::make_pair(QRegularExpression("\\[sub\\](.*)\\[/sub\\]"),
"<sub>\\1</sub>");
- m_TagMap["sup"] = std::make_pair(QRegExp("\\[sup\\](.*)\\[/sup\\]"),
+ m_TagMap["sup"] = std::make_pair(QRegularExpression("\\[sup\\](.*)\\[/sup\\]"),
"<sup>\\1</sup>");
- m_TagMap["size="] = std::make_pair(QRegExp("\\[size=([^\\]]*)\\](.*)\\[/size\\]"),
+ m_TagMap["size="] = std::make_pair(QRegularExpression("\\[size=([^\\]]*)\\](.*)\\[/size\\]"),
"<font size=\"\\1\">\\2</font>");
- m_TagMap["color="] = std::make_pair(QRegExp("\\[color=([^\\]]*)\\](.*)\\[/color\\]"),
+ m_TagMap["color="] = std::make_pair(QRegularExpression("\\[color=([^\\]]*)\\](.*)\\[/color\\]"),
"");
- m_TagMap["font="] = std::make_pair(QRegExp("\\[font=([^\\]]*)\\](.*)\\[/font\\]"),
+ m_TagMap["font="] = std::make_pair(QRegularExpression("\\[font=([^\\]]*)\\](.*)\\[/font\\]"),
"<font style=\"font-family: \\1;\">\\2</font>");
- m_TagMap["center"] = std::make_pair(QRegExp("\\[center\\](.*)\\[/center\\]"),
+ m_TagMap["center"] = std::make_pair(QRegularExpression("\\[center\\](.*)\\[/center\\]"),
"<div align=\"center\">\\1</div>");
- m_TagMap["quote"] = std::make_pair(QRegExp("\\[quote\\](.*)\\[/quote\\]"),
+ m_TagMap["right"] = std::make_pair(QRegularExpression("\\[right\\](.*)\\[/right\\]"),
+ "<div align=\"right\">\\1</div>");
+ m_TagMap["quote"] = std::make_pair(QRegularExpression("\\[quote\\](.*)\\[/quote\\]"),
"<figure class=\"quote\"><blockquote>\\1</blockquote></figure>");
- m_TagMap["quote="] = std::make_pair(QRegExp("\\[quote=([^\\]]*)\\](.*)\\[/quote\\]"),
+ m_TagMap["quote="] = std::make_pair(QRegularExpression("\\[quote=([^\\]]*)\\](.*)\\[/quote\\]"),
"<figure class=\"quote\"><blockquote>\\2</blockquote></figure>");
- m_TagMap["spoiler"] = std::make_pair(QRegExp("\\[spoiler\\](.*)\\[/spoiler\\]"),
+ m_TagMap["spoiler"] = std::make_pair(QRegularExpression("\\[spoiler\\](.*)\\[/spoiler\\]"),
"<details><summary>Spoiler: <div class=\"bbc_spoiler_show\">Show</div></summary><div class=\"spoiler_content\">\\1</div></details>");
- m_TagMap["code"] = std::make_pair(QRegExp("\\[code\\](.*)\\[/code\\]"),
+ m_TagMap["code"] = std::make_pair(QRegularExpression("\\[code\\](.*)\\[/code\\]"),
"<code>\\1</code>");
- m_TagMap["heading"]= std::make_pair(QRegExp("\\[heading\\](.*)\\[/heading\\]"),
+ m_TagMap["heading"]= std::make_pair(QRegularExpression("\\[heading\\](.*)\\[/heading\\]"),
"<h2><strong>\\1</strong></h2>");
- m_TagMap["line"] = std::make_pair(QRegExp("\\[line\\]"),
+ m_TagMap["line"] = std::make_pair(QRegularExpression("\\[line\\]"),
"<hr>");
// lists
- m_TagMap["list"] = std::make_pair(QRegExp("\\[list\\](.*)\\[/list\\]"),
+ m_TagMap["list"] = std::make_pair(QRegularExpression("\\[list\\](.*)\\[/list\\]"),
"<ul>\\1</ul>");
- m_TagMap["list="] = std::make_pair(QRegExp("\\[list.*\\](.*)\\[/list\\]"),
+ m_TagMap["list="] = std::make_pair(QRegularExpression("\\[list.*\\](.*)\\[/list\\]"),
"<ol>\\1</ol>");
- m_TagMap["ul"] = std::make_pair(QRegExp("\\[ul\\](.*)\\[/ul\\]"),
+ m_TagMap["ul"] = std::make_pair(QRegularExpression("\\[ul\\](.*)\\[/ul\\]"),
"<ul>\\1</ul>");
- m_TagMap["ol"] = std::make_pair(QRegExp("\\[ol\\](.*)\\[/ol\\]"),
+ m_TagMap["ol"] = std::make_pair(QRegularExpression("\\[ol\\](.*)\\[/ol\\]"),
"<ol>\\1</ol>");
- m_TagMap["li"] = std::make_pair(QRegExp("\\[li\\](.*)\\[/li\\]"),
+ m_TagMap["li"] = std::make_pair(QRegularExpression("\\[li\\](.*)\\[/li\\]"),
"<li>\\1</li>");
// tables
- m_TagMap["table"] = std::make_pair(QRegExp("\\[table\\](.*)\\[/table\\]"),
+ m_TagMap["table"] = std::make_pair(QRegularExpression("\\[table\\](.*)\\[/table\\]"),
"<table>\\1</table>");
- m_TagMap["tr"] = std::make_pair(QRegExp("\\[tr\\](.*)\\[/tr\\]"),
+ m_TagMap["tr"] = std::make_pair(QRegularExpression("\\[tr\\](.*)\\[/tr\\]"),
"<tr>\\1</tr>");
- m_TagMap["th"] = std::make_pair(QRegExp("\\[th\\](.*)\\[/th\\]"),
+ m_TagMap["th"] = std::make_pair(QRegularExpression("\\[th\\](.*)\\[/th\\]"),
"<th>\\1</th>");
- m_TagMap["td"] = std::make_pair(QRegExp("\\[td\\](.*)\\[/td\\]"),
+ m_TagMap["td"] = std::make_pair(QRegularExpression("\\[td\\](.*)\\[/td\\]"),
"<td>\\1</td>");
// web content
- m_TagMap["url"] = std::make_pair(QRegExp("\\[url\\](.*)\\[/url\\]"),
+ m_TagMap["url"] = std::make_pair(QRegularExpression("\\[url\\](.*)\\[/url\\]"),
"<a href=\"\\1\">\\1</a>");
- m_TagMap["url="] = std::make_pair(QRegExp("\\[url=([^\\]]*)\\](.*)\\[/url\\]"),
+ m_TagMap["url="] = std::make_pair(QRegularExpression("\\[url=([^\\]]*)\\](.*)\\[/url\\]"),
"<a href=\"\\1\">\\2</a>");
- m_TagMap["img"] = std::make_pair(QRegExp("\\[img(?:\\s*width=\\d+\\s*,?\\s*height=\\d+)?\\](.*)\\[/img\\]"),
+ m_TagMap["img"] = std::make_pair(QRegularExpression("\\[img(?:\\s*width=\\d+\\s*,?\\s*height=\\d+)?\\](.*)\\[/img\\]"),
"<img src=\"\\1\">");
- m_TagMap["img="] = std::make_pair(QRegExp("\\[img=([^\\]]*)\\](.*)\\[/img\\]"),
+ m_TagMap["img="] = std::make_pair(QRegularExpression("\\[img=([^\\]]*)\\](.*)\\[/img\\]"),
"<img src=\"\\2\" alt=\"\\1\">");
- m_TagMap["email="] = std::make_pair(QRegExp("\\[email=\"?([^\\]]*)\"?\\](.*)\\[/email\\]"),
+ m_TagMap["email="] = std::make_pair(QRegularExpression("\\[email=\"?([^\\]]*)\"?\\](.*)\\[/email\\]"),
"<a href=\"mailto:\\1\">\\2</a>");
- m_TagMap["youtube"] = std::make_pair(QRegExp("\\[youtube\\](.*)\\[/youtube\\]"),
+ m_TagMap["youtube"] = std::make_pair(QRegularExpression("\\[youtube\\](.*)\\[/youtube\\]"),
"<a href=\"https://www.youtube.com/watch?v=\\1\">https://www.youtube.com/watch?v=\\1</a>");
// make all patterns non-greedy and case-insensitive
for (TagMap::iterator iter = m_TagMap.begin(); iter != m_TagMap.end(); ++iter) {
- iter->second.first.setCaseSensitivity(Qt::CaseInsensitive);
- iter->second.first.setMinimal(true);
+ iter->second.first.setPatternOptions(QRegularExpression::CaseInsensitiveOption | QRegularExpression::InvertedGreedinessOption);
}
// this tag is in fact greedy
- m_TagMap["*"] = std::make_pair(QRegExp("\\[\\*\\](.*)"),
+ m_TagMap["*"] = std::make_pair(QRegularExpression("\\[\\*\\](.*)"),
"<li>\\1</li>");
m_ColorMap.insert(std::make_pair<QString, QString>("red", "FF0000"));
@@ -216,7 +228,7 @@ private:
private:
- QRegExp m_TagNameExp;
+ QRegularExpression m_TagNameExp;
TagMap m_TagMap;
std::map<QString, QString> m_ColorMap;
};
@@ -241,7 +253,7 @@ QString convertToHTML(const QString &inputParam)
// iterate over the input buffer
while ((pos = input.indexOf('[', lastBlock)) != -1) {
// append everything between the previous tag-block and the current one
- result.append(input.midRef(lastBlock, pos - lastBlock));
+ result.append(input.mid(lastBlock, pos - lastBlock));
if ((pos < (input.size() - 1)) && (input.at(pos + 1) == '/')) {
// skip invalid end tag
@@ -272,7 +284,7 @@ QString convertToHTML(const QString &inputParam)
}
// append the remainder (everything after the last tag)
- result.append(input.midRef(lastBlock));
+ result.append(input.mid(lastBlock));
return result;
}
diff --git a/src/browserdialog.cpp b/src/browserdialog.cpp
index 72cb8862..8e341363 100644
--- a/src/browserdialog.cpp
+++ b/src/browserdialog.cpp
@@ -174,16 +174,18 @@ void BrowserDialog::titleChanged(const QString &title)
QString BrowserDialog::guessFileName(const QString &url)
{
- QRegExp uploadsExp(QString("https://.+/uploads/([^/]+)$"));
- if (uploadsExp.indexIn(url) != -1) {
+ QRegularExpression uploadsExp(QString("https://.+/uploads/([^/]+)$"));
+ auto match = uploadsExp.match(url);
+ if (match.hasMatch()) {
// these seem to be premium downloads
- return uploadsExp.cap(1);
+ return match.captured(1);
}
- QRegExp filesExp(QString("https://.+\\?file=([^&]+)"));
- if (filesExp.indexIn(url) != -1) {
+ QRegularExpression filesExp(QString("https://.+\\?file=([^&]+)"));
+ match = filesExp.match(url);
+ if (match.hasMatch()) {
// a regular manual download?
- return filesExp.cap(1);
+ return match.captured(1);
}
return "unknown";
}
@@ -196,13 +198,13 @@ void BrowserDialog::unsupportedContent(QNetworkReply *reply)
log::error("sender not a page");
return;
}
- BrowserView *view = qobject_cast<BrowserView*>(page->view());
+ /*browserview *view = qobject_cast<browserview*>(page->view());
if (view == nullptr) {
log::error("no view?");
return;
- }
+ }*/
- emit requestDownload(view->url(), reply);
+ emit requestDownload(page->url(), reply);
} catch (const std::exception &e) {
if (isVisible()) {
MessageDialog::showMessage(tr("failed to start download"), this);
diff --git a/src/browserview.cpp b/src/browserview.cpp
index 0b871e23..81fd8a74 100644
--- a/src/browserview.cpp
+++ b/src/browserview.cpp
@@ -22,7 +22,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QEvent>
#include <QKeyEvent>
#include <QNetworkDiskCache>
-#include <QWebEngineContextMenuData>
+#include <QWebEngineContextMenuRequest>
#include <QWebEngineSettings>
#include <QMenu>
#include <Shlwapi.h>
@@ -55,7 +55,7 @@ bool BrowserView::eventFilter(QObject *obj, QEvent *event)
}
} else if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
- if (mouseEvent->button() == Qt::MidButton) {
+ if (mouseEvent->button() == Qt::MouseButton::MiddleButton) {
mouseEvent->ignore();
return true;
}
diff --git a/src/categories.cpp b/src/categories.cpp
index 7952fed4..01383031 100644
--- a/src/categories.cpp
+++ b/src/categories.cpp
@@ -160,7 +160,7 @@ void CategoryFactory::saveCategories()
QByteArray line;
line.append(QByteArray::number(iter->m_ID)).append("|")
.append(iter->m_Name.toUtf8()).append("|")
- .append(VectorJoin(iter->m_NexusIDs, ",")).append("|")
+ .append(VectorJoin(iter->m_NexusIDs, ",").toUtf8()).append("|")
.append(QByteArray::number(iter->m_ParentID)).append("\n");
categoryFile.write(line);
}
@@ -232,7 +232,7 @@ void CategoryFactory::loadDefaultCategories()
addCategory(44, "Equipment", { 1, 44 }, 43);
addCategory(45, "Home/Settlement", { 1, 45 }, 43);
addCategory(10, "Body, Face, & Hair", { 2, 17, 26 }, 0);
- addCategory(39, "Tattoos", { 1, 57 }, 10);
+ addCategory(56, "Tattoos", { 1, 57 }, 10);
addCategory(40, "Character Presets", { 1, 58 }, 0);
addCategory(11, "Items", { 2, 27, 85 }, 0);
addCategory(32, "Mercantile", { 2, 23, 69 }, 0);
diff --git a/src/categoriesdialog.cpp b/src/categoriesdialog.cpp
index b5194bf0..5181d9f1 100644
--- a/src/categoriesdialog.cpp
+++ b/src/categoriesdialog.cpp
@@ -23,7 +23,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "utility.h"
#include "settings.h"
#include <QItemDelegate>
-#include <QRegExpValidator>
+#include <QRegularExpressionValidator>
#include <QLineEdit>
#include <QMenu>
@@ -134,7 +134,7 @@ void CategoriesDialog::commitChanges()
for (int i = 0; i < ui->categoriesTable->rowCount(); ++i) {
int index = ui->categoriesTable->verticalHeader()->logicalIndex(i);
QString nexusIDString = ui->categoriesTable->item(index, 2)->text();
- QStringList nexusIDStringList = nexusIDString.split(',', QString::SkipEmptyParts);
+ QStringList nexusIDStringList = nexusIDString.split(',', Qt::SkipEmptyParts);
std::vector<int> nexusIDs;
for (QStringList::iterator iter = nexusIDStringList.begin();
iter != nexusIDStringList.end(); ++iter) {
@@ -189,7 +189,7 @@ void CategoriesDialog::fillTable()
table->setItemDelegateForColumn(0, new ValidatingDelegate(this, new NewIDValidator(m_IDs)));
- table->setItemDelegateForColumn(2, new ValidatingDelegate(this, new QRegExpValidator(QRegExp("([0-9]+)?(,[0-9]+)*"), this)));
+ table->setItemDelegateForColumn(2, new ValidatingDelegate(this, new QRegularExpressionValidator(QRegularExpression("([0-9]+)?(,[0-9]+)*"), this)));
table->setItemDelegateForColumn(3, new ValidatingDelegate(this, new ExistingIDValidator(m_IDs)));
int row = 0;
diff --git a/src/csvbuilder.cpp b/src/csvbuilder.cpp
index fa4218a2..788c9438 100644
--- a/src/csvbuilder.cpp
+++ b/src/csvbuilder.cpp
@@ -4,7 +4,7 @@
CSVBuilder::CSVBuilder(QIODevice *target)
: m_Out(target), m_Separator(','), m_LineBreak(BREAK_CRLF)
{
- m_Out.setCodec("UTF-8");
+ m_Out.setEncoding(QStringConverter::Encoding::Utf8);
m_QuoteMode[TYPE_INTEGER] = QUOTE_NEVER;
m_QuoteMode[TYPE_FLOAT] = QUOTE_NEVER;
diff --git a/src/directoryrefresher.cpp b/src/directoryrefresher.cpp
index 9bbef3f2..90bfad3b 100644
--- a/src/directoryrefresher.cpp
+++ b/src/directoryrefresher.cpp
@@ -20,7 +20,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "directoryrefresher.h"
#include "shared/fileentry.h"
#include "shared/filesorigin.h"
-#include "shared/directoryentry.h"
#include "iplugingame.h"
#include "utility.h"
@@ -36,7 +35,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QApplication>
#include <QDir>
#include <QString>
-#include <QTextCodec>
#include <fstream>
diff --git a/src/directoryrefresher.h b/src/directoryrefresher.h
index 0677998b..56394d94 100644
--- a/src/directoryrefresher.h
+++ b/src/directoryrefresher.h
@@ -20,6 +20,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#ifndef DIRECTORYREFRESHER_H
#define DIRECTORYREFRESHER_H
+#include "shared/directoryentry.h"
#include "shared/fileregisterfwd.h"
#include "profile.h"
#include <QObject>
@@ -34,8 +35,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
**/
class DirectoryRefresher : public QObject
{
-
- Q_OBJECT
+ Q_OBJECT;
public:
struct EntryInfo
@@ -54,11 +54,8 @@ public:
int priority;
};
- DirectoryRefresher(std::size_t threadCount);
- // noncopyable
- DirectoryRefresher(const DirectoryRefresher&) = delete;
- DirectoryRefresher& operator=(const DirectoryRefresher&) = delete;
+ DirectoryRefresher(std::size_t threadCount);
/**
* @brief retrieve the updated directory structure
@@ -82,7 +79,7 @@ public:
* @param modDirectory the mod directory
* @note this function could be obsoleted easily by storing absolute paths in the parameter to setMods. This is legacy
*/
- void setModDirectory(const QString &modDirectory);
+ //void setModDirectory(const QString &modDirectory);
/**
* @brief remove files from the directory structure that are known to be irrelevant to the game
@@ -157,9 +154,9 @@ private:
};
-class DirectoryRefreshProgress : QObject
+class DirectoryRefreshProgress : public QObject
{
- Q_OBJECT;
+ Q_OBJECT
public:
DirectoryRefreshProgress(DirectoryRefresher* r) :
diff --git a/src/disableproxyplugindialog.h b/src/disableproxyplugindialog.h
index 52f552e1..b55a3d43 100644
--- a/src/disableproxyplugindialog.h
+++ b/src/disableproxyplugindialog.h
@@ -1,5 +1,5 @@
/*
-Copyright (C) 2020 Mikaël Capelle. All rights reserved.
+Copyright (C) 2020 Mikaël Capelle. All rights reserved.
This file is part of Mod Organizer.
diff --git a/src/dlls.manifest.debug.qt5 b/src/dlls.manifest.debug.qt5
index a2f75206..728c01b2 100644
--- a/src/dlls.manifest.debug.qt5
+++ b/src/dlls.manifest.debug.qt5
@@ -1,29 +1,46 @@
<?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="Qt5Cored.dll"/>
- <file name="Qt5Declaratived.dll"/>
- <file name="Qt5Guid.dll"/>
- <file name="Qt5Multimediad.dll"/>
- <file name="Qt5MultimediaWidgetsd.dll"/>
- <file name="Qt5Networkd.dll"/>
- <file name="Qt5OpenGLd.dll"/>
- <file name="Qt5Positioningd.dll"/>
- <file name="Qt5PrintSupportd.dll"/>
- <file name="Qt5Qmld.dll"/>
- <file name="Qt5Quickd.dll"/>
- <file name="Qt5Sensorsd.dll"/>
- <file name="Qt5Scriptd.dll"/>
- <file name="Qt5Sqld.dll"/>
- <file name="Qt5Svgd.dll"/>
- <file name="Qt5WebChanneld.dll"/>
- <file name="Qt5WebKitd.dll"/>
- <file name="Qt5WebKitWidgetsd.dll"/>
- <file name="Qt5Widgetsd.dll"/>
- <file name="Qt5WinExtrasd.dll"/>
- <file name="Qt5Xmld.dll"/>
- <file name="Qt5XmlPatternsd.dll"/>
+ <file name="7z.dll"/>
+ <file name="archive.dll"/>
+ <file name="d3dcompiler_47.dll"/>
+ <file name="libbsarch.dll"/>
+ <file name="libcrypto-1_1-x64.dll"/>
+ <file name="libEGL.dll"/>
+ <file name="libGLESV2.dll"/>
+ <file name="liblz4.dll"/>
+ <file name="libssl-1_1-x64.dll"/>
+ <file name="opengl32sw.dll"/>
+ <file name="Qt6Concurrent.dll"/>
+ <file name="Qt6Core.dll"/>
+ <file name="Qt6Core5Compat.dll"/>
+ <file name="Qt6Gui.dll"/>
+ <file name="Qt6Network.dll"/>
+ <file name="Qt6OpenGL.dll"/>
+ <file name="Qt6OpenGLWidgets.dll"/>
+ <file name="Qt6Positioning.dll"/>
+ <file name="Qt6PrintSupport.dll"/>
+ <file name="Qt6Qml.dll"/>
+ <file name="Qt6QmlLocalStorage.dll"/>
+ <file name="Qt6QmlModels.dll"/>
+ <file name="Qt6QmlWorkerScript.dll"/>
+ <file name="Qt6QmlXmlListModel.dll"/>
+ <file name="Qt6Quick.dll"/>
+ <file name="Qt6QuickControls2.dll"/>
+ <file name="Qt6QuickControls2Impl.dll"/>
+ <file name="Qt6QuickDialogs2.dll"/>
+ <file name="Qt6QuickDialogs2QuickImpl.dll"/>
+ <file name="Qt6QuickDialogs2Utils.dll"/>
+ <file name="Qt6QuickLayouts.dll"/>
+ <file name="Qt6QuickParticles.dll"/>
+ <file name="Qt6QuickShapes.dll"/>
+ <file name="Qt6QuickTemplates2.dll"/>
+ <file name="Qt6QuickWidgets.dll"/>
+ <file name="Qt6Sql.dll"/>
+ <file name="Qt6Svg.dll"/>
+ <file name="Qt6WebChannel.dll"/>
+ <file name="Qt6WebEngineCore.dll"/>
+ <file name="Qt6WebEngineWidgets.dll"/>
+ <file name="Qt6WebSockets.dll"/>
+ <file name="Qt6Widgets.dll"/>
</assembly>
diff --git a/src/dlls.manifest.qt5 b/src/dlls.manifest.qt5
index cae74df1..ebda0f8a 100644
--- a/src/dlls.manifest.qt5
+++ b/src/dlls.manifest.qt5
@@ -4,26 +4,43 @@
<file name="7z.dll"/>
<file name="archive.dll"/>
<file name="d3dcompiler_47.dll"/>
+ <file name="libbsarch.dll"/>
+ <file name="libcrypto-1_1-x64.dll"/>
<file name="libEGL.dll"/>
<file name="libGLESV2.dll"/>
<file name="liblz4.dll"/>
+ <file name="libssl-1_1-x64.dll"/>
<file name="opengl32sw.dll"/>
- <file name="Qt5Core.dll"/>
- <file name="Qt5Gui.dll"/>
- <file name="Qt5Network.dll"/>
- <file name="Qt5Positioning.dll"/>
- <file name="Qt5PrintSupport.dll"/>
- <file name="Qt5Qml.dll"/>
- <file name="Qt5QmlModels.dll"/>
- <file name="Qt5QmlWorkerScript.dll"/>
- <file name="Qt5Quick.dll"/>
- <file name="Qt5QuickWidgets.dll"/>
- <file name="Qt5SerialPort.dll"/>
- <file name="Qt5Svg.dll"/>
- <file name="Qt5WebChannel.dll"/>
- <file name="Qt5WebEngineCore.dll"/>
- <file name="Qt5WebEngineWidgets.dll"/>
- <file name="Qt5WebSockets.dll"/>
- <file name="Qt5Widgets.dll"/>
- <file name="Qt5WinExtras.dll"/>
+ <file name="Qt6Concurrent.dll"/>
+ <file name="Qt6Core.dll"/>
+ <file name="Qt6Core5Compat.dll"/>
+ <file name="Qt6Gui.dll"/>
+ <file name="Qt6Network.dll"/>
+ <file name="Qt6OpenGL.dll"/>
+ <file name="Qt6OpenGLWidgets.dll"/>
+ <file name="Qt6Positioning.dll"/>
+ <file name="Qt6PrintSupport.dll"/>
+ <file name="Qt6Qml.dll"/>
+ <file name="Qt6QmlLocalStorage.dll"/>
+ <file name="Qt6QmlModels.dll"/>
+ <file name="Qt6QmlWorkerScript.dll"/>
+ <file name="Qt6QmlXmlListModel.dll"/>
+ <file name="Qt6Quick.dll"/>
+ <file name="Qt6QuickControls2.dll"/>
+ <file name="Qt6QuickControls2Impl.dll"/>
+ <file name="Qt6QuickDialogs2.dll"/>
+ <file name="Qt6QuickDialogs2QuickImpl.dll"/>
+ <file name="Qt6QuickDialogs2Utils.dll"/>
+ <file name="Qt6QuickLayouts.dll"/>
+ <file name="Qt6QuickParticles.dll"/>
+ <file name="Qt6QuickShapes.dll"/>
+ <file name="Qt6QuickTemplates2.dll"/>
+ <file name="Qt6QuickWidgets.dll"/>
+ <file name="Qt6Sql.dll"/>
+ <file name="Qt6Svg.dll"/>
+ <file name="Qt6WebChannel.dll"/>
+ <file name="Qt6WebEngineCore.dll"/>
+ <file name="Qt6WebEngineWidgets.dll"/>
+ <file name="Qt6WebSockets.dll"/>
+ <file name="Qt6Widgets.dll"/>
</assembly>
diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp
index 73e6abde..b3a34d7b 100644
--- a/src/downloadmanager.cpp
+++ b/src/downloadmanager.cpp
@@ -37,13 +37,13 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QTimer>
#include <QFileInfo>
-#include <QRegExp>
#include <QDirIterator>
#include <QDesktopServices>
#include <QInputDialog>
#include <QMessageBox>
#include <QCoreApplication>
#include <QTextDocument>
+#include <QHttp2Configuration>
#include <boost/bind/bind.hpp>
#include <regex>
@@ -435,8 +435,12 @@ bool DownloadManager::addDownload(const QStringList &URLs, QString gameName,
QUrl preferredUrl = QUrl::fromEncoded(URLs.first().toLocal8Bit());
log::debug("selected download url: {}", preferredUrl.toString());
+ QHttp2Configuration h2Conf;
+ h2Conf.setSessionReceiveWindowSize(16777215); // 16 MiB, based on Chrome and Firefox values
+ h2Conf.setStreamReceiveWindowSize(16777215);
QNetworkRequest request(preferredUrl);
request.setHeader(QNetworkRequest::UserAgentHeader, m_NexusInterface->getAccessManager()->userAgent());
+ request.setHttp2Configuration(h2Conf);
return addDownload(m_NexusInterface->getAccessManager()->get(request), URLs, fileName, gameName, modID, fileID, fileInfo);
}
@@ -533,7 +537,7 @@ void DownloadManager::startDownload(QNetworkReply *reply, DownloadInfo *newDownl
}
connect(newDownload->m_Reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64)));
- connect(newDownload->m_Reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
+ connect(newDownload->m_Reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
connect(newDownload->m_Reply, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
connect(newDownload->m_Reply, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged()));
@@ -943,11 +947,10 @@ void DownloadManager::resumeDownloadInt(int index)
QByteArray rangeHeader = "bytes=" + QByteArray::number(info->m_ResumePos) + "-";
request.setRawHeader("Range", rangeHeader);
}
- std::get<0>(info->m_SpeedDiff) = 0;
- std::get<1>(info->m_SpeedDiff) = 0;
- std::get<2>(info->m_SpeedDiff) = 0;
- std::get<3>(info->m_SpeedDiff) = 0;
- std::get<4>(info->m_SpeedDiff) = 0;
+ info->m_DownloadLast = 0;
+ info->m_DownloadTimeLast = 0;
+ info->m_DownloadAcc = accumulator_set<int, stats<tag::rolling_mean>>(tag::rolling_window::window_size = 200);
+ info->m_DownloadTimeAcc = accumulator_set<int, stats<tag::rolling_mean>>(tag::rolling_window::window_size = 200);
log::debug("resume at {} bytes", info->m_ResumePos);
startDownload(m_NexusInterface->getAccessManager()->get(request), info, true);
}
@@ -1569,20 +1572,20 @@ void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
info->m_Progress.first = ((info->m_ResumePos + bytesReceived) * 100) / (info->m_ResumePos + bytesTotal);
int elapsed = info->m_StartTime.elapsed();
- std::get<0>(info->m_SpeedDiff) = bytesReceived - std::get<2>(info->m_SpeedDiff);
- std::get<1>(info->m_SpeedDiff) = elapsed - std::get<3>(info->m_SpeedDiff);
- std::get<2>(info->m_SpeedDiff) = bytesReceived;
- std::get<3>(info->m_SpeedDiff) = elapsed;
-
- double calc = ((double)std::get<0>(info->m_SpeedDiff)) / (((double)(std::get<1>(info->m_SpeedDiff)) / 5000.0));
- std::get<4>(info->m_SpeedDiff) = ((calc*0.5) + (std::get<4>(info->m_SpeedDiff)*1.5)) / 2;
+ info->m_DownloadAcc(bytesReceived - info->m_DownloadLast);
+ info->m_DownloadLast = bytesReceived;
+ info->m_DownloadTimeAcc(elapsed - info->m_DownloadTimeLast);
+ info->m_DownloadTimeLast = elapsed;
// calculate the download speed
- const double speed = (std::get<4>(info->m_SpeedDiff) * 1000.0) / (5 * 1000);
+ const double speed = rolling_mean(info->m_DownloadAcc) / (rolling_mean(info->m_DownloadTimeAcc) / 1000.0);;
+
+ const int remaining = (bytesTotal - bytesReceived) / speed * 1000;
- info->m_Progress.second = QString::fromLatin1("%1% - %2")
+ info->m_Progress.second = tr("%1% - %2 - ~%3")
.arg(info->m_Progress.first)
- .arg(MOBase::localizedByteSpeed(speed));
+ .arg(MOBase::localizedByteSpeed(speed))
+ .arg(MOBase::localizedTimeRemaining(remaining));
TaskProgressManager::instance().updateProgress(info->m_TaskProgressId, bytesReceived, bytesTotal);
emit update(index);
@@ -1684,9 +1687,10 @@ void DownloadManager::nxmFilesAvailable(QString, int, QVariant userData, QVarian
// this may muck up the file name comparison
QString alternativeLocalName = info->m_FileName;
- QRegExp expression("^\\d_(.*)$");
- if (expression.indexIn(alternativeLocalName) == 0) {
- alternativeLocalName = expression.cap(1);
+ QRegularExpression expression("^\\d_(.*)$");
+ auto match = expression.match(alternativeLocalName);
+ if (match.hasMatch()) {
+ alternativeLocalName = match.captured(1);
}
bool found = false;
@@ -2020,7 +2024,7 @@ void DownloadManager::nxmFileInfoFromMd5Available(QString gameName, QVariant use
}
-void DownloadManager::nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorString)
+void DownloadManager::nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, int errorCode, const QString &errorString)
{
std::set<int>::iterator idIter = m_RequestIDs.find(requestID);
if (idIter == m_RequestIDs.end()) {
@@ -2227,7 +2231,7 @@ void DownloadManager::managedGameChanged(MOBase::IPluginGame const *managedGame)
void DownloadManager::checkDownloadTimeout()
{
for (int i = 0; i < m_ActiveDownloads.size(); ++i) {
- if (m_ActiveDownloads[i]->m_StartTime.elapsed() - std::get<3>(m_ActiveDownloads[i]->m_SpeedDiff) > 5 * 1000 &&
+ if (m_ActiveDownloads[i]->m_StartTime.elapsed() - m_ActiveDownloads[i]->m_DownloadTimeLast > 5 * 1000 &&
m_ActiveDownloads[i]->m_State == STATE_DOWNLOADING && m_ActiveDownloads[i]->m_Reply != nullptr &&
m_ActiveDownloads[i]->m_Reply->isOpen()) {
pauseDownload(i);
diff --git a/src/downloadmanager.h b/src/downloadmanager.h
index 5e126f4b..58027180 100644
--- a/src/downloadmanager.h
+++ b/src/downloadmanager.h
@@ -38,6 +38,10 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QFileSystemWatcher>
#include <QSettings>
#include <boost/signals2.hpp>
+#include <boost/accumulators/accumulators.hpp>
+#include <boost/accumulators/statistics.hpp>
+#include <boost/accumulators/statistics/rolling_mean.hpp>
+using namespace boost::accumulators;
namespace MOBase { class IPluginGame; }
@@ -75,6 +79,10 @@ private:
struct DownloadInfo {
~DownloadInfo() { delete m_FileInfo; }
+ accumulator_set<int, stats<tag::rolling_mean>> m_DownloadAcc;
+ accumulator_set<int, stats<tag::rolling_mean>> m_DownloadTimeAcc;
+ int m_DownloadLast;
+ int m_DownloadTimeLast;
unsigned int m_DownloadID;
QString m_FileName;
QFile m_Output;
@@ -82,7 +90,6 @@ private:
QElapsedTimer m_StartTime;
qint64 m_PreResumeSize;
std::pair<int, QString> m_Progress;
- std::tuple<int, int, int, int, int> m_SpeedDiff;
bool m_HasData;
DownloadState m_State;
int m_CurrentUrl;
@@ -126,7 +133,10 @@ private:
private:
static unsigned int s_NextDownloadID;
private:
- DownloadInfo() : m_TotalSize(0), m_ReQueried(false), m_Hidden(false), m_SpeedDiff(std::tuple<int,int,int,int,int>(0,0,0,0,0)), m_HasData(false) {}
+ DownloadInfo() : m_TotalSize(0), m_ReQueried(false), m_Hidden(false), m_HasData(false),
+ m_DownloadTimeLast(0), m_DownloadLast(0),
+ m_DownloadAcc(tag::rolling_window::window_size = 200),
+ m_DownloadTimeAcc(tag::rolling_window::window_size = 200) {}
};
friend class DownloadManagerProxy;
@@ -473,7 +483,7 @@ public slots:
void nxmFileInfoFromMd5Available(QString gameName, QVariant userData, QVariant resultData, int requestID);
- void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorString);
+ void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, int errorCode, const QString &errorString);
void managedGameChanged(MOBase::IPluginGame const *gamePlugin);
diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp
index 7272e3fd..ea7d20de 100644
--- a/src/editexecutablesdialog.cpp
+++ b/src/editexecutablesdialog.cpp
@@ -482,7 +482,7 @@ void EditExecutablesDialog::save()
e->title(newTitle);
}
- e->binaryInfo(ui->binary->text());
+ e->binaryInfo(QFileInfo(ui->binary->text()));
e->workingDirectory(ui->workingDirectory->text());
e->arguments(ui->arguments->text());
diff --git a/src/env.cpp b/src/env.cpp
index 4f4bc555..818ce8fb 100644
--- a/src/env.cpp
+++ b/src/env.cpp
@@ -801,7 +801,7 @@ std::pair<QString, QString> splitExeAndArguments(const QString& cmd)
}
} else {
// no double-quotes, find the first whitespace
- exeEnd = cmd.indexOf(QRegExp("\\s"));
+ exeEnd = cmd.indexOf(QRegularExpression("\\s"));
if (exeEnd == -1) {
exeEnd = cmd.size();
}
@@ -844,7 +844,7 @@ Association getAssociation(const QFileInfo& targetInfo)
log::debug("split into exe='{}' and cmd='{}'", p.first, p.second);
- return {p.first, *cmd, p.second};
+ return {QFileInfo(p.first), *cmd, p.second};
}
@@ -1108,7 +1108,7 @@ DWORD findOtherPid()
// going through processes, trying to find one with the same name and a
// different pid than this process has
for (const auto& p : processes) {
- if (p.name() == filename) {
+ if (p.name().toStdWString() == filename) {
if (p.pid() != thisPid) {
return p.pid();
}
diff --git a/src/envmetrics.cpp b/src/envmetrics.cpp
index 5fb80449..b47ca2f5 100644
--- a/src/envmetrics.cpp
+++ b/src/envmetrics.cpp
@@ -4,7 +4,7 @@
#include <shellscalingapi.h>
#include <log.h>
#include <utility.h>
-#include <QDesktopWidget>
+#include <QScreen>
namespace env
{
diff --git a/src/envshell.cpp b/src/envshell.cpp
index 33ec0624..f3146b9f 100644
--- a/src/envshell.cpp
+++ b/src/envshell.cpp
@@ -70,9 +70,9 @@ public:
{
}
- bool nativeEventFilter(const QByteArray& type, void* m, long* lresultOut) override
+ bool nativeEventFilter(const QByteArray& eventType, void* message, qintptr* result) override
{
- MSG* msg = (MSG*)m;
+ MSG* msg = (MSG*)message;
if (!msg) {
return false;
}
@@ -81,8 +81,8 @@ public:
const bool r = m_f(msg->hwnd, msg->message, msg->wParam, msg->lParam, &lr);
- if (lresultOut) {
- *lresultOut = lr;
+ if (result) {
+ *result = lr;
}
return r;
@@ -117,8 +117,8 @@ HRESULT IContextMenu_GetCommandString(
}
// Some context menu handlers have off-by-one bugs and will
- // overflow the output buffer. Let’s artificially reduce the
- // buffer size so a one-character overflow won’t corrupt memory.
+ // overflow the output buffer. Let�s artificially reduce the
+ // buffer size so a one-character overflow won�t corrupt memory.
if (cchMax <= 1) {
return E_FAIL;
}
@@ -140,7 +140,7 @@ HRESULT IContextMenu_GetCommandString(
}
if (FAILED(hr)) {
- // try again with ANSI – pad the buffer with one extra character
+ // try again with ANSI � pad the buffer with one extra character
// to compensate for context menu handlers that overflow by
// one character.
LPSTR pszAnsi = (LPSTR)LocalAlloc(
diff --git a/src/executableslist.cpp b/src/executableslist.cpp
index 78aa981d..137f38dc 100644
--- a/src/executableslist.cpp
+++ b/src/executableslist.cpp
@@ -94,7 +94,7 @@ void ExecutablesList::load(const MOBase::IPluginGame* game, const Settings& s)
setExecutable(Executable()
.title(map["title"].toString())
- .binaryInfo(map["binary"].toString())
+ .binaryInfo(QFileInfo(map["binary"].toString()))
.arguments(map["arguments"].toString())
.steamAppID(map["steamAppID"].toString())
.workingDirectory(map["workingDirectory"].toString())
diff --git a/src/filedialogmemory.h b/src/filedialogmemory.h
index 8b8a3b76..11b156ed 100644
--- a/src/filedialogmemory.h
+++ b/src/filedialogmemory.h
@@ -38,7 +38,7 @@ public:
static QString getOpenFileName(
const QString &dirID, QWidget *parent = 0, const QString &caption = QString(),
const QString &dir = QString(), const QString &filter = QString(),
- QString *selectedFilter = 0, QFileDialog::Options options = 0);
+ QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Option(0));
static QString getExistingDirectory(
const QString &dirID, QWidget *parent = 0, const QString &caption = QString(),
diff --git a/src/filerenamer.cpp b/src/filerenamer.cpp
index 7fc90eb2..dd5876b6 100644
--- a/src/filerenamer.cpp
+++ b/src/filerenamer.cpp
@@ -38,7 +38,7 @@ FileRenamer::RenameResults FileRenamer::rename(const QString& oldName, const QSt
log::debug("removing {}", newName);
// user wants to replace the file, so remove it
- const auto r = shell::Delete(newName);
+ const auto r = shell::Delete(QFileInfo(newName));
if (!r.success()) {
log::error("failed to remove '{}': {}", newName, r.toString());
@@ -68,7 +68,7 @@ FileRenamer::RenameResults FileRenamer::rename(const QString& oldName, const QSt
}
// target either didn't exist or was removed correctly
- const auto r = shell::Rename(oldName, newName);
+ const auto r = shell::Rename(QFileInfo(oldName), QFileInfo(newName));
if (!r.success()) {
log::error(
diff --git a/src/filetree.cpp b/src/filetree.cpp
index cf20d4fd..02c85fdd 100644
--- a/src/filetree.cpp
+++ b/src/filetree.cpp
@@ -568,7 +568,7 @@ bool FileTree::showShellMenu(QPoint pos)
.arg(item->realPath()));
}
- itor->second.addFile(item->realPath());
+ itor->second.addFile(QFileInfo(item->realPath()));
++totalFiles;
if (item->isConflicted()) {
@@ -611,7 +611,7 @@ bool FileTree::showShellMenu(QPoint pos)
.arg(QString::fromStdWString(fullPath)));
}
- itor->second.addFile(QString::fromStdWString(fullPath));
+ itor->second.addFile(QFileInfo(QString::fromStdWString(fullPath)));
}
}
}
diff --git a/src/filetreemodel.cpp b/src/filetreemodel.cpp
index 22bcda28..bd9cd067 100644
--- a/src/filetreemodel.cpp
+++ b/src/filetreemodel.cpp
@@ -1100,8 +1100,8 @@ QVariant FileTreeModel::displayData(const FileTreeItem* item, int column) const
case LastModified:
{
if (auto d=item->lastModified()) {
- if (d->isValid()) {
- return d->toString(Qt::SystemLocaleDate);
+ if (d.has_value() && d.value().isValid()) {
+ return QLocale::system().toString(d.value(), QLocale::ShortFormat);
}
}
diff --git a/src/glob_matching.h b/src/glob_matching.h
index 69e2d2a4..e7e7b621 100644
--- a/src/glob_matching.h
+++ b/src/glob_matching.h
@@ -114,8 +114,8 @@ namespace MOShared {
while (str_it != str_end)
{
- CharT current_pat = 0;
- CharT current_str = -1;
+ CharT current_pat = QChar(0);
+ CharT current_str = QChar(-1);
if (pat_it != pat_end)
{
current_pat = case_sensitive ? *pat_it : traits::tolower(*pat_it);
diff --git a/src/iconfetcher.cpp b/src/iconfetcher.cpp
index c10adc8d..32b0d58b 100644
--- a/src/iconfetcher.cpp
+++ b/src/iconfetcher.cpp
@@ -53,7 +53,7 @@ QVariant IconFetcher::icon(const QString& path) const
return m_quickCache.file;
}
- return extensionIcon(path.midRef(dot));
+ return extensionIcon(QStringView{path}.mid(dot));
}
}
@@ -110,7 +110,7 @@ void IconFetcher::checkCache(Cache& cache)
std::map<QString, QPixmap> map;
for (auto&& ext : queue) {
- map.emplace(std::move(ext), getPixmapIcon(ext));
+ map.emplace(std::move(ext), getPixmapIcon(QFileInfo(ext)));
}
{
@@ -145,7 +145,7 @@ QVariant IconFetcher::fileIcon(const QString& path) const
return {};
}
-QVariant IconFetcher::extensionIcon(const QStringRef& ext) const
+QVariant IconFetcher::extensionIcon(const QStringView& ext) const
{
{
std::scoped_lock lock(m_extensionCache.mapMutex);
diff --git a/src/iconfetcher.h b/src/iconfetcher.h
index 030bfb79..78857d05 100644
--- a/src/iconfetcher.h
+++ b/src/iconfetcher.h
@@ -1,8 +1,9 @@
#ifndef MODORGANIZER_ICONFETCHER_INCLUDED
#define MODORGANIZER_ICONFETCHER_INCLUDED
-
-#include <QFileIconProvider>
+#include <set>
#include <mutex>
+#include <QFileIconProvider>
+#include <QStringView>
class IconFetcher
{
@@ -70,7 +71,7 @@ private:
void queue(Cache& cache, QString path) const;
QVariant fileIcon(const QString& path) const;
- QVariant extensionIcon(const QStringRef& ext) const;
+ QVariant extensionIcon(const QStringView& ext) const;
};
#endif // MODORGANIZER_ICONFETCHER_INCLUDED
diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp
index 0ba82a5c..0c6af11d 100644
--- a/src/installationmanager.cpp
+++ b/src/installationmanager.cpp
@@ -40,7 +40,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QFileInfo>
#include <QLibrary>
#include <QInputDialog>
-#include <QRegExp>
#include <QDir>
#include <QMessageBox>
#include <QSettings>
diff --git a/src/instancemanager.cpp b/src/instancemanager.cpp
index f2c031d0..3a5aee4c 100644
--- a/src/instancemanager.cpp
+++ b/src/instancemanager.cpp
@@ -590,7 +590,7 @@ QString InstanceManager::instancePath(const QString& instanceName) const
QString InstanceManager::globalInstancesRootPath() const
{
return QDir::fromNativeSeparators(
- QStandardPaths::writableLocation(QStandardPaths::DataLocation));
+ QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));
}
QString InstanceManager::iniPath(const QString& instanceDir) const
diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp
index f21ff695..776b2496 100644
--- a/src/instancemanagerdialog.cpp
+++ b/src/instancemanagerdialog.cpp
@@ -416,7 +416,7 @@ void InstanceManagerDialog::rename()
log::info("renaming {} to {}", src, dest);
- const auto r = shell::Rename(src, dest, false);
+ const auto r = shell::Rename(QFileInfo(src), QFileInfo(dest), false);
if (!r) {
QMessageBox::critical(
diff --git a/src/loghighlighter.cpp b/src/loghighlighter.cpp
index f43e5662..cd7129ac 100644
--- a/src/loghighlighter.cpp
+++ b/src/loghighlighter.cpp
@@ -18,7 +18,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
*/
#include "loghighlighter.h"
-#include <QRegExp>
LogHighlighter::LogHighlighter(QObject *parent) :
QSyntaxHighlighter(parent)
diff --git a/src/loglist.cpp b/src/loglist.cpp
index 172fcd64..07592edc 100644
--- a/src/loglist.cpp
+++ b/src/loglist.cpp
@@ -139,7 +139,7 @@ QVariant LogModel::data(const QModelIndex& index, int role) const
const std::time_t tt = s.count();
const int frac = static_cast<int>(ms.count() % 1000);
- const auto time = QDateTime::fromTime_t(tt).time().addMSecs(frac);
+ const auto time = QDateTime::fromSecsSinceEpoch(tt).time().addMSecs(frac);
return time.toString("hh:mm:ss.zzz");
} else if (index.column() == 2) {
return QString::fromStdString(e.message);
@@ -359,7 +359,8 @@ void initLogging()
log::getDefault().setCallback(
[](log::Entry e){ LogModel::instance().add(e); });
- log::getDefault().addToBlacklist(getenv("USERNAME"), "USERNAME");
+ log::getDefault().addToBlacklist(std::string("\\") + getenv("USERNAME"), "\\USERNAME");
+ log::getDefault().addToBlacklist(std::string("/") + getenv("USERNAME"), "/USERNAME");
qInstallMessageHandler(qtLogCallback);
}
diff --git a/src/loot.cpp b/src/loot.cpp
index d41fd77b..9c9ab2ae 100644
--- a/src/loot.cpp
+++ b/src/loot.cpp
@@ -714,7 +714,7 @@ void Loot::deleteReportFile()
{
if (QFile::exists(LootReportPath)) {
log::debug("deleting temporary loot report '{}'", LootReportPath);
- const auto r = shell::Delete(LootReportPath);
+ const auto r = shell::Delete(QFileInfo(LootReportPath));
if (!r) {
log::error(
diff --git a/src/lootdialog.cpp b/src/lootdialog.cpp
index 3673c5c6..9f7b16f0 100644
--- a/src/lootdialog.cpp
+++ b/src/lootdialog.cpp
@@ -114,7 +114,7 @@ void LootDialog::addOutput(const QString& s)
return;
}
- const auto lines = s.split(QRegExp("[\\r\\n]"), QString::SkipEmptyParts);
+ const auto lines = s.split(QRegularExpression("[\\r\\n]"), Qt::SkipEmptyParts);
for (auto&& line : lines) {
if (line.isEmpty()) {
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index a7d187c2..551f4494 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -132,7 +132,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QPushButton>
#include <QRadioButton>
#include <QRect>
-#include <QRegExp>
#include <QResizeEvent>
#include <QScopedPointer>
#include <QSizePolicy>
@@ -387,8 +386,8 @@ MainWindow::MainWindow(Settings &settings
connect(&m_OrganizerCore, &OrganizerCore::directoryStructureReady,
this, &MainWindow::onDirectoryStructureChanged);
- connect(m_OrganizerCore.directoryRefresher(), &DirectoryRefresher::progress,
- this, &MainWindow::refresherProgress);
+ connect(m_OrganizerCore.directoryRefresher(), SIGNAL(progress(const DirectoryRefreshProgress*)),
+ this, SLOT(refresherProgress(const DirectoryRefreshProgress*)));
connect(m_OrganizerCore.directoryRefresher(), SIGNAL(error(QString)), this, SLOT(showError(QString)));
connect(&m_OrganizerCore.settings(), SIGNAL(languageChanged(QString)), this, SLOT(languageChange(QString)));
@@ -2957,7 +2956,7 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD
for (auto mod : modsList) {
QString validNewVersion;
int newModStatus = -1;
- QString installedFile = mod->installationFile();
+ QString installedFile = QFileInfo(mod->installationFile()).fileName();
if (!installedFile.isEmpty()) {
QVariantMap foundFileData;
@@ -3236,9 +3235,9 @@ void MainWindow::nxmDownloadURLs(QString, int, int, QVariant, QVariant resultDat
m_OrganizerCore.settings().network().updateServers(servers);
}
-void MainWindow::nxmRequestFailed(QString gameName, int modID, int, QVariant, int, QNetworkReply::NetworkError error, const QString &errorString)
+void MainWindow::nxmRequestFailed(QString gameName, int modID, int, QVariant, int, int errorCode, const QString &errorString)
{
- if (error == QNetworkReply::ContentAccessDenied || error == QNetworkReply::ContentNotFoundError) {
+ if (errorCode == QNetworkReply::ContentAccessDenied || errorCode == QNetworkReply::ContentNotFoundError) {
log::debug("{}", tr("Mod ID %1 no longer seems to be available on Nexus.").arg(modID));
// update last checked timestamp on orphaned mods as well to avoid repeating requests
@@ -3255,7 +3254,7 @@ void MainWindow::nxmRequestFailed(QString gameName, int modID, int, QVariant, in
mod->setLastNexusQuery(QDateTime::currentDateTimeUtc());
}
} else {
- MessageDialog::showMessage(tr("Request to Nexus failed: %1").arg(errorString), this);
+ MessageDialog::showMessage(tr("Error %1: Request to Nexus failed: %2").arg(errorCode).arg(errorString), this);
}
}
@@ -3490,14 +3489,16 @@ QString MainWindow::queryRestore(const QString &filePath)
QFileInfoList files = pluginFileInfo.absoluteDir().entryInfoList(QStringList(pattern), QDir::Files, QDir::Name);
SelectionDialog dialog(tr("Choose backup to restore"), this);
- QRegExp exp(pluginFileInfo.fileName() + PATTERN_BACKUP_REGEX);
- QRegExp exp2(pluginFileInfo.fileName() + "\\.(.*)");
+ QRegularExpression exp(QRegularExpression::anchoredPattern(pluginFileInfo.fileName() + PATTERN_BACKUP_REGEX));
+ QRegularExpression exp2(QRegularExpression::anchoredPattern(pluginFileInfo.fileName() + "\\.(.*)"));
for(const QFileInfo &info : boost::adaptors::reverse(files)) {
- if (exp.exactMatch(info.fileName())) {
- QDateTime time = QDateTime::fromString(exp.cap(1), PATTERN_BACKUP_DATE);
- dialog.addChoice(time.toString(), "", exp.cap(1));
- } else if (exp2.exactMatch(info.fileName())) {
- dialog.addChoice(exp2.cap(1), "", exp2.cap(1));
+ auto match = exp.match(info.fileName());
+ auto match2 = exp2.match(info.fileName());
+ if (match.hasMatch()) {
+ QDateTime time = QDateTime::fromString(match.captured(1), PATTERN_BACKUP_DATE);
+ dialog.addChoice(time.toString(), "", match.captured(1));
+ } else if (match2.hasMatch()) {
+ dialog.addChoice(match2.captured(1), "", match2.captured(1));
}
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 8a246611..d08fdb0e 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -352,7 +352,7 @@ private slots:
void nxmEndorsementToggled(QString, int, QVariant, QVariant resultData, int);
void nxmTrackedModsAvailable(QVariant userData, QVariant resultData, int);
void nxmDownloadURLs(QString, int modID, int fileID, QVariant userData, QVariant resultData, int requestID);
- void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorString);
+ void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, int errorCode, const QString &errorString);
void onRequestsChanged(const APIStats& stats, const APIUserAccount& user);
diff --git a/src/moapplication.cpp b/src/moapplication.cpp
index 2e3af26e..ef33663d 100644
--- a/src/moapplication.cpp
+++ b/src/moapplication.cpp
@@ -19,7 +19,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "moapplication.h"
#include "settings.h"
-#include "env.h"
#include "commandline.h"
#include "instancemanager.h"
#include "organizercore.h"
@@ -45,6 +44,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QPainter>
#include <QStyleOption>
#include <QDebug>
+#include <QSSLSocket>
// see addDllsToPath() below
#pragma comment(linker, "/manifestDependency:\"" \
@@ -232,10 +232,6 @@ int MOApplication::setup(MOMultiProcess& multiProcess, bool forceSelect)
purgeOldFiles();
}
- QWindowsWindowFunctions::setWindowActivationBehavior(
- QWindowsWindowFunctions::AlwaysActivateWindow);
-
-
// loading settings
m_settings.reset(new Settings(m_instance->iniPath(), true));
log::getDefault().setLevel(m_settings->diagnostics().logLevel());
@@ -260,6 +256,9 @@ int MOApplication::setup(MOMultiProcess& multiProcess, bool forceSelect)
sanity::checkIncompatibleModule(m);
}));
+ auto sslBuildVersion = QSslSocket::sslLibraryBuildVersionString();
+ auto sslVersion = QSslSocket::sslLibraryVersionString();
+ log::debug("SSL Build Version: {}, SSL Runtime Version {}", sslBuildVersion, sslVersion);
// nexus interface
tt.start("MOApplication::doOneRun() NexusInterface");
diff --git a/src/moapplication.h b/src/moapplication.h
index d10db320..7e8a8c6f 100644
--- a/src/moapplication.h
+++ b/src/moapplication.h
@@ -22,6 +22,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QApplication>
#include <QFileSystemWatcher>
+#include "env.h"
class Settings;
class MOMultiProcess;
@@ -31,7 +32,6 @@ class OrganizerCore;
class NexusInterface;
namespace MOBase { class IPluginGame; }
-namespace env { class ModuleNotification; }
class MOApplication : public QApplication
{
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index 59026262..3c54fc27 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -55,7 +55,7 @@ ModInfo::Ptr ModInfo::s_Overwrite;
std::map<QString, unsigned int, MOBase::FileNameComparator> ModInfo::s_ModsByName;
std::map<std::pair<QString, int>, std::vector<unsigned int>> ModInfo::s_ModsByModID;
int ModInfo::s_NextID;
-QMutex ModInfo::s_Mutex(QMutex::Recursive);
+QRecursiveMutex ModInfo::s_Mutex;
QString ModInfo::s_HiddenExt(".mohidden");
@@ -67,14 +67,14 @@ bool ModInfo::ByName(const ModInfo::Ptr &LHS, const ModInfo::Ptr &RHS)
bool ModInfo::isSeparatorName(const QString& name)
{
- static QRegExp separatorExp(".*_separator");
- return separatorExp.exactMatch(name);
+ static QRegularExpression separatorExp(QRegularExpression::anchoredPattern(".*_separator"));
+ return separatorExp.match(name).hasMatch();
}
bool ModInfo::isBackupName(const QString& name)
{
- static QRegExp backupExp(".*backup[0-9]*");
- return backupExp.exactMatch(name);
+ static QRegularExpression backupExp(QRegularExpression::anchoredPattern(".*backup[0-9]*"));
+ return backupExp.match(name).hasMatch();
}
bool ModInfo::isRegularName(const QString& name)
diff --git a/src/modinfo.h b/src/modinfo.h
index b835f352..8f82a453 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -29,7 +29,7 @@ class PluginContainer;
class QDir;
class QDateTime;
-#include <QMutex>
+#include <QRecursiveMutex>
#include <QSharedPointer>
#include <QString>
#include <QStringList>
@@ -980,7 +980,7 @@ protected:
protected:
- static QMutex s_Mutex;
+ static QRecursiveMutex s_Mutex;
static std::vector<ModInfo::Ptr> s_Collection;
static ModInfo::Ptr s_Overwrite;
static std::map<QString, unsigned int, MOBase::FileNameComparator> s_ModsByName;
diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp
index bb3346f7..923e9778 100644
--- a/src/modinfodialogconflicts.cpp
+++ b/src/modinfodialogconflicts.cpp
@@ -245,7 +245,7 @@ void ConflictsTab::openItems(QTreeView* tree, bool hooked)
void ConflictsTab::openItem(const ConflictItem* item, bool hooked)
{
core().processRunner()
- .setFromFile(parentWidget(), item->fileName())
+ .setFromFile(parentWidget(), QFileInfo(item->fileName()))
.setHooked(hooked)
.setWaitForCompletion()
.run();
diff --git a/src/modinfodialogfiletree.cpp b/src/modinfodialogfiletree.cpp
index cc0e6493..9f39447d 100644
--- a/src/modinfodialogfiletree.cpp
+++ b/src/modinfodialogfiletree.cpp
@@ -172,7 +172,7 @@ void FileTreeTab::onOpen()
const auto path = m_fs->filePath(selection);
core().processRunner()
- .setFromFile(parentWidget(), path)
+ .setFromFile(parentWidget(), QFileInfo(path))
.setHooked(false)
.setWaitForCompletion()
.run();
@@ -187,7 +187,7 @@ void FileTreeTab::onRunHooked()
const auto path = m_fs->filePath(selection);
core().processRunner()
- .setFromFile(parentWidget(), path)
+ .setFromFile(parentWidget(), QFileInfo(path))
.setHooked(true)
.setWaitForCompletion()
.run();
diff --git a/src/modinfodialogimages.cpp b/src/modinfodialogimages.cpp
index 0abbe53a..530d23d5 100644
--- a/src/modinfodialogimages.cpp
+++ b/src/modinfodialogimages.cpp
@@ -234,8 +234,8 @@ void ImagesTab::getSupportedFormats()
}
// make sure it starts with a dot
- if (s[0] != ".") {
- s = "." + s;
+ if (s[0] != '.') {
+ s = '.' + s;
}
m_supportedFormats.emplace_back(std::move(s));
diff --git a/src/modinfodialognexus.cpp b/src/modinfodialognexus.cpp
index f81cfa89..fdcb2c03 100644
--- a/src/modinfodialognexus.cpp
+++ b/src/modinfodialognexus.cpp
@@ -258,7 +258,7 @@ void NexusTab::onModChanged()
cursor: pointer;
}
- details summary::-webkit-details-marker {
+ details summary::marker {
display:none;
}
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp
index 94f2fc31..eb84a2ad 100644
--- a/src/modinforegular.cpp
+++ b/src/modinforegular.cpp
@@ -60,8 +60,8 @@ ModInfoRegular::ModInfoRegular(const QDir &path, OrganizerCore& core)
, this, SLOT(nxmEndorsementToggled(QString,int,QVariant,QVariant)));
connect(&m_NexusBridge, SIGNAL(trackingToggled(QString,int,QVariant,bool))
, this, SLOT(nxmTrackingToggled(QString,int,QVariant,bool)));
- connect(&m_NexusBridge, SIGNAL(requestFailed(QString,int,int,QVariant,QNetworkReply::NetworkError,QString))
- , this, SLOT(nxmRequestFailed(QString,int,int,QVariant,QNetworkReply::NetworkError,QString)));
+ connect(&m_NexusBridge, SIGNAL(requestFailed(QString,int,int,QVariant,int,QString))
+ , this, SLOT(nxmRequestFailed(QString,int,int,QVariant,int,QString)));
}
@@ -186,7 +186,7 @@ void ModInfoRegular::readMeta()
QString categoriesString = metaFile.value("category", "").toString();
- QStringList categories = categoriesString.split(',', QString::SkipEmptyParts);
+ QStringList categories = categoriesString.split(',', Qt::SkipEmptyParts);
for (QStringList::iterator iter = categories.begin(); iter != categories.end(); ++iter) {
bool ok = false;
int categoryID = iter->toInt(&ok);
@@ -371,7 +371,7 @@ void ModInfoRegular::nxmTrackingToggled(QString, int, QVariant, bool tracked)
}
-void ModInfoRegular::nxmRequestFailed(QString, int, int, QVariant userData, QNetworkReply::NetworkError error, const QString &errorMessage)
+void ModInfoRegular::nxmRequestFailed(QString, int, int, QVariant userData, int errorCode, const QString &errorMessage)
{
QString fullMessage = errorMessage;
if (userData.canConvert<int>() && (userData.toInt() == 1)) {
diff --git a/src/modinforegular.h b/src/modinforegular.h
index 24f5cf9c..ef91ba69 100644
--- a/src/modinforegular.h
+++ b/src/modinforegular.h
@@ -406,7 +406,7 @@ private slots:
void nxmDescriptionAvailable(QString, int modID, QVariant userData, QVariant resultData);
void nxmEndorsementToggled(QString, int, QVariant userData, QVariant resultData);
void nxmTrackingToggled(QString, int, QVariant userData, bool tracked);
- void nxmRequestFailed(QString, int modID, int fileID, QVariant userData, QNetworkReply::NetworkError error, const QString &errorMessage);
+ void nxmRequestFailed(QString, int modID, int fileID, QVariant userData, int errorCode, const QString &errorMessage);
protected:
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp
index 4084af24..a34f730f 100644
--- a/src/modlistsortproxy.cpp
+++ b/src/modlistsortproxy.cpp
@@ -462,13 +462,13 @@ bool ModListSortProxy::filterMatchesMod(ModInfo::Ptr info, bool enabled) const
bool display = false;
QString filterCopy = QString(m_Filter);
filterCopy.replace("||", ";").replace("OR", ";").replace("|", ";");
- QStringList ORList = filterCopy.split(";", QString::SkipEmptyParts);
+ QStringList ORList = filterCopy.split(";", Qt::SkipEmptyParts);
bool segmentGood = true;
//split in ORSegments that internally use AND logic
for (auto& ORSegment : ORList) {
- QStringList ANDKeywords = ORSegment.split(" ", QString::SkipEmptyParts);
+ QStringList ANDKeywords = ORSegment.split(" ", Qt::SkipEmptyParts);
segmentGood = true;
bool foundKeyword = false;
diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp
index f72e8d0c..272d2ec6 100644
--- a/src/modlistviewactions.cpp
+++ b/src/modlistviewactions.cpp
@@ -4,7 +4,6 @@
#include <QGroupBox>
#include <QInputDialog>
#include <QLabel>
-#include <QRegExp>
#include <log.h>
#include <report.h>
@@ -1147,10 +1146,11 @@ void ModListViewActions::openExplorer(const QModelIndexList& index) const
void ModListViewActions::restoreBackup(const QModelIndex& index) const
{
- QRegExp backupRegEx("(.*)_backup[0-9]*$");
+ QRegularExpression backupRegEx("(.*)_backup[0-9]*$");
ModInfo::Ptr modInfo = ModInfo::getByIndex(index.data(ModList::IndexRole).toInt());
- if (backupRegEx.indexIn(modInfo->name()) != -1) {
- QString regName = backupRegEx.cap(1);
+ auto match = backupRegEx.match(modInfo->name());
+ if (match.hasMatch()) {
+ QString regName = match.captured(1);
QDir modDir(QDir::fromNativeSeparators(m_core.settings().paths().mods()));
if (!modDir.exists(regName) ||
(QMessageBox::question(m_parent, tr("Overwrite?"),
diff --git a/src/moshortcut.cpp b/src/moshortcut.cpp
index 4bbd61a4..0f5ae74e 100644
--- a/src/moshortcut.cpp
+++ b/src/moshortcut.cpp
@@ -1,5 +1,4 @@
#include "moshortcut.h"
-#include "instancemanager.h"
MOShortcut::MOShortcut(const QString& link)
: m_valid(link.startsWith("moshortcut://"))
diff --git a/src/moshortcut.h b/src/moshortcut.h
index a693b6df..a6cf7fb5 100644
--- a/src/moshortcut.h
+++ b/src/moshortcut.h
@@ -2,8 +2,7 @@
#define MODORGANIZER_MOSHORTCUT_INCLUDED
#include <QString>
-
-class Instance;
+#include "instancemanager.h"
class MOShortcut
{
diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp
index 2e4496e1..069a2256 100644
--- a/src/nexusinterface.cpp
+++ b/src/nexusinterface.cpp
@@ -103,7 +103,7 @@ void NexusBridge::nxmFilesAvailable(QString gameName, int modID, QVariant userDa
if (iter != m_RequestIDs.end()) {
m_RequestIDs.erase(iter);
- QList<ModRepositoryFileInfo> fileInfoList;
+ QList<ModRepositoryFileInfo*> fileInfoList;
QVariantMap resultInfo = resultData.toMap();
QList resultList = resultInfo["files"].toList();
@@ -118,7 +118,7 @@ void NexusBridge::nxmFilesAvailable(QString gameName, int modID, QVariant userDa
temp.categoryID = fileInfo["category_id"].toInt();
temp.fileID = fileInfo["file_id"].toInt();
temp.fileSize = fileInfo["size"].toInt();
- fileInfoList.append(temp);
+ fileInfoList.append(&temp);
}
emit filesAvailable(gameName, modID, userData, fileInfoList);
@@ -179,12 +179,12 @@ void NexusBridge::nxmTrackingToggled(QString gameName, int modID, QVariant userD
}
}
-void NexusBridge::nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorMessage)
+void NexusBridge::nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, int errorCode, const QString &errorMessage)
{
std::set<int>::iterator iter = m_RequestIDs.find(requestID);
if (iter != m_RequestIDs.end()) {
m_RequestIDs.erase(iter);
- emit requestFailed(gameName, modID, fileID, userData, error, errorMessage);
+ emit requestFailed(gameName, modID, fileID, userData, errorCode, errorMessage);
}
}
@@ -325,7 +325,7 @@ void NexusInterface::interpretNexusFileName(const QString &fileName, QString &mo
if (query) {
SelectionDialog selection(tr("Please pick the mod ID for \"%1\"").arg(fileName));
int index = 0;
- auto splits = fileName.split(QRegExp("[^0-9]"), QString::KeepEmptyParts);
+ auto splits = fileName.split(QRegularExpression("[^0-9]"), Qt::KeepEmptyParts);
for (auto substr : splits) {
bool ok = false;
int value = substr.toInt(&ok);
@@ -440,8 +440,8 @@ int NexusInterface::requestDescription(QString gameName, int modID, QObject *rec
connect(this, SIGNAL(nxmDescriptionAvailable(QString, int, QVariant, QVariant, int)),
receiver, SLOT(nxmDescriptionAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -461,8 +461,8 @@ int NexusInterface::requestModInfo(QString gameName, int modID, QObject *receive
connect(this, SIGNAL(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)),
receiver, SLOT(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -482,8 +482,8 @@ int NexusInterface::requestUpdateInfo(QString gameName, NexusInterface::UpdatePe
connect(this, SIGNAL(nxmUpdateInfoAvailable(QString, QVariant, QVariant, int)),
receiver, SLOT(nxmUpdateInfoAvailable(QString, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -509,8 +509,8 @@ int NexusInterface::requestUpdates(const int &modID, QObject *receiver, QVariant
connect(this, SIGNAL(nxmUpdatesAvailable(QString, int, QVariant, QVariant, int)),
receiver, SLOT(nxmUpdatesAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -544,8 +544,8 @@ int NexusInterface::requestFiles(QString gameName, int modID, QObject *receiver,
connect(this, SIGNAL(nxmFilesAvailable(QString, int, QVariant, QVariant, int)),
receiver, SLOT(nxmFilesAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -566,8 +566,8 @@ int NexusInterface::requestFileInfo(QString gameName, int modID, int fileID, QOb
connect(this, SIGNAL(nxmFileInfoAvailable(QString, int, int, QVariant, QVariant, int)),
receiver, SLOT(nxmFileInfoAvailable(QString, int, int, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -583,8 +583,8 @@ int NexusInterface::requestDownloadURL(QString gameName, int modID, int fileID,
connect(this, SIGNAL(nxmDownloadURLsAvailable(QString,int,int,QVariant,QVariant,int)),
receiver, SLOT(nxmDownloadURLsAvailable(QString,int,int,QVariant,QVariant,int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString,int,int,QVariant,int,QNetworkReply::NetworkError,QString)),
- receiver, SLOT(nxmRequestFailed(QString,int,int,QVariant,int,QNetworkReply::NetworkError,QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString,int,int,QVariant,int,int,QString)),
+ receiver, SLOT(nxmRequestFailed(QString,int,int,QVariant,int,int,QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -598,8 +598,8 @@ int NexusInterface::requestEndorsementInfo(QObject *receiver, QVariant userData,
connect(this, SIGNAL(nxmEndorsementsAvailable(QVariant, QVariant, int)),
receiver, SLOT(nxmEndorsementsAvailable(QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -620,8 +620,8 @@ int NexusInterface::requestToggleEndorsement(QString gameName, int modID, QStrin
connect(this, SIGNAL(nxmEndorsementToggled(QString, int, QVariant, QVariant, int)),
receiver, SLOT(nxmEndorsementToggled(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -635,8 +635,8 @@ int NexusInterface::requestTrackingInfo(QObject *receiver, QVariant userData, co
connect(this, SIGNAL(nxmTrackedModsAvailable(QVariant, QVariant, int)),
receiver, SLOT(nxmTrackedModsAvailable(QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -657,8 +657,8 @@ int NexusInterface::requestToggleTracking(QString gameName, int modID, bool trac
connect(this, SIGNAL(nxmTrackingToggled(QString, int, QVariant, bool, int)),
receiver, SLOT(nxmTrackingToggled(QString, int, QVariant, bool, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -676,8 +676,8 @@ int NexusInterface::requestInfoFromMd5(QString gameName, QByteArray &hash, QObje
connect(this, SIGNAL(nxmFileInfoFromMd5Available(QString, QVariant, QVariant, int)),
receiver, SLOT(nxmFileInfoFromMd5Available(QString, QVariant, QVariant, int)), Qt::UniqueConnection);
- connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)),
- receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection);
+ connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)),
+ receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, int, QString)), Qt::UniqueConnection);
nextRequest();
return requestInfo.m_ID;
@@ -842,7 +842,7 @@ void NexusInterface::nextRequest()
connect(info.m_Reply, SIGNAL(finished()), this, SLOT(requestFinished()));
if (!info.m_IgnoreGenericErrorHandler)
- connect(info.m_Reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError)));
+ connect(info.m_Reply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError)));
connect(info.m_Timeout, SIGNAL(timeout()), this, SLOT(requestTimeout()));
info.m_Timeout->start();
m_ActiveRequest.push_back(info);
@@ -861,6 +861,7 @@ void NexusInterface::requestFinished(std::list<NXMRequestInfo>::iterator iter)
auto error = reply->error();
if (error != QNetworkReply::NoError) {
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+ QString errorMsg = reply->errorString();
if (iter->m_AllowedErrors.contains(error) && iter->m_AllowedErrors[error].contains(statusCode)) {
// These errors are allows to silently happen. They should be handled in nxmRequestFailed below.
@@ -875,11 +876,20 @@ void NexusInterface::requestFinished(std::list<NXMRequestInfo>::iterator iter)
}
emit requestsChanged(getAPIStats(), m_User);
- log::warn("Error: {}", reply->errorString());
+ log::warn("Error: {}", errorMsg);
} else {
- log::warn("request failed: {}", reply->errorString());
+ QByteArray data = reply->readAll();
+ if (!data.isEmpty()) {
+ QJsonDocument responseDoc = QJsonDocument::fromJson(data);
+ if (!responseDoc.isNull()) {
+ auto result = responseDoc.toVariant().toMap();
+ auto error = result.find("error");
+ if (error != result.end())
+ errorMsg = result.value("error").toString();
+ }
+ }
}
- emit nxmRequestFailed(iter->m_GameName, iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, reply->error(), reply->errorString());
+ emit nxmRequestFailed(iter->m_GameName, iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, statusCode, errorMsg);
} else {
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode == 301) {
diff --git a/src/nexusinterface.h b/src/nexusinterface.h
index e188d0bf..8e33d51f 100644
--- a/src/nexusinterface.h
+++ b/src/nexusinterface.h
@@ -117,7 +117,7 @@ public slots:
void nxmEndorsementToggled(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID);
void nxmTrackedModsAvailable(QVariant userData, QVariant resultData, int requestID);
void nxmTrackingToggled(QString gameName, int modID, QVariant userData, bool tracked, int requestID);
- void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorMessage);
+ void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, int errorCode, const QString &errorMessage);
private:
@@ -479,7 +479,7 @@ signals:
void nxmEndorsementToggled(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID);
void nxmTrackedModsAvailable(QVariant userData, QVariant resultData, int requestID);
void nxmTrackingToggled(QString gameName, int modID, QVariant userData, bool tracked, int requestID);
- void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorString);
+ void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, int errorCode, const QString &errorString);
void requestsChanged(const APIStats& stats, const APIUserAccount& user);
public slots:
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index 001e1bb1..f98f2171 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -18,7 +18,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
*/
#include "nxmaccessmanager.h"
-#include "ui_validationprogressdialog.h"
#include "iplugingame.h"
#include "nexusinterface.h"
#include "nxmurl.h"
@@ -786,11 +785,6 @@ NXMAccessManager::NXMAccessManager(QObject *parent, Settings* s, const QString &
setCookieJar(new PersistentCookieJar(QDir::fromNativeSeparators(
m_Settings->paths().cache() + "/nexus_cookies.dat")));
}
-
- if (networkAccessible() == QNetworkAccessManager::UnknownAccessibility) {
- // why is this necessary all of a sudden?
- setNetworkAccessible(QNetworkAccessManager::Accessible);
- }
}
void NXMAccessManager::setTopLevelWidget(QWidget* w)
diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h
index 60100467..0812be40 100644
--- a/src/nxmaccessmanager.h
+++ b/src/nxmaccessmanager.h
@@ -21,6 +21,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#define NXMACCESSMANAGER_H
#include "apiuseraccount.h"
+#include "ui_validationprogressdialog.h"
#include <QNetworkAccessManager>
#include <QTimer>
#include <QNetworkReply>
@@ -31,7 +32,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <set>
namespace MOBase { class IPluginGame; }
-namespace Ui { class ValidationProgressDialog; }
class NXMAccessManager;
class Settings;
diff --git a/src/organizer_en.ts b/src/organizer_en.ts
index 76941496..25f7e86c 100644
--- a/src/organizer_en.ts
+++ b/src/organizer_en.ts
@@ -211,7 +211,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="browserdialog.cpp" line="208"/>
+ <location filename="browserdialog.cpp" line="210"/>
<source>failed to start download</source>
<translation type="unfinished"></translation>
</message>
@@ -664,7 +664,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>DirectoryRefresher</name>
<message>
- <location filename="directoryrefresher.cpp" line="462"/>
+ <location filename="directoryrefresher.cpp" line="460"/>
<source>failed to read mod (%1): %2</source>
<translation type="unfinished"></translation>
</message>
@@ -1002,32 +1002,32 @@ Are you absolutely sure you want to proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="530"/>
+ <location filename="downloadmanager.cpp" line="534"/>
<source>failed to download %1: could not open output file: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="553"/>
+ <location filename="downloadmanager.cpp" line="557"/>
<source>Download again?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="553"/>
+ <location filename="downloadmanager.cpp" line="557"/>
<source>A file with the same name &quot;%1&quot; has already been downloaded. Do you want to download it again? The new file will receive a different name.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="618"/>
+ <location filename="downloadmanager.cpp" line="622"/>
<source>Wrong Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="618"/>
+ <location filename="downloadmanager.cpp" line="622"/>
<source>The download link is for a mod for &quot;%1&quot; but this instance of MO has been set up for &quot;%2&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="626"/>
+ <location filename="downloadmanager.cpp" line="630"/>
<source>There is already a download queued for this file.
Mod %1
@@ -1035,12 +1035,12 @@ File %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="633"/>
+ <location filename="downloadmanager.cpp" line="637"/>
<source>Already Queued</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="642"/>
+ <location filename="downloadmanager.cpp" line="646"/>
<source>There is already a download started for this file.
Mod %1: %2
@@ -1048,282 +1048,287 @@ File %3: %4</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="677"/>
+ <location filename="downloadmanager.cpp" line="681"/>
<source>Already Started</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="706"/>
- <location filename="downloadmanager.cpp" line="840"/>
+ <location filename="downloadmanager.cpp" line="710"/>
+ <location filename="downloadmanager.cpp" line="844"/>
<source>remove: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="725"/>
+ <location filename="downloadmanager.cpp" line="729"/>
<source>failed to delete %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="732"/>
+ <location filename="downloadmanager.cpp" line="736"/>
<source>failed to delete meta file for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="793"/>
+ <location filename="downloadmanager.cpp" line="797"/>
<source>restore: invalid download index: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="862"/>
+ <location filename="downloadmanager.cpp" line="866"/>
<source>cancel: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="875"/>
+ <location filename="downloadmanager.cpp" line="879"/>
<source>pause: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="897"/>
+ <location filename="downloadmanager.cpp" line="901"/>
<source>resume: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="908"/>
+ <location filename="downloadmanager.cpp" line="912"/>
<source>resume (int): invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="932"/>
+ <location filename="downloadmanager.cpp" line="936"/>
<source>No known download urls. Sorry, this download can&apos;t be resumed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="973"/>
- <location filename="downloadmanager.cpp" line="1032"/>
+ <location filename="downloadmanager.cpp" line="976"/>
+ <location filename="downloadmanager.cpp" line="1035"/>
<source>query: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="995"/>
+ <location filename="downloadmanager.cpp" line="998"/>
<source>Please enter the nexus mod id</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="995"/>
+ <location filename="downloadmanager.cpp" line="998"/>
<source>Mod ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1006"/>
+ <location filename="downloadmanager.cpp" line="1009"/>
<source>Please select the source game code for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1065"/>
+ <location filename="downloadmanager.cpp" line="1068"/>
<source>Hashing download file &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1066"/>
+ <location filename="downloadmanager.cpp" line="1069"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1095"/>
+ <location filename="downloadmanager.cpp" line="1098"/>
<source>VisitNexus: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1116"/>
+ <location filename="downloadmanager.cpp" line="1119"/>
<source>Nexus ID for this Mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1123"/>
+ <location filename="downloadmanager.cpp" line="1126"/>
<source>OpenFile: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1167"/>
+ <location filename="downloadmanager.cpp" line="1170"/>
<source>OpenFileInDownloadsFolder: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1202"/>
+ <location filename="downloadmanager.cpp" line="1205"/>
<source>get pending: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1211"/>
+ <location filename="downloadmanager.cpp" line="1214"/>
<source>get path: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1220"/>
+ <location filename="downloadmanager.cpp" line="1223"/>
<source>Main</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1221"/>
+ <location filename="downloadmanager.cpp" line="1224"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1222"/>
+ <location filename="downloadmanager.cpp" line="1225"/>
<source>Optional</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1223"/>
+ <location filename="downloadmanager.cpp" line="1226"/>
<source>Old</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1224"/>
+ <location filename="downloadmanager.cpp" line="1227"/>
<source>Miscellaneous</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1225"/>
+ <location filename="downloadmanager.cpp" line="1228"/>
<source>Deleted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1226"/>
+ <location filename="downloadmanager.cpp" line="1229"/>
<source>Archived</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1227"/>
+ <location filename="downloadmanager.cpp" line="1230"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1234"/>
+ <location filename="downloadmanager.cpp" line="1237"/>
<source>display name: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1254"/>
+ <location filename="downloadmanager.cpp" line="1257"/>
<source>file name: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1263"/>
+ <location filename="downloadmanager.cpp" line="1266"/>
<source>file time: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1282"/>
+ <location filename="downloadmanager.cpp" line="1285"/>
<source>file size: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1292"/>
+ <location filename="downloadmanager.cpp" line="1295"/>
<source>progress: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1302"/>
+ <location filename="downloadmanager.cpp" line="1305"/>
<source>state: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1312"/>
+ <location filename="downloadmanager.cpp" line="1315"/>
<source>infocomplete: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1327"/>
- <location filename="downloadmanager.cpp" line="1335"/>
- <location filename="downloadmanager.cpp" line="1348"/>
+ <location filename="downloadmanager.cpp" line="1330"/>
+ <location filename="downloadmanager.cpp" line="1338"/>
+ <location filename="downloadmanager.cpp" line="1351"/>
<source>mod id: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1356"/>
+ <location filename="downloadmanager.cpp" line="1359"/>
<source>ishidden: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1365"/>
+ <location filename="downloadmanager.cpp" line="1368"/>
<source>file info: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1375"/>
+ <location filename="downloadmanager.cpp" line="1378"/>
<source>mark installed: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1420"/>
+ <location filename="downloadmanager.cpp" line="1423"/>
<source>mark uninstalled: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1592"/>
+ <location filename="downloadmanager.cpp" line="1585"/>
+ <source>%1% - %2 - ~%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="downloadmanager.cpp" line="1595"/>
<source>Memory allocation error (in processing progress event).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1602"/>
+ <location filename="downloadmanager.cpp" line="1605"/>
<source>Memory allocation error (in processing downloaded data).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1718"/>
+ <location filename="downloadmanager.cpp" line="1722"/>
<source>Information updated</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1720"/>
- <location filename="downloadmanager.cpp" line="1738"/>
+ <location filename="downloadmanager.cpp" line="1724"/>
+ <location filename="downloadmanager.cpp" line="1742"/>
<source>No matching file found on Nexus! Maybe this file is no longer available or it was renamed?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1722"/>
+ <location filename="downloadmanager.cpp" line="1726"/>
<source>No file on Nexus matches the selected file by name. Please manually choose the correct one.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1901"/>
+ <location filename="downloadmanager.cpp" line="1905"/>
<source>No download server available. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="2068"/>
+ <location filename="downloadmanager.cpp" line="2072"/>
<source>Failed to request file info from nexus: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="2095"/>
+ <location filename="downloadmanager.cpp" line="2099"/>
<source>Warning: Content type is: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="2100"/>
+ <location filename="downloadmanager.cpp" line="2104"/>
<source>Download header content length: %1 downloaded file size: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="2102"/>
+ <location filename="downloadmanager.cpp" line="2106"/>
<source>Download failed: %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="2124"/>
+ <location filename="downloadmanager.cpp" line="2128"/>
<source>We were unable to download the file due to errors after four retries. There may be an issue with the Nexus servers.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="2207"/>
+ <location filename="downloadmanager.cpp" line="2211"/>
<source>failed to re-open %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="2252"/>
+ <location filename="downloadmanager.cpp" line="2256"/>
<source>Unable to write download to drive (return %1).
Check the drive&apos;s available storage.
@@ -2109,6 +2114,133 @@ Right now the only case I know of where this needs to be overwritten is for the
</message>
</context>
<context>
+ <name>GamebryoModDataContent</name>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="12"/>
+ <source>Plugins (ESP/ESM/ESL)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="13"/>
+ <source>Optional Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="14"/>
+ <source>Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="15"/>
+ <source>Meshes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="16"/>
+ <source>Bethesda Archive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="17"/>
+ <source>Scripts (Papyrus)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="18"/>
+ <source>Script Extender Plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="19"/>
+ <source>Script Extender Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="20"/>
+ <source>SkyProc Patcher</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="21"/>
+ <source>Sound or Music</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="22"/>
+ <source>Textures</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="23"/>
+ <source>MCM Configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="24"/>
+ <source>INI Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="25"/>
+ <source>FaceGen Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryomoddatacontent.cpp" line="26"/>
+ <source>ModGroup Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GamebryoSaveGameInfoWidget</name>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.ui" line="39"/>
+ <source>Save #</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.ui" line="51"/>
+ <source>Character</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.ui" line="63"/>
+ <source>Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.ui" line="75"/>
+ <source>Location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.ui" line="87"/>
+ <source>Date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.cpp" line="72"/>
+ <source>Has Script Extender Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.cpp" line="77"/>
+ <source>Missing ESPs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.cpp" line="110"/>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.cpp" line="148"/>
+ <source>None</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegameinfowidget.cpp" line="116"/>
+ <source>Missing ESLs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>GeneralConflictsTab</name>
<message>
<location filename="modinfodialogconflicts.cpp" line="777"/>
@@ -2134,119 +2266,119 @@ Right now the only case I know of where this needs to be overwritten is for the
<context>
<name>InstallationManager</name>
<message>
- <location filename="installationmanager.cpp" line="134"/>
+ <location filename="installationmanager.cpp" line="133"/>
<source>Password required</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="135"/>
+ <location filename="installationmanager.cpp" line="134"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="295"/>
- <source>Extracting files</source>
+ <location filename="installationmanager.cpp" line="255"/>
+ <location filename="installationmanager.cpp" line="262"/>
+ <source>Extraction failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="256"/>
- <location filename="installationmanager.cpp" line="263"/>
- <source>Extraction failed: %1</source>
+ <location filename="installationmanager.cpp" line="294"/>
+ <source>Extracting files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="403"/>
+ <location filename="installationmanager.cpp" line="402"/>
<source>Failed to create backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="414"/>
+ <location filename="installationmanager.cpp" line="413"/>
<source>Mod Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="414"/>
+ <location filename="installationmanager.cpp" line="413"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="475"/>
+ <location filename="installationmanager.cpp" line="474"/>
<source>Invalid name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="476"/>
+ <location filename="installationmanager.cpp" line="475"/>
<source>The name you entered is invalid, please enter a different one.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="625"/>
+ <location filename="installationmanager.cpp" line="624"/>
<source>File format &quot;%1&quot; not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="756"/>
+ <location filename="installationmanager.cpp" line="755"/>
<source>Invalid file tree returned by plugin.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="805"/>
+ <location filename="installationmanager.cpp" line="804"/>
<source>Installation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="806"/>
+ <location filename="installationmanager.cpp" line="805"/>
<source>Something went wrong while installing this mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="829"/>
+ <location filename="installationmanager.cpp" line="828"/>
<source>None of the available installer plugins were able to handle that archive.
This is likely due to a corrupted or incompatible download or unrecognized archive format.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="840"/>
+ <location filename="installationmanager.cpp" line="839"/>
<source>no error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="843"/>
+ <location filename="installationmanager.cpp" line="842"/>
<source>7z.dll not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="846"/>
+ <location filename="installationmanager.cpp" line="845"/>
<source>7z.dll isn&apos;t valid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="849"/>
+ <location filename="installationmanager.cpp" line="848"/>
<source>archive not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="852"/>
+ <location filename="installationmanager.cpp" line="851"/>
<source>failed to open archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="855"/>
+ <location filename="installationmanager.cpp" line="854"/>
<source>unsupported archive type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="858"/>
+ <location filename="installationmanager.cpp" line="857"/>
<source>internal library error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="861"/>
+ <location filename="installationmanager.cpp" line="860"/>
<source>archive invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="865"/>
+ <location filename="installationmanager.cpp" line="864"/>
<source>unknown archive error</source>
<translation type="unfinished"></translation>
</message>
@@ -2264,11 +2396,6 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanagerdialog.ui" line="232"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="instancemanagerdialog.ui" line="59"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ModOrganizer2/modorganizer/wiki/Instances&quot;&gt;What is an instance?&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
@@ -2301,6 +2428,11 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="instancemanagerdialog.ui" line="232"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="instancemanagerdialog.ui" line="239"/>
<source>Game location</source>
<translation type="unfinished"></translation>
@@ -2331,13 +2463,13 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanagerdialog.ui" line="421"/>
- <source>Close</source>
+ <location filename="instancemanagerdialog.ui" line="410"/>
+ <source>Switch to this instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanagerdialog.ui" line="410"/>
- <source>Switch to this instance</source>
+ <location filename="instancemanagerdialog.ui" line="421"/>
+ <source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2576,32 +2708,32 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="275"/>
+ <location filename="moapplication.cpp" line="274"/>
<source>Failed to set up data paths.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="407"/>
+ <location filename="moapplication.cpp" line="406"/>
<source>Download started</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="424"/>
+ <location filename="moapplication.cpp" line="423"/>
<source>This shortcut or command line is for instance &apos;%1&apos;, but the current instance is &apos;%2&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="435"/>
+ <location filename="moapplication.cpp" line="434"/>
<source>This shortcut or command line is for profile &apos;%1&apos;, but the current profile is &apos;%2&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="569"/>
+ <location filename="moapplication.cpp" line="568"/>
<source>an error occurred: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="575"/>
+ <location filename="moapplication.cpp" line="574"/>
<source>an error occurred</source>
<translation type="unfinished"></translation>
</message>
@@ -2695,7 +2827,7 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
<context>
<name>MOBase::TutorialManager</name>
<message>
- <location filename="../../uibase/src/tutorialmanager.cpp" line="54"/>
+ <location filename="../../uibase/src/tutorialmanager.cpp" line="55"/>
<source>tutorial manager not set up yet</source>
<translation type="unfinished"></translation>
</message>
@@ -2936,6 +3068,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="mainwindow.ui" line="834"/>
+ <location filename="mainwindow.ui" line="837"/>
+ <source>Restore a backup.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="857"/>
+ <location filename="mainwindow.ui" line="860"/>
+ <source>Create a backup.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="887"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This provides statistics about the plugin list. The total number of active plugins is normally displayed. Other statistics may be accessed with the tooltip of this counter.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="914"/>
+ <location filename="mainwindow.ui" line="917"/>
+ <source>List of available esp/esm files.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="981"/>
+ <location filename="mainwindow.ui" line="984"/>
+ <source>Filter the list of plugins.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="mainwindow.ui" line="1003"/>
<location filename="mainwindow.ui" line="1169"/>
<source>Archives</source>
@@ -2970,6 +3131,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="mainwindow.ui" line="1087"/>
+ <location filename="mainwindow.ui" line="1090"/>
+ <source>Refresh the data structure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="mainwindow.ui" line="1093"/>
<location filename="mainwindow.ui" line="1296"/>
<source>Refresh</source>
@@ -2981,67 +3148,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1189"/>
- <source>Saves</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="1210"/>
- <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 is a list of all save games for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren&apos;t active now.&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; font-size:8pt;&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 click &amp;quot;Fix Mods...&amp;quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="1273"/>
- <source>Downloads</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="1339"/>
- <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="834"/>
- <location filename="mainwindow.ui" line="837"/>
- <source>Restore a backup.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="857"/>
- <location filename="mainwindow.ui" line="860"/>
- <source>Create a backup.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="887"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This provides statistics about the plugin list. The total number of active plugins is normally displayed. Other statistics may be accessed with the tooltip of this counter.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="914"/>
- <location filename="mainwindow.ui" line="917"/>
- <source>List of available esp/esm files.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="981"/>
- <location filename="mainwindow.ui" line="984"/>
- <source>Filter the list of plugins.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="1087"/>
- <location filename="mainwindow.ui" line="1090"/>
- <source>Refresh the data structure.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="mainwindow.ui" line="1147"/>
<location filename="mainwindow.ui" line="1150"/>
<source>Filter the list so that only conflicts are displayed.</source>
@@ -3065,17 +3171,49 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="mainwindow.ui" line="1189"/>
+ <source>Saves</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1210"/>
+ <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 is a list of all save games for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren&apos;t active now.&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; font-size:8pt;&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 click &amp;quot;Fix Mods...&amp;quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1253"/>
+ <location filename="mainwindow.cpp" line="1103"/>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="mainwindow.ui" line="1261"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="mainwindow.ui" line="1273"/>
+ <source>Downloads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="mainwindow.ui" line="1290"/>
<location filename="mainwindow.ui" line="1293"/>
<source>Refresh the downloads.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="mainwindow.ui" line="1339"/>
+ <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="1377"/>
<location filename="mainwindow.ui" line="1380"/>
<source>Show downloads marked as hidden.</source>
@@ -3253,6 +3391,14 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="mainwindow.ui" line="1736"/>
+ <location filename="mainwindow.ui" line="1739"/>
+ <location filename="mainwindow.ui" line="1742"/>
+ <location filename="mainwindow.ui" line="1745"/>
+ <source>Browse Mod Page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="mainwindow.ui" line="1760"/>
<location filename="mainwindow.ui" line="1763"/>
<source>&amp;Update Mod Organizer</source>
@@ -3300,7 +3446,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="mainwindow.ui" line="1823"/>
<location filename="mainwindow.ui" line="1826"/>
- <location filename="mainwindow.cpp" line="2749"/>
+ <location filename="mainwindow.cpp" line="2748"/>
<source>Endorse Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
@@ -3317,16 +3463,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1947"/>
- <source>&amp;Refresh</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="1950"/>
- <source>F5</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="mainwindow.ui" line="1849"/>
<location filename="mainwindow.ui" line="1852"/>
<source>E&amp;xit</source>
@@ -3384,432 +3520,428 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="362"/>
+ <location filename="mainwindow.ui" line="1947"/>
+ <source>&amp;Refresh</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1950"/>
+ <source>F5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="361"/>
<source>Toolbar and Menu</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="363"/>
+ <location filename="mainwindow.cpp" line="362"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="364"/>
+ <location filename="mainwindow.cpp" line="363"/>
<source>Start Menu</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="383"/>
+ <location filename="mainwindow.cpp" line="382"/>
<source>There is no supported sort mechanism for this game. You will probably have to use a third-party tool.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="602"/>
+ <location filename="mainwindow.cpp" line="601"/>
<source>Crash on exit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="603"/>
+ <location filename="mainwindow.cpp" line="602"/>
<source>MO crashed while exiting. Some settings may not be saved.
Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="903"/>
+ <location filename="mainwindow.cpp" line="902"/>
<source>There are notifications to read</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="922"/>
+ <location filename="mainwindow.cpp" line="921"/>
<source>There are no notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1020"/>
+ <location filename="mainwindow.cpp" line="1019"/>
<source>Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1024"/>
+ <location filename="mainwindow.cpp" line="1023"/>
<source>Won&apos;t Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1040"/>
+ <location filename="mainwindow.cpp" line="1039"/>
<source>Help on UI</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1044"/>
+ <location filename="mainwindow.cpp" line="1043"/>
<source>Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1048"/>
+ <location filename="mainwindow.cpp" line="1047"/>
<source>Chat on Discord</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1052"/>
+ <location filename="mainwindow.cpp" line="1051"/>
<source>Report Issue</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1056"/>
+ <location filename="mainwindow.cpp" line="1055"/>
<source>Tutorials</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1095"/>
+ <location filename="mainwindow.cpp" line="1094"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1096"/>
+ <location filename="mainwindow.cpp" line="1095"/>
<source>About Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1253"/>
<location filename="mainwindow.cpp" line="1104"/>
- <source>Name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.cpp" line="1105"/>
<source>Please enter a name for the new profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1113"/>
+ <location filename="mainwindow.cpp" line="1112"/>
<source>failed to create profile: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1149"/>
+ <location filename="mainwindow.cpp" line="1148"/>
<source>Show tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1150"/>
+ <location filename="mainwindow.cpp" line="1149"/>
<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="1155"/>
+ <location filename="mainwindow.cpp" line="1154"/>
<source>Never ask to show tutorials</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1305"/>
+ <location filename="mainwindow.cpp" line="1304"/>
<source>Downloads in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1306"/>
+ <location filename="mainwindow.cpp" line="1305"/>
<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="1363"/>
+ <location filename="mainwindow.cpp" line="1362"/>
<source>Plugin &quot;%1&quot; failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1366"/>
+ <location filename="mainwindow.cpp" line="1365"/>
<source>Plugin &quot;%1&quot; failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1736"/>
- <location filename="mainwindow.ui" line="1739"/>
- <location filename="mainwindow.ui" line="1742"/>
- <location filename="mainwindow.ui" line="1745"/>
- <source>Browse Mod Page</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.cpp" line="1733"/>
+ <location filename="mainwindow.cpp" line="1732"/>
<source>&lt;Edit...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1744"/>
+ <location filename="mainwindow.cpp" line="1743"/>
<source>(no executables)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1898"/>
+ <location filename="mainwindow.cpp" line="1897"/>
<source>This bsa is enabled in the ini file so it may be required!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1949"/>
+ <location filename="mainwindow.cpp" line="1948"/>
<source>Activating Network Proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2042"/>
+ <location filename="mainwindow.cpp" line="2041"/>
<source>Notice: Your current MO version (%1) is lower than the previously used one (%2). The GUI may not downgrade gracefully, so you may experience oddities. However, there should be no serious issues.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2182"/>
+ <location filename="mainwindow.cpp" line="2181"/>
<source>Start Tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2183"/>
+ <location filename="mainwindow.cpp" line="2182"/>
<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="2308"/>
+ <location filename="mainwindow.cpp" line="2307"/>
<source>failed to change origin name: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2332"/>
+ <location filename="mainwindow.cpp" line="2331"/>
<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="2454"/>
+ <location filename="mainwindow.cpp" line="2453"/>
<source>Open Game folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2455"/>
+ <location filename="mainwindow.cpp" line="2454"/>
<source>Open MyGames folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2456"/>
+ <location filename="mainwindow.cpp" line="2455"/>
<source>Open INIs folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2461"/>
+ <location filename="mainwindow.cpp" line="2460"/>
<source>Open Instance folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2462"/>
+ <location filename="mainwindow.cpp" line="2461"/>
<source>Open Mods folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2463"/>
+ <location filename="mainwindow.cpp" line="2462"/>
<source>Open Profile folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2464"/>
+ <location filename="mainwindow.cpp" line="2463"/>
<source>Open Downloads folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2470"/>
+ <location filename="mainwindow.cpp" line="2469"/>
<source>Open MO2 Install folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2471"/>
+ <location filename="mainwindow.cpp" line="2470"/>
<source>Open MO2 Plugins folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2472"/>
+ <location filename="mainwindow.cpp" line="2471"/>
<source>Open MO2 Stylesheets folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2473"/>
+ <location filename="mainwindow.cpp" line="2472"/>
<source>Open MO2 Logs folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2552"/>
+ <location filename="mainwindow.cpp" line="2551"/>
<source>Restart Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2554"/>
+ <location filename="mainwindow.cpp" line="2553"/>
<source>Mod Organizer must restart to finish configuration changes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2556"/>
+ <location filename="mainwindow.cpp" line="2555"/>
<source>Restart</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2557"/>
+ <location filename="mainwindow.cpp" line="2556"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2557"/>
+ <location filename="mainwindow.cpp" line="2556"/>
<source>Some things might be weird.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2582"/>
+ <location filename="mainwindow.cpp" line="2581"/>
<source>Can&apos;t change download directory while downloads are in progress!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2715"/>
+ <location filename="mainwindow.cpp" line="2714"/>
<source>Update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2750"/>
+ <location filename="mainwindow.cpp" line="2749"/>
<source>Do you want to endorse Mod Organizer on %1 now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2764"/>
+ <location filename="mainwindow.cpp" line="2763"/>
<source>Abstain from Endorsing Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2765"/>
+ <location filename="mainwindow.cpp" line="2764"/>
<source>Are you sure you want to abstain from endorsing Mod Organizer 2?
You will have to visit the mod page on the %1 Nexus site to change your mind.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2792"/>
+ <location filename="mainwindow.cpp" line="2791"/>
<source>Thank you for endorsing MO2! :)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2798"/>
+ <location filename="mainwindow.cpp" line="2797"/>
<source>Please reconsider endorsing MO2 on Nexus!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2903"/>
+ <location filename="mainwindow.cpp" line="2902"/>
<source>None of your %1 mods appear to have had recent file updates.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2914"/>
+ <location filename="mainwindow.cpp" line="2913"/>
<source>All of your mods have been checked recently. We restrict update checks to help preserve your available API requests.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3133"/>
+ <location filename="mainwindow.cpp" line="3132"/>
<source>Thank you!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3133"/>
+ <location filename="mainwindow.cpp" line="3132"/>
<source>Thank you for your endorsement!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3224"/>
+ <location filename="mainwindow.cpp" line="3223"/>
<source>Mod ID %1 no longer seems to be available on Nexus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3240"/>
- <source>Request to Nexus failed: %1</source>
+ <location filename="mainwindow.cpp" line="3239"/>
+ <source>Error %1: Request to Nexus failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3255"/>
- <location filename="mainwindow.cpp" line="3318"/>
+ <location filename="mainwindow.cpp" line="3254"/>
+ <location filename="mainwindow.cpp" line="3317"/>
<source>failed to read %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3267"/>
+ <location filename="mainwindow.cpp" line="3266"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3267"/>
+ <location filename="mainwindow.cpp" line="3266"/>
<source>failed to extract %1 (errorcode %2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3300"/>
+ <location filename="mainwindow.cpp" line="3299"/>
<source>Extract BSA</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3329"/>
+ <location filename="mainwindow.cpp" line="3328"/>
<source>This archive contains invalid hashes. Some files may be broken.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3339"/>
+ <location filename="mainwindow.cpp" line="3338"/>
<source>Extract...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3409"/>
+ <location filename="mainwindow.cpp" line="3408"/>
<source>Remove &apos;%1&apos; from the toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3464"/>
+ <location filename="mainwindow.cpp" line="3463"/>
<source>Backup of load order created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3474"/>
+ <location filename="mainwindow.cpp" line="3473"/>
<source>Choose backup to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3487"/>
+ <location filename="mainwindow.cpp" line="3488"/>
<source>No Backups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3487"/>
+ <location filename="mainwindow.cpp" line="3488"/>
<source>There are no backups to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3512"/>
- <location filename="mainwindow.cpp" line="3537"/>
+ <location filename="mainwindow.cpp" line="3513"/>
+ <location filename="mainwindow.cpp" line="3538"/>
<source>Restore failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3513"/>
- <location filename="mainwindow.cpp" line="3538"/>
+ <location filename="mainwindow.cpp" line="3514"/>
+ <location filename="mainwindow.cpp" line="3539"/>
<source>Failed to restore the backup. Errorcode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3525"/>
+ <location filename="mainwindow.cpp" line="3526"/>
<source>Backup of mod list created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3608"/>
+ <location filename="mainwindow.cpp" line="3609"/>
<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="3610"/>
+ <location filename="mainwindow.cpp" line="3611"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3611"/>
+ <location filename="mainwindow.cpp" line="3612"/>
<source>Rename new file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3612"/>
+ <location filename="mainwindow.cpp" line="3613"/>
<source>Ignore file</source>
<translation type="unfinished"></translation>
</message>
@@ -4956,277 +5088,277 @@ Please enter the name:</source>
<context>
<name>ModListViewActions</name>
<message>
- <location filename="modlistviewactions.cpp" line="106"/>
+ <location filename="modlistviewactions.cpp" line="105"/>
<source>Choose Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="107"/>
+ <location filename="modlistviewactions.cpp" line="106"/>
<source>Mod Archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="129"/>
+ <location filename="modlistviewactions.cpp" line="128"/>
<location filename="modlistviewactions.cpp" line="1198"/>
<source>Create Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="130"/>
+ <location filename="modlistviewactions.cpp" line="129"/>
<source>This will create an empty mod.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="139"/>
+ <location filename="modlistviewactions.cpp" line="138"/>
<location filename="modlistviewactions.cpp" line="1208"/>
<source>A mod with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="166"/>
+ <location filename="modlistviewactions.cpp" line="165"/>
<source>Create Separator...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="167"/>
+ <location filename="modlistviewactions.cpp" line="166"/>
<source>This will create a new separator.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="173"/>
+ <location filename="modlistviewactions.cpp" line="172"/>
<source>A separator with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="219"/>
+ <location filename="modlistviewactions.cpp" line="218"/>
<source>Really enable %1 mod(s)?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="219"/>
+ <location filename="modlistviewactions.cpp" line="218"/>
<source>Really disable %1 mod(s)?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="220"/>
- <location filename="modlistviewactions.cpp" line="724"/>
- <location filename="modlistviewactions.cpp" line="957"/>
+ <location filename="modlistviewactions.cpp" line="219"/>
+ <location filename="modlistviewactions.cpp" line="723"/>
+ <location filename="modlistviewactions.cpp" line="956"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="239"/>
- <location filename="modlistviewactions.cpp" line="283"/>
+ <location filename="modlistviewactions.cpp" line="238"/>
+ <location filename="modlistviewactions.cpp" line="282"/>
<source>You are not currently authenticated with Nexus. Please do so under Settings -&gt; Nexus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="301"/>
+ <location filename="modlistviewactions.cpp" line="300"/>
<source>Export to csv</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="304"/>
+ <location filename="modlistviewactions.cpp" line="303"/>
<source>CSV (Comma Separated Values) is a format that can be imported in programs like Excel to create a spreadsheet.
You can also use online editors and converters instead.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="307"/>
+ <location filename="modlistviewactions.cpp" line="306"/>
<source>Select what mods you want export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="308"/>
+ <location filename="modlistviewactions.cpp" line="307"/>
<source>All installed mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="309"/>
+ <location filename="modlistviewactions.cpp" line="308"/>
<source>Only active (checked) mods from your current profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="310"/>
+ <location filename="modlistviewactions.cpp" line="309"/>
<source>All currently visible mods in the mod list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="327"/>
+ <location filename="modlistviewactions.cpp" line="326"/>
<source>Choose what Columns to export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="330"/>
+ <location filename="modlistviewactions.cpp" line="329"/>
<source>Mod_Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="332"/>
+ <location filename="modlistviewactions.cpp" line="331"/>
<source>Mod_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="334"/>
+ <location filename="modlistviewactions.cpp" line="333"/>
<source>Notes_column</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="335"/>
+ <location filename="modlistviewactions.cpp" line="334"/>
<source>Mod_Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="337"/>
+ <location filename="modlistviewactions.cpp" line="336"/>
<source>Primary_Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="338"/>
+ <location filename="modlistviewactions.cpp" line="337"/>
<source>Nexus_ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="339"/>
+ <location filename="modlistviewactions.cpp" line="338"/>
<source>Mod_Nexus_URL</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="340"/>
+ <location filename="modlistviewactions.cpp" line="339"/>
<source>Mod_Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="341"/>
+ <location filename="modlistviewactions.cpp" line="340"/>
<source>Install_Date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="342"/>
+ <location filename="modlistviewactions.cpp" line="341"/>
<source>Download_File_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="450"/>
+ <location filename="modlistviewactions.cpp" line="449"/>
<source>export failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="501"/>
+ <location filename="modlistviewactions.cpp" line="500"/>
<source>Failed to display overwrite dialog: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="562"/>
+ <location filename="modlistviewactions.cpp" line="561"/>
<source>Set Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="562"/>
+ <location filename="modlistviewactions.cpp" line="561"/>
<source>Set the priority of the selected mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="690"/>
+ <location filename="modlistviewactions.cpp" line="689"/>
<source>failed to rename mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="725"/>
+ <location filename="modlistviewactions.cpp" line="724"/>
<source>Remove the following mods?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="742"/>
+ <location filename="modlistviewactions.cpp" line="741"/>
<source>failed to remove mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="767"/>
+ <location filename="modlistviewactions.cpp" line="766"/>
<source>Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="768"/>
+ <location filename="modlistviewactions.cpp" line="767"/>
<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="modlistviewactions.cpp" line="788"/>
+ <location filename="modlistviewactions.cpp" line="787"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="789"/>
+ <location filename="modlistviewactions.cpp" line="788"/>
<source>I don&apos;t know a versioning scheme where %1 is newer than %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="808"/>
+ <location filename="modlistviewactions.cpp" line="807"/>
<source>Opening Nexus Links</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="809"/>
+ <location filename="modlistviewactions.cpp" line="808"/>
<source>You are trying to open %1 links to Nexus Mods. Are you sure you want to do this?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="831"/>
- <location filename="modlistviewactions.cpp" line="851"/>
+ <location filename="modlistviewactions.cpp" line="830"/>
+ <location filename="modlistviewactions.cpp" line="850"/>
<source>Opening Web Pages</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="832"/>
- <location filename="modlistviewactions.cpp" line="852"/>
+ <location filename="modlistviewactions.cpp" line="831"/>
+ <location filename="modlistviewactions.cpp" line="851"/>
<source>You are trying to open %1 Web Pages. Are you sure you want to do this?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="903"/>
- <location filename="modlistviewactions.cpp" line="907"/>
- <location filename="modlistviewactions.cpp" line="917"/>
+ <location filename="modlistviewactions.cpp" line="902"/>
+ <location filename="modlistviewactions.cpp" line="906"/>
+ <location filename="modlistviewactions.cpp" line="916"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="903"/>
+ <location filename="modlistviewactions.cpp" line="902"/>
<source>Installation file no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="908"/>
+ <location filename="modlistviewactions.cpp" line="907"/>
<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="modlistviewactions.cpp" line="918"/>
+ <location filename="modlistviewactions.cpp" line="917"/>
<source>Failed to create backup.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="958"/>
+ <location filename="modlistviewactions.cpp" line="957"/>
<source>Restore all hidden files in the following mods?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="986"/>
+ <location filename="modlistviewactions.cpp" line="985"/>
<location filename="modlistviewactions.cpp" line="1267"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="987"/>
+ <location filename="modlistviewactions.cpp" line="986"/>
<source>About to restore all hidden files in:
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlistviewactions.cpp" line="1018"/>
+ <location filename="modlistviewactions.cpp" line="1017"/>
<source>Endorsing multiple mods will take a while. Please wait...</source>
<translation type="unfinished"></translation>
</message>
@@ -5347,12 +5479,12 @@ Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nexusinterface.cpp" line="897"/>
+ <location filename="nexusinterface.cpp" line="907"/>
<source>empty response</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nexusinterface.cpp" line="955"/>
+ <location filename="nexusinterface.cpp" line="965"/>
<source>invalid response</source>
<translation type="unfinished"></translation>
</message>
@@ -5576,82 +5708,82 @@ Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1446"/>
+ <location filename="organizercore.cpp" line="1449"/>
<source>Download?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1447"/>
+ <location filename="organizercore.cpp" line="1450"/>
<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="1668"/>
- <location filename="organizercore.cpp" line="1719"/>
+ <location filename="organizercore.cpp" line="1671"/>
+ <location filename="organizercore.cpp" line="1722"/>
<source>failed to update mod list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1726"/>
- <location filename="organizercore.cpp" line="1743"/>
+ <location filename="organizercore.cpp" line="1729"/>
+ <location filename="organizercore.cpp" line="1746"/>
<source>login successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1753"/>
+ <location filename="organizercore.cpp" line="1756"/>
<source>Login failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1754"/>
+ <location filename="organizercore.cpp" line="1757"/>
<source>Login failed, try again?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1763"/>
+ <location filename="organizercore.cpp" line="1766"/>
<source>login failed: %1. Download will not be associated with an account</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1771"/>
+ <location filename="organizercore.cpp" line="1774"/>
<source>login failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1781"/>
+ <location filename="organizercore.cpp" line="1784"/>
<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="1828"/>
+ <location filename="organizercore.cpp" line="1831"/>
<source>MO1 &quot;Script Extender&quot; load mechanism has left hook.dll in your game folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1831"/>
- <location filename="organizercore.cpp" line="1847"/>
+ <location filename="organizercore.cpp" line="1834"/>
+ <location filename="organizercore.cpp" line="1850"/>
<source>Description missing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1840"/>
+ <location filename="organizercore.cpp" line="1843"/>
<source>&lt;a href=&quot;%1&quot;&gt;hook.dll&lt;/a&gt; has been found in your game folder (right click to copy the full path). This is most likely a leftover of setting the ModOrganizer 1 load mechanism to &quot;Script Extender&quot;, in which case you must remove this file either by changing the load mechanism in ModOrganizer 1 or manually removing the file, otherwise the game is likely to crash and burn.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1874"/>
+ <location filename="organizercore.cpp" line="1877"/>
<source>failed to save load order: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1952"/>
+ <location filename="organizercore.cpp" line="1955"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2026"/>
+ <location filename="organizercore.cpp" line="2029"/>
<source>The designated write target &quot;%1&quot; is not enabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -5826,138 +5958,138 @@ Continue?</source>
<context>
<name>PluginList</name>
<message>
- <location filename="pluginlist.cpp" line="118"/>
+ <location filename="pluginlist.cpp" line="96"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="119"/>
+ <location filename="pluginlist.cpp" line="97"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="120"/>
+ <location filename="pluginlist.cpp" line="98"/>
<source>Mod Index</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="121"/>
+ <location filename="pluginlist.cpp" line="99"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="122"/>
- <location filename="pluginlist.cpp" line="135"/>
+ <location filename="pluginlist.cpp" line="100"/>
+ <location filename="pluginlist.cpp" line="113"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="130"/>
+ <location filename="pluginlist.cpp" line="108"/>
<source>Name of the plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="131"/>
+ <location filename="pluginlist.cpp" line="109"/>
<source>Emblems to highlight things that might require attention.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="132"/>
+ <location filename="pluginlist.cpp" line="110"/>
<source>Load priority of plugins. 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="134"/>
+ <location filename="pluginlist.cpp" line="112"/>
<source>Determines the formids of objects originating from this mods.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="248"/>
+ <location filename="pluginlist.cpp" line="226"/>
<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="326"/>
+ <location filename="pluginlist.cpp" line="385"/>
<source>Plugin not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1121"/>
+ <location filename="pluginlist.cpp" line="1196"/>
<source>Origin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1126"/>
+ <location filename="pluginlist.cpp" line="1201"/>
<source>This plugin can&apos;t be disabled (enforced by the game).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1131"/>
+ <location filename="pluginlist.cpp" line="1206"/>
<source>Author</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1137"/>
+ <location filename="pluginlist.cpp" line="1212"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1143"/>
+ <location filename="pluginlist.cpp" line="1218"/>
<source>Missing Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1154"/>
+ <location filename="pluginlist.cpp" line="1229"/>
<source>Enabled Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1160"/>
+ <location filename="pluginlist.cpp" line="1235"/>
<source>Loads Archives</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1162"/>
+ <location filename="pluginlist.cpp" line="1237"/>
<source>There are Archives connected to this plugin. Their assets will be added to your game, overwriting in case of conflicts following the plugin order. Loose files will always overwrite assets from Archives. (This flag only checks for Archives from the same mod as the plugin)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1172"/>
+ <location filename="pluginlist.cpp" line="1247"/>
<source>Loads INI settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1173"/>
+ <location filename="pluginlist.cpp" line="1248"/>
<source>There is an ini file connected to this plugin. Its settings will be added to your game settings, overwriting in case of conflicts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1180"/>
+ <location filename="pluginlist.cpp" line="1255"/>
<source>This ESP is flagged as an ESL. It will adhere to the ESP load order but the records will be loaded in ESL space.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1214"/>
+ <location filename="pluginlist.cpp" line="1289"/>
<source>Incompatible with %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1220"/>
+ <location filename="pluginlist.cpp" line="1295"/>
<source>Depends on missing %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1229"/>
+ <location filename="pluginlist.cpp" line="1304"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1233"/>
+ <location filename="pluginlist.cpp" line="1308"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1477"/>
+ <location filename="pluginlist.cpp" line="1585"/>
<source>failed to restore load order for %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6542,292 +6674,327 @@ p, li { white-space: pre-wrap; }
<context>
<name>QObject</name>
<message>
- <location filename="../../uibase/src/filterwidget.cpp" line="127"/>
- <source>Filter</source>
+ <location filename="apiuseraccount.cpp" line="8"/>
+ <source>Regular</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/registry.cpp" line="42"/>
- <location filename="../../uibase/src/registry.cpp" line="43"/>
- <location filename="../../uibase/src/textviewer.cpp" line="158"/>
- <location filename="../../uibase/src/textviewer.cpp" line="159"/>
- <source>INI file is read-only</source>
+ <location filename="apiuseraccount.cpp" line="11"/>
+ <source>Premium</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/registry.cpp" line="44"/>
- <location filename="../../uibase/src/textviewer.cpp" line="160"/>
- <source>Mod Organizer is attempting to write to &quot;%1&quot; which is currently set to read-only.</source>
+ <location filename="apiuseraccount.cpp" line="15"/>
+ <location filename="settingsdialogdiagnostics.cpp" line="81"/>
+ <source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/registry.cpp" line="47"/>
- <location filename="../../uibase/src/textviewer.cpp" line="163"/>
- <source>Clear the read-only flag</source>
+ <location filename="categories.cpp" line="150"/>
+ <source>Failed to save custom categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/registry.cpp" line="50"/>
- <location filename="../../uibase/src/textviewer.cpp" line="166"/>
- <source>Allow the write once</source>
+ <location filename="categories.cpp" line="272"/>
+ <location filename="categories.cpp" line="321"/>
+ <location filename="categories.cpp" line="331"/>
+ <location filename="categories.cpp" line="377"/>
+ <source>invalid category index: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/registry.cpp" line="51"/>
- <location filename="../../uibase/src/textviewer.cpp" line="167"/>
- <source>The file will be set to read-only again.</source>
+ <location filename="categories.cpp" line="342"/>
+ <source>Active</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/registry.cpp" line="54"/>
- <location filename="../../uibase/src/textviewer.cpp" line="170"/>
- <source>Skip this file</source>
+ <location filename="categories.cpp" line="343"/>
+ <source>Update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/report.cpp" line="66"/>
- <location filename="../../uibase/src/report.cpp" line="73"/>
- <location filename="settingsdialogpaths.cpp" line="70"/>
- <location filename="settingsdialogpaths.cpp" line="192"/>
- <location filename="settingsdialogdiagnostics.cpp" line="37"/>
- <location filename="settingsdialogdiagnostics.cpp" line="61"/>
- <location filename="organizercore.cpp" line="384"/>
- <location filename="loot.cpp" line="413"/>
- <location filename="loglist.cpp" line="372"/>
- <source>Error</source>
+ <location filename="categories.cpp" line="344"/>
+ <source>Has category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/report.cpp" line="349"/>
- <source>You can reset these choices by clicking &quot;Reset Dialog Choices&quot; in the General tab of the Settings</source>
+ <location filename="categories.cpp" line="345"/>
+ <source>Conflicted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/report.cpp" line="358"/>
- <source>Always ask</source>
+ <location filename="categories.cpp" line="346"/>
+ <source>Has hidden files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/report.cpp" line="359"/>
- <location filename="../../uibase/src/report.cpp" line="366"/>
- <source>Remember my choice</source>
+ <location filename="categories.cpp" line="347"/>
+ <source>Endorsed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/report.cpp" line="360"/>
- <source>Remember my choice for %1</source>
+ <location filename="categories.cpp" line="348"/>
+ <source>Has backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/safewritefile.cpp" line="43"/>
- <source>Failed to save &apos;{}&apos;, could not create a temporary file: {} (error {})</source>
+ <location filename="categories.cpp" line="349"/>
+ <source>Managed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="60"/>
- <source>removal of &quot;%1&quot; failed: %2</source>
+ <location filename="categories.cpp" line="350"/>
+ <source>Has valid game data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="67"/>
- <source>removal of &quot;%1&quot; failed</source>
+ <location filename="categories.cpp" line="351"/>
+ <source>Has Nexus ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="71"/>
- <source>&quot;%1&quot; doesn&apos;t exist (remove)</source>
+ <location filename="categories.cpp" line="352"/>
+ <source>Tracked on Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="313"/>
- <source>Error %1</source>
+ <location filename="categories.cpp" line="388"/>
+ <source>invalid category id: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="501"/>
- <location filename="../../uibase/src/utility.cpp" line="524"/>
- <source>You have an invalid custom browser command in the settings.</source>
+ <location filename="colortable.cpp" line="241"/>
+ <source>Is overwritten (loose files)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="642"/>
- <location filename="../../uibase/src/utility.cpp" line="667"/>
- <source>failed to create directory &quot;%1&quot;</source>
+ <location filename="colortable.cpp" line="247"/>
+ <source>Is overwriting (loose files)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="651"/>
- <location filename="../../uibase/src/utility.cpp" line="674"/>
- <source>failed to copy &quot;%1&quot; to &quot;%2&quot;</source>
+ <location filename="colortable.cpp" line="253"/>
+ <source>Is overwritten (archives)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1073"/>
- <source>%1 B</source>
+ <location filename="colortable.cpp" line="259"/>
+ <source>Is overwriting (archives)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1075"/>
- <source>%1 MB</source>
+ <location filename="colortable.cpp" line="265"/>
+ <source>Mod contains selected plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1076"/>
- <source>%1 GB</source>
+ <location filename="colortable.cpp" line="271"/>
+ <source>Plugin is contained in selected mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1077"/>
- <source>%1 TB</source>
+ <location filename="commandline.cpp" line="320"/>
+ <source>failed to start application: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1087"/>
- <source>%1 GB/s</source>
+ <location filename="commandline.cpp" line="817"/>
+ <source>Executable &apos;%1&apos; not found in instance &apos;%2&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1088"/>
- <source>%1 TB/s</source>
+ <location filename="commandline.cpp" line="843"/>
+ <source>Failed to run &apos;%1&apos;. The logs might have more information.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1074"/>
- <source>%1 KB</source>
+ <location filename="commandline.cpp" line="852"/>
+ <source>Failed to run &apos;%1&apos;. The logs might have more information. %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1084"/>
- <source>%1 B/s</source>
+ <location filename="createinstancedialog.cpp" line="88"/>
+ <source>Creating %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1085"/>
- <source>%1 KB/s</source>
+ <location filename="createinstancedialogpages.cpp" line="32"/>
+ <source>Global</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/utility.cpp" line="1086"/>
- <source>%1 MB/s</source>
+ <location filename="createinstancedialogpages.cpp" line="35"/>
+ <location filename="instancemanager.cpp" line="55"/>
+ <location filename="moshortcut.cpp" line="40"/>
+ <source>Portable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="apiuseraccount.cpp" line="8"/>
- <source>Regular</source>
+ <location filename="createinstancedialogpages.cpp" line="38"/>
+ <location filename="createinstancedialogpages.cpp" line="1244"/>
+ <source>Instance type: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="apiuseraccount.cpp" line="11"/>
- <source>Premium</source>
+ <location filename="createinstancedialogpages.cpp" line="38"/>
+ <source>?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialogdiagnostics.cpp" line="81"/>
- <location filename="apiuseraccount.cpp" line="15"/>
- <source>None</source>
+ <location filename="createinstancedialogpages.cpp" line="302"/>
+ <source>Find game installation for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="150"/>
- <source>Failed to save custom categories</source>
+ <location filename="createinstancedialogpages.cpp" line="352"/>
+ <source>Find game installation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="272"/>
- <location filename="categories.cpp" line="321"/>
- <location filename="categories.cpp" line="331"/>
- <location filename="categories.cpp" line="377"/>
- <source>invalid category index: %1</source>
+ <location filename="createinstancedialogpages.cpp" line="401"/>
+ <location filename="createinstancedialogpages.cpp" line="690"/>
+ <location filename="createinstancedialogpages.cpp" line="691"/>
+ <source>Unrecognized game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="342"/>
- <source>Active</source>
+ <location filename="createinstancedialogpages.cpp" line="402"/>
+ <source>The folder %1 does not seem to contain a game Mod Organizer can manage.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="343"/>
- <source>Update available</source>
+ <location filename="createinstancedialogpages.cpp" line="406"/>
+ <source>See details for the list of supported games.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="344"/>
- <source>Has category</source>
+ <location filename="createinstancedialogpages.cpp" line="483"/>
+ <source>No installation found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="345"/>
- <source>Conflicted</source>
+ <location filename="createinstancedialogpages.cpp" line="554"/>
+ <source>Browse...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="346"/>
- <source>Has hidden files</source>
+ <location filename="createinstancedialogpages.cpp" line="556"/>
+ <source>The folder must contain a valid game installation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="347"/>
- <source>Endorsed</source>
+ <location filename="createinstancedialogpages.cpp" line="667"/>
+ <location filename="createinstancedialogpages.cpp" line="668"/>
+ <source>Microsoft Store game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="348"/>
- <source>Has backup</source>
+ <location filename="createinstancedialogpages.cpp" line="669"/>
+ <source>The folder %1 seems to be a Microsoft Store game install. Games installed through the Microsoft Store are not supported by Mod Organizer and will not work properly.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="349"/>
- <source>Managed</source>
+ <location filename="createinstancedialogpages.cpp" line="675"/>
+ <location filename="createinstancedialogpages.cpp" line="699"/>
+ <location filename="createinstancedialogpages.cpp" line="729"/>
+ <source>Use this folder for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="350"/>
- <source>Has valid game data</source>
+ <location filename="createinstancedialogpages.cpp" line="676"/>
+ <source>Use this folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="351"/>
- <source>Has Nexus ID</source>
+ <location filename="createinstancedialogpages.cpp" line="677"/>
+ <location filename="createinstancedialogpages.cpp" line="700"/>
+ <location filename="createinstancedialogpages.cpp" line="730"/>
+ <source>I know what I&apos;m doing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="352"/>
- <source>Tracked on Nexus</source>
+ <location filename="createinstancedialogpages.cpp" line="680"/>
+ <location filename="createinstancedialogpages.cpp" line="703"/>
+ <location filename="createinstancedialogpages.cpp" line="733"/>
+ <location filename="settingsdialognexus.cpp" line="268"/>
+ <location filename="settingsdialognexus.cpp" line="276"/>
+ <location filename="settingsdialogworkarounds.cpp" line="139"/>
+ <location filename="spawn.cpp" line="199"/>
+ <location filename="spawn.cpp" line="228"/>
+ <location filename="spawn.cpp" line="307"/>
+ <location filename="spawn.cpp" line="336"/>
+ <location filename="spawn.cpp" line="367"/>
+ <location filename="spawn.cpp" line="394"/>
+ <location filename="spawn.cpp" line="430"/>
+ <location filename="uilocker.cpp" line="361"/>
+ <source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="categories.cpp" line="388"/>
- <source>invalid category id: %1</source>
+ <location filename="createinstancedialogpages.cpp" line="692"/>
+ <source>The folder %1 does not seem to contain an installation for &lt;span style=&quot;white-space: nowrap; font-weight: bold;&quot;&gt;%2&lt;/span&gt; or for any other game Mod Organizer can manage.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="colortable.cpp" line="241"/>
- <source>Is overwritten (loose files)</source>
+ <location filename="createinstancedialogpages.cpp" line="715"/>
+ <location filename="createinstancedialogpages.cpp" line="716"/>
+ <source>Incorrect game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="colortable.cpp" line="247"/>
- <source>Is overwriting (loose files)</source>
+ <location filename="createinstancedialogpages.cpp" line="717"/>
+ <source>The folder %1 seems to contain an installation for &lt;span style=&quot;white-space: nowrap; font-weight: bold;&quot;&gt;%2&lt;/span&gt;, not &lt;span style=&quot;white-space: nowrap; font-weight: bold;&quot;&gt;%3&lt;/span&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="colortable.cpp" line="253"/>
- <source>Is overwritten (archives)</source>
+ <location filename="createinstancedialogpages.cpp" line="726"/>
+ <source>Manage %1 instead</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="colortable.cpp" line="259"/>
- <source>Is overwriting (archives)</source>
+ <location filename="createinstancedialogpages.cpp" line="1247"/>
+ <source>Instance location: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="colortable.cpp" line="265"/>
- <source>Mod contains selected plugin</source>
+ <location filename="createinstancedialogpages.cpp" line="1251"/>
+ <source>Instance name: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="colortable.cpp" line="271"/>
- <source>Plugin is contained in selected mod</source>
+ <location filename="createinstancedialogpages.cpp" line="1257"/>
+ <location filename="createinstancedialogpages.cpp" line="1261"/>
+ <source>Base directory: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="createinstancedialogpages.cpp" line="1262"/>
+ <source>Downloads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="createinstancedialogpages.cpp" line="1263"/>
+ <source>Mods</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="createinstancedialogpages.cpp" line="1264"/>
+ <source>Profiles</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="createinstancedialogpages.cpp" line="1265"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="createinstancedialogpages.cpp" line="1274"/>
+ <source>Game: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="createinstancedialogpages.cpp" line="1275"/>
+ <source>Game location: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -6870,6 +7037,24 @@ p, li { white-space: pre-wrap; }
<source>empty field name</source>
<translation type="unfinished"></translation>
</message>
+ <message numerus="yes">
+ <location filename="disableproxyplugindialog.cpp" line="13"/>
+ <source>Disabling the &apos;%1&apos; plugin will prevent the following %2 plugin(s) from working:</source>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+ <message>
+ <location filename="envshell.cpp" line="342"/>
+ <source>No menu available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="envshell.cpp" line="385"/>
+ <source>Selected files must be in the same directory</source>
+ <translation type="unfinished"></translation>
+ </message>
<message>
<location filename="filerenamer.cpp" line="111"/>
<source>The hidden file &quot;%1&quot; already exists. Replace it?</source>
@@ -6908,15 +7093,13 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="78"/>
- <source>invalid 7-zip32.dll: %1</source>
+ <location filename="filetree.cpp" line="113"/>
+ <source>Disabled because</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moshortcut.cpp" line="41"/>
- <location filename="instancemanager.cpp" line="55"/>
- <location filename="createinstancedialogpages.cpp" line="35"/>
- <source>Portable</source>
+ <location filename="installationmanager.cpp" line="77"/>
+ <source>invalid 7-zip32.dll: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -6940,8 +7123,32 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="68"/>
- <source>failed to create %1</source>
+ <location filename="instancemanagerdialog.cpp" line="114"/>
+ <source>The instance name must be a valid folder name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="instancemanagerdialog.cpp" line="119"/>
+ <source>An instance with this name already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="loglist.cpp" line="373"/>
+ <location filename="loot.cpp" line="413"/>
+ <location filename="organizercore.cpp" line="384"/>
+ <location filename="settingsdialogdiagnostics.cpp" line="37"/>
+ <location filename="settingsdialogdiagnostics.cpp" line="61"/>
+ <location filename="settingsdialogpaths.cpp" line="70"/>
+ <location filename="settingsdialogpaths.cpp" line="192"/>
+ <location filename="../../uibase/src/report.cpp" line="66"/>
+ <location filename="../../uibase/src/report.cpp" line="73"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="loglist.cpp" line="374"/>
+ <location filename="organizercore.cpp" line="385"/>
+ <source>Failed to create &quot;%1&quot;. Your user account probably lacks permission.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -6980,9 +7187,9 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="loot.cpp" line="419"/>
<location filename="settingsdialogdiagnostics.cpp" line="36"/>
<location filename="settingsdialogdiagnostics.cpp" line="60"/>
- <location filename="loot.cpp" line="419"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
@@ -7032,32 +7239,6 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="385"/>
- <location filename="loglist.cpp" line="373"/>
- <source>Failed to create &quot;%1&quot;. Your user account probably lacks permission.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="commandline.cpp" line="320"/>
- <source>failed to start application: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="commandline.cpp" line="817"/>
- <source>Executable &apos;%1&apos; not found in instance &apos;%2&apos;.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="commandline.cpp" line="843"/>
- <source>Failed to run &apos;%1&apos;. The logs might have more information.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="commandline.cpp" line="852"/>
- <source>Failed to run &apos;%1&apos;. The logs might have more information. %2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="main.cpp" line="65"/>
<source>Mod Organizer</source>
<translation type="unfinished"></translation>
@@ -7068,32 +7249,42 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="196"/>
+ <location filename="mainwindow.cpp" line="195"/>
<source>&lt;Unmanaged&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1201"/>
+ <location filename="mainwindow.cpp" line="1200"/>
<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="1458"/>
+ <location filename="mainwindow.cpp" line="1457"/>
<source>Visit %1 on Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1674"/>
- <location filename="mainwindow.cpp" line="2688"/>
+ <location filename="mainwindow.cpp" line="1673"/>
+ <location filename="mainwindow.cpp" line="2687"/>
<source>&lt;Manage...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1686"/>
+ <location filename="mainwindow.cpp" line="1685"/>
<source>failed to parse profile %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="moapplication.cpp" line="467"/>
+ <source>Instance at &apos;%1&apos; not found. Select another instance.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="moapplication.cpp" line="471"/>
+ <source>Instance at &apos;%1&apos; not found. You must create a new instance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="modinfodialogesps.cpp" line="315"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
@@ -7125,94 +7316,94 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="186"/>
+ <location filename="nxmaccessmanager.cpp" line="185"/>
<source>Connecting to Nexus...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="189"/>
+ <location filename="nxmaccessmanager.cpp" line="188"/>
<source>Waiting for Nexus...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="193"/>
+ <location filename="nxmaccessmanager.cpp" line="192"/>
<source>Opened Nexus in browser.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="194"/>
+ <location filename="nxmaccessmanager.cpp" line="193"/>
<source>Switch to your browser and accept the request.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="197"/>
+ <location filename="nxmaccessmanager.cpp" line="196"/>
<source>Finished.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="201"/>
+ <location filename="nxmaccessmanager.cpp" line="200"/>
<source>No answer from Nexus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="202"/>
- <location filename="nxmaccessmanager.cpp" line="207"/>
+ <location filename="nxmaccessmanager.cpp" line="201"/>
+ <location filename="nxmaccessmanager.cpp" line="206"/>
<source>A firewall might be blocking Mod Organizer.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="206"/>
+ <location filename="nxmaccessmanager.cpp" line="205"/>
<source>Nexus closed the connection.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="210"/>
+ <location filename="nxmaccessmanager.cpp" line="209"/>
<source>Cancelled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="398"/>
+ <location filename="nxmaccessmanager.cpp" line="397"/>
<source>Failed to request %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="420"/>
- <location filename="nxmaccessmanager.cpp" line="754"/>
+ <location filename="nxmaccessmanager.cpp" line="419"/>
+ <location filename="nxmaccessmanager.cpp" line="753"/>
<source>Cancelled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="466"/>
+ <location filename="nxmaccessmanager.cpp" line="465"/>
<source>Internal error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="501"/>
+ <location filename="nxmaccessmanager.cpp" line="500"/>
<source>HTTP code %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="511"/>
+ <location filename="nxmaccessmanager.cpp" line="510"/>
<source>Invalid JSON</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="516"/>
+ <location filename="nxmaccessmanager.cpp" line="515"/>
<source>Bad response</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="526"/>
+ <location filename="nxmaccessmanager.cpp" line="525"/>
<source>API key is empty</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="548"/>
+ <location filename="nxmaccessmanager.cpp" line="547"/>
<source>SSL error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="553"/>
+ <location filename="nxmaccessmanager.cpp" line="552"/>
<source>Timed out</source>
<translation type="unfinished"></translation>
</message>
@@ -7227,12 +7418,12 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="625"/>
+ <location filename="pluginlist.cpp" line="684"/>
<source>failed to access %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="639"/>
+ <location filename="pluginlist.cpp" line="698"/>
<source>failed to set file time %1</source>
<translation type="unfinished"></translation>
</message>
@@ -7254,6 +7445,11 @@ Destination:<byte value="xd"/>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="profile.cpp" line="68"/>
+ <source>failed to create %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="profilesdialog.cpp" line="113"/>
<source>Before you can use ModOrganizer, you need to create at least one profile. ATTENTION: Run the game at least once before creating a profile!</source>
<translation type="unfinished"></translation>
@@ -7329,34 +7525,16 @@ This program is known to cause issues with Mod Organizer, such as freezing or bl
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialoggeneral.cpp" line="155"/>
+ <location filename="settingsdialoggeneral.cpp" line="156"/>
<source>Confirm?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialoggeneral.cpp" line="156"/>
+ <location filename="settingsdialoggeneral.cpp" line="157"/>
<source>This will reset all the choices you made to dialogs and make them all visible again. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="uilocker.cpp" line="361"/>
- <location filename="spawn.cpp" line="198"/>
- <location filename="spawn.cpp" line="227"/>
- <location filename="spawn.cpp" line="306"/>
- <location filename="spawn.cpp" line="335"/>
- <location filename="spawn.cpp" line="366"/>
- <location filename="spawn.cpp" line="393"/>
- <location filename="spawn.cpp" line="429"/>
- <location filename="settingsdialogworkarounds.cpp" line="139"/>
- <location filename="settingsdialognexus.cpp" line="268"/>
- <location filename="settingsdialognexus.cpp" line="276"/>
- <location filename="createinstancedialogpages.cpp" line="680"/>
- <location filename="createinstancedialogpages.cpp" line="703"/>
- <location filename="createinstancedialogpages.cpp" line="733"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="settingsdialognexus.cpp" line="270"/>
<location filename="settingsdialognexus.cpp" line="282"/>
<location filename="settingsdialognexus.cpp" line="287"/>
@@ -7440,6 +7618,31 @@ This program is known to cause issues with Mod Organizer, such as freezing or bl
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="settingsdialogplugins.cpp" line="230"/>
+ <source>Cannot disable plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialogplugins.cpp" line="231"/>
+ <source>The &apos;%1&apos; plugin is used by the current game plugin and cannot disabled.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialogplugins.cpp" line="256"/>
+ <source>&lt;p&gt;Disabling the &apos;%1&apos; plugin will also disable the following plugins:&lt;/p&gt;&lt;ul&gt;%1&lt;/ul&gt;&lt;p&gt;Do you want to continue?&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialogplugins.cpp" line="260"/>
+ <source>Really disable plugin?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialogplugins.cpp" line="304"/>
+ <source>This plugin is required for Mod Organizer to work properly and cannot be disabled.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="settingsdialogworkarounds.cpp" line="88"/>
<source>Executables Blacklist</source>
<translation type="unfinished"></translation>
@@ -7468,16 +7671,6 @@ Example:
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="shared/originconnection.cpp" line="86"/>
- <source>invalid origin name: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="shared/originconnection.cpp" line="102"/>
- <source>failed to change name lookup from {} to {}</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="shared/directoryentry.cpp" line="423"/>
<source>unexpected end of path</source>
<translation type="unfinished"></translation>
@@ -7493,196 +7686,206 @@ Example:
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="153"/>
+ <location filename="shared/originconnection.cpp" line="86"/>
+ <source>invalid origin name: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="shared/originconnection.cpp" line="102"/>
+ <source>failed to change name lookup from {} to {}</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="spawn.cpp" line="154"/>
<source>This error typically happens because an antivirus has deleted critical files from Mod Organizer&apos;s installation folder or has made them generally inaccessible. Add an exclusion for Mod Organizer&apos;s installation folder in your antivirus, reinstall Mod Organizer and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="160"/>
+ <location filename="spawn.cpp" line="161"/>
<source>This error typically happens because an antivirus is preventing Mod Organizer from starting programs. Add an exclusion for Mod Organizer&apos;s installation folder in your antivirus and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="165"/>
+ <location filename="spawn.cpp" line="166"/>
<source>The file &apos;%1&apos; does not exist.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="169"/>
+ <location filename="spawn.cpp" line="170"/>
<source>The working directory &apos;%1&apos; does not exist.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="186"/>
<location filename="spawn.cpp" line="187"/>
- <location filename="spawn.cpp" line="217"/>
+ <location filename="spawn.cpp" line="188"/>
<location filename="spawn.cpp" line="218"/>
+ <location filename="spawn.cpp" line="219"/>
<source>Cannot start Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="188"/>
+ <location filename="spawn.cpp" line="189"/>
<source>The path to the Steam executable cannot be found. You might try reinstalling Steam.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="194"/>
- <location filename="spawn.cpp" line="223"/>
- <location filename="spawn.cpp" line="331"/>
+ <location filename="spawn.cpp" line="195"/>
+ <location filename="spawn.cpp" line="224"/>
+ <location filename="spawn.cpp" line="332"/>
<source>Continue without starting Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="195"/>
- <location filename="spawn.cpp" line="224"/>
+ <location filename="spawn.cpp" line="196"/>
+ <location filename="spawn.cpp" line="225"/>
<source>The program may fail to launch.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="237"/>
+ <location filename="spawn.cpp" line="238"/>
<source>Cannot launch program</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="239"/>
- <location filename="spawn.cpp" line="264"/>
- <location filename="spawn.cpp" line="283"/>
+ <location filename="spawn.cpp" line="240"/>
+ <location filename="spawn.cpp" line="265"/>
+ <location filename="spawn.cpp" line="284"/>
<source>Cannot start %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="262"/>
+ <location filename="spawn.cpp" line="263"/>
<source>Cannot launch helper</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="281"/>
- <location filename="spawn.cpp" line="344"/>
+ <location filename="spawn.cpp" line="282"/>
+ <location filename="spawn.cpp" line="345"/>
<source>Elevation required</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="286"/>
+ <location filename="spawn.cpp" line="287"/>
<source>This program is requesting to run as administrator but Mod Organizer itself is not running as administrator. Running programs as administrator is typically unnecessary as long as the game and Mod Organizer have been installed outside &quot;Program Files&quot;.<byte value="xd"/>
<byte value="xd"/>
You can restart Mod Organizer as administrator and try launching the program again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="302"/>
- <location filename="spawn.cpp" line="358"/>
+ <location filename="spawn.cpp" line="303"/>
+ <location filename="spawn.cpp" line="359"/>
<source>Restart Mod Organizer as administrator</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="303"/>
- <location filename="spawn.cpp" line="359"/>
+ <location filename="spawn.cpp" line="304"/>
+ <location filename="spawn.cpp" line="360"/>
<source>You must allow &quot;helper.exe&quot; to make changes to the system.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="316"/>
+ <location filename="spawn.cpp" line="317"/>
<source>Launch Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="317"/>
+ <location filename="spawn.cpp" line="318"/>
<source>This program requires Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="318"/>
+ <location filename="spawn.cpp" line="319"/>
<source>Mod Organizer has detected that this program likely requires Steam to be running to function properly.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="328"/>
+ <location filename="spawn.cpp" line="329"/>
<source>Start Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="332"/>
- <location filename="spawn.cpp" line="363"/>
+ <location filename="spawn.cpp" line="333"/>
+ <location filename="spawn.cpp" line="364"/>
<source>The program might fail to run.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="345"/>
+ <location filename="spawn.cpp" line="346"/>
<source>Steam is running as administrator</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="346"/>
+ <location filename="spawn.cpp" line="347"/>
<source>Running Steam as administrator is typically unnecessary and can cause problems when Mod Organizer itself is not running as administrator.<byte value="xd"/>
<byte value="xd"/>
You can restart Mod Organizer as administrator and try launching the program again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="362"/>
- <location filename="spawn.cpp" line="389"/>
- <location filename="spawn.cpp" line="422"/>
+ <location filename="spawn.cpp" line="363"/>
+ <location filename="spawn.cpp" line="390"/>
+ <location filename="spawn.cpp" line="423"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="375"/>
+ <location filename="spawn.cpp" line="376"/>
<source>Event Log not running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="376"/>
+ <location filename="spawn.cpp" line="377"/>
<source>The Event Log service is not running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="377"/>
+ <location filename="spawn.cpp" line="378"/>
<source>The Windows Event Log service is not running. This can prevent USVFS from running properly and your mods may not be recognized by the program being launched.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="390"/>
- <location filename="spawn.cpp" line="423"/>
+ <location filename="spawn.cpp" line="391"/>
+ <location filename="spawn.cpp" line="424"/>
<source>Your mods might not work.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="403"/>
+ <location filename="spawn.cpp" line="404"/>
<source>Blacklisted program</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="404"/>
+ <location filename="spawn.cpp" line="405"/>
<source>The program %1 is blacklisted</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="406"/>
+ <location filename="spawn.cpp" line="407"/>
<source>The program you are attempting to launch is blacklisted in the virtual filesystem. This will likely prevent it from seeing any mods, INI files or any other virtualized files.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="426"/>
+ <location filename="spawn.cpp" line="427"/>
<source>Change the blacklist</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="660"/>
+ <location filename="spawn.cpp" line="661"/>
<source>Waiting</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="661"/>
+ <location filename="spawn.cpp" line="662"/>
<source>Please press OK once you&apos;re logged into steam.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="969"/>
+ <location filename="spawn.cpp" line="970"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="970"/>
+ <location filename="spawn.cpp" line="971"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
@@ -7697,17 +7900,17 @@ You can restart Mod Organizer as administrator and try launching the program aga
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="texteditor.cpp" line="465"/>
+ <location filename="texteditor.cpp" line="469"/>
<source>&amp;Save</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="texteditor.cpp" line="472"/>
+ <location filename="texteditor.cpp" line="476"/>
<source>&amp;Word wrap</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="texteditor.cpp" line="477"/>
+ <location filename="texteditor.cpp" line="481"/>
<source>&amp;Open in Explorer</source>
<translation type="unfinished"></translation>
</message>
@@ -7729,7 +7932,6 @@ You can restart Mod Organizer as administrator and try launching the program aga
<message>
<location filename="uilocker.cpp" line="323"/>
<source>Mod Organizer is waiting on an application to close before exiting.</source>
- <oldsource>Mod Organizer is waiting on application to close before exiting.</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
@@ -7743,254 +7945,214 @@ You can restart Mod Organizer as administrator and try launching the program aga
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="envshell.cpp" line="342"/>
- <source>No menu available</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="envshell.cpp" line="385"/>
- <source>Selected files must be in the same directory</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="filetree.cpp" line="113"/>
- <source>Disabled because</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../uibase/src/exceptions.h" line="44"/>
- <source>invalid nxm-link: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../uibase/src/pluginrequirements.cpp" line="29"/>
- <source>One of the following plugins must be enabled: %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../uibase/src/pluginrequirements.cpp" line="33"/>
- <source>This plugin can only be enabled if the &apos;%1&apos; plugin is installed and enabled.</source>
+ <location filename="../../game_gamebryo/src/creation/creationgameplugins.cpp" line="105"/>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryogameplugins.cpp" line="127"/>
+ <source>Some of your plugins have invalid names! These plugins can not be loaded by the game. Please see mo_interface.log for a list of affected plugins and rename them.</source>
<translation type="unfinished"></translation>
</message>
- <message numerus="yes">
- <location filename="../../uibase/src/pluginrequirements.cpp" line="59"/>
- <source>This plugin can only be enabled for the following game(s): %1.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- </translation>
- </message>
<message>
- <location filename="settingsdialogplugins.cpp" line="230"/>
- <source>Cannot disable plugin</source>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegame.cpp" line="47"/>
+ <source>%1, #%2, Level %3, %4</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialogplugins.cpp" line="231"/>
- <source>The &apos;%1&apos; plugin is used by the current game plugin and cannot disabled.</source>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegame.cpp" line="97"/>
+ <source>failed to open %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialogplugins.cpp" line="256"/>
- <source>&lt;p&gt;Disabling the &apos;%1&apos; plugin will also disable the following plugins:&lt;/p&gt;&lt;ul&gt;%1&lt;/ul&gt;&lt;p&gt;Do you want to continue?&lt;/p&gt;</source>
+ <location filename="../../game_gamebryo/src/gamebryo/gamebryosavegame.cpp" line="107"/>
+ <source>wrong file format - expected %1 got %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialogplugins.cpp" line="260"/>
- <source>Really disable plugin?</source>
+ <location filename="../../game_gamebryo/src/gamebryo/gamegamebryo.cpp" line="323"/>
+ <source>failed to query registry path (preflight): %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialogplugins.cpp" line="304"/>
- <source>This plugin is required for Mod Organizer to work properly and cannot be disabled.</source>
+ <location filename="../../game_gamebryo/src/gamebryo/gamegamebryo.cpp" line="330"/>
+ <source>failed to query registry path (read): %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="468"/>
- <source>Instance at &apos;%1&apos; not found. Select another instance.</source>
+ <location filename="../../uibase/src/exceptions.h" line="44"/>
+ <source>invalid nxm-link: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="moapplication.cpp" line="472"/>
- <source>Instance at &apos;%1&apos; not found. You must create a new instance</source>
+ <location filename="../../uibase/src/filterwidget.cpp" line="127"/>
+ <source>Filter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanagerdialog.cpp" line="114"/>
- <source>The instance name must be a valid folder name.</source>
+ <location filename="../../uibase/src/pluginrequirements.cpp" line="29"/>
+ <source>One of the following plugins must be enabled: %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanagerdialog.cpp" line="119"/>
- <source>An instance with this name already exists.</source>
+ <location filename="../../uibase/src/pluginrequirements.cpp" line="33"/>
+ <source>This plugin can only be enabled if the &apos;%1&apos; plugin is installed and enabled.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="disableproxyplugindialog.cpp" line="13"/>
- <source>Disabling the &apos;%1&apos; plugin will prevent the following %2 plugin(s) from working:</source>
+ <location filename="../../uibase/src/pluginrequirements.cpp" line="59"/>
+ <source>This plugin can only be enabled for the following game(s): %1.</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="32"/>
- <source>Global</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="createinstancedialogpages.cpp" line="38"/>
- <location filename="createinstancedialogpages.cpp" line="1244"/>
- <source>Instance type: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="createinstancedialogpages.cpp" line="38"/>
- <source>?</source>
+ <location filename="../../uibase/src/registry.cpp" line="43"/>
+ <location filename="../../uibase/src/registry.cpp" line="44"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="158"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="159"/>
+ <source>INI file is read-only</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="302"/>
- <source>Find game installation for %1</source>
+ <location filename="../../uibase/src/registry.cpp" line="45"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="160"/>
+ <source>Mod Organizer is attempting to write to &quot;%1&quot; which is currently set to read-only.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="352"/>
- <source>Find game installation</source>
+ <location filename="../../uibase/src/registry.cpp" line="48"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="163"/>
+ <source>Clear the read-only flag</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="401"/>
- <location filename="createinstancedialogpages.cpp" line="690"/>
- <location filename="createinstancedialogpages.cpp" line="691"/>
- <source>Unrecognized game</source>
+ <location filename="../../uibase/src/registry.cpp" line="51"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="166"/>
+ <source>Allow the write once</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="402"/>
- <source>The folder %1 does not seem to contain a game Mod Organizer can manage.</source>
+ <location filename="../../uibase/src/registry.cpp" line="52"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="167"/>
+ <source>The file will be set to read-only again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="406"/>
- <source>See details for the list of supported games.</source>
+ <location filename="../../uibase/src/registry.cpp" line="55"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="170"/>
+ <source>Skip this file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="483"/>
- <source>No installation found</source>
+ <location filename="../../uibase/src/report.cpp" line="349"/>
+ <source>You can reset these choices by clicking &quot;Reset Dialog Choices&quot; in the General tab of the Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="554"/>
- <source>Browse...</source>
+ <location filename="../../uibase/src/report.cpp" line="358"/>
+ <source>Always ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="556"/>
- <source>The folder must contain a valid game installation</source>
+ <location filename="../../uibase/src/report.cpp" line="359"/>
+ <location filename="../../uibase/src/report.cpp" line="366"/>
+ <source>Remember my choice</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="692"/>
- <source>The folder %1 does not seem to contain an installation for &lt;span style=&quot;white-space: nowrap; font-weight: bold;&quot;&gt;%2&lt;/span&gt; or for any other game Mod Organizer can manage.</source>
+ <location filename="../../uibase/src/report.cpp" line="360"/>
+ <source>Remember my choice for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="675"/>
- <location filename="createinstancedialogpages.cpp" line="699"/>
- <location filename="createinstancedialogpages.cpp" line="729"/>
- <source>Use this folder for %1</source>
+ <location filename="../../uibase/src/safewritefile.cpp" line="44"/>
+ <source>Failed to save &apos;{}&apos;, could not create a temporary file: {} (error {})</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="667"/>
- <location filename="createinstancedialogpages.cpp" line="668"/>
- <source>Microsoft Store game</source>
+ <location filename="../../uibase/src/utility.cpp" line="59"/>
+ <source>removal of &quot;%1&quot; failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="669"/>
- <source>The folder %1 seems to be a Microsoft Store game install. Games installed through the Microsoft Store are not supported by Mod Organizer and will not work properly.</source>
+ <location filename="../../uibase/src/utility.cpp" line="66"/>
+ <source>removal of &quot;%1&quot; failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="676"/>
- <source>Use this folder</source>
+ <location filename="../../uibase/src/utility.cpp" line="70"/>
+ <source>&quot;%1&quot; doesn&apos;t exist (remove)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="677"/>
- <location filename="createinstancedialogpages.cpp" line="700"/>
- <location filename="createinstancedialogpages.cpp" line="730"/>
- <source>I know what I&apos;m doing</source>
+ <location filename="../../uibase/src/utility.cpp" line="312"/>
+ <source>Error %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="715"/>
- <location filename="createinstancedialogpages.cpp" line="716"/>
- <source>Incorrect game</source>
+ <location filename="../../uibase/src/utility.cpp" line="500"/>
+ <location filename="../../uibase/src/utility.cpp" line="523"/>
+ <source>You have an invalid custom browser command in the settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="717"/>
- <source>The folder %1 seems to contain an installation for &lt;span style=&quot;white-space: nowrap; font-weight: bold;&quot;&gt;%2&lt;/span&gt;, not &lt;span style=&quot;white-space: nowrap; font-weight: bold;&quot;&gt;%3&lt;/span&gt;.</source>
+ <location filename="../../uibase/src/utility.cpp" line="641"/>
+ <location filename="../../uibase/src/utility.cpp" line="666"/>
+ <source>failed to create directory &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="726"/>
- <source>Manage %1 instead</source>
+ <location filename="../../uibase/src/utility.cpp" line="650"/>
+ <location filename="../../uibase/src/utility.cpp" line="673"/>
+ <source>failed to copy &quot;%1&quot; to &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1247"/>
- <source>Instance location: %1</source>
+ <location filename="../../uibase/src/utility.cpp" line="1078"/>
+ <source>%1 B</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1251"/>
- <source>Instance name: %1</source>
+ <location filename="../../uibase/src/utility.cpp" line="1079"/>
+ <source>%1 KB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1257"/>
- <location filename="createinstancedialogpages.cpp" line="1261"/>
- <source>Base directory: %1</source>
+ <location filename="../../uibase/src/utility.cpp" line="1080"/>
+ <source>%1 MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1262"/>
- <source>Downloads</source>
+ <location filename="../../uibase/src/utility.cpp" line="1081"/>
+ <source>%1 GB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1263"/>
- <source>Mods</source>
+ <location filename="../../uibase/src/utility.cpp" line="1082"/>
+ <source>%1 TB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1264"/>
- <source>Profiles</source>
+ <location filename="../../uibase/src/utility.cpp" line="1089"/>
+ <source>%1 B/s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1265"/>
- <source>Overwrite</source>
+ <location filename="../../uibase/src/utility.cpp" line="1090"/>
+ <source>%1 KB/s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1274"/>
- <source>Game: %1</source>
+ <location filename="../../uibase/src/utility.cpp" line="1091"/>
+ <source>%1 MB/s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialogpages.cpp" line="1275"/>
- <source>Game location: %1</source>
+ <location filename="../../uibase/src/utility.cpp" line="1092"/>
+ <source>%1 GB/s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="createinstancedialog.cpp" line="88"/>
- <source>Creating %1</source>
+ <location filename="../../uibase/src/utility.cpp" line="1093"/>
+ <source>%1 TB/s</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -8150,42 +8312,42 @@ p, li { white-space: pre-wrap; }
<context>
<name>SelfUpdater</name>
<message>
- <location filename="selfupdater.cpp" line="213"/>
+ <location filename="selfupdater.cpp" line="212"/>
<source>Download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="214"/>
+ <location filename="selfupdater.cpp" line="213"/>
<source>Failed to find correct download, please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="229"/>
+ <location filename="selfupdater.cpp" line="228"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="230"/>
+ <location filename="selfupdater.cpp" line="229"/>
<source>Download in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="321"/>
+ <location filename="selfupdater.cpp" line="320"/>
<source>Download failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="332"/>
+ <location filename="selfupdater.cpp" line="331"/>
<source>Failed to install update: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="351"/>
+ <location filename="selfupdater.cpp" line="350"/>
<source>Failed to start %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="361"/>
+ <location filename="selfupdater.cpp" line="360"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@@ -8208,19 +8370,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="361"/>
- <source>Style</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="370"/>
- <location filename="settingsdialog.ui" line="373"/>
- <source>Visual theme of the user interface.</source>
+ <location filename="settingsdialog.ui" line="101"/>
+ <source>https://discord.gg/NRGqdt5suP</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="380"/>
- <source>Explore...</source>
+ <location filename="settingsdialog.ui" line="104"/>
+ <source>&lt;a href=&quot;https://discord.gg/NRGqdt5suP&quot;&gt;Help translate Mod Organizer on Discord&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -8230,54 +8386,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="228"/>
- <location filename="settingsdialog.ui" line="231"/>
- <source>Dialogs will always be centered on the main window, but will remember their size.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="234"/>
- <source>Always center dialogs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="241"/>
- <source>Show confirmation when changing instance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="261"/>
- <source>Whether double-clicking on a file opens the preview window or launches the program associated with it. This applies to the Data tab as well as the Conflicts and Filetree tabs in the mod info window.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="264"/>
- <source>Open previews on double-click</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="295"/>
- <location filename="settingsdialog.ui" line="298"/>
- <source>Reset all choices made in dialogs.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="301"/>
- <source>Reset Dialog Choices</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="308"/>
- <location filename="settingsdialog.ui" line="311"/>
- <source>Modify the categories available to arrange your mods.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="314"/>
- <source>Configure Mod Categories</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="settingsdialog.ui" line="127"/>
<source>Download List</source>
<translation type="unfinished"></translation>
@@ -8289,36 +8397,30 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="146"/>
- <location filename="settingsdialog.ui" line="149"/>
- <source>Make the download list more compact.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="405"/>
- <source>Colors</source>
+ <location filename="settingsdialog.ui" line="139"/>
+ <source>Show meta information</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="503"/>
- <location filename="settingsdialog.ui" line="506"/>
- <source>Colors set on separators will also be shown in the mod list scrollbar at the location of the separator. This can be useful for quickly navigating to a specific separator.</source>
+ <location filename="settingsdialog.ui" line="146"/>
+ <location filename="settingsdialog.ui" line="149"/>
+ <source>Make the download list more compact.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="509"/>
- <source>Show mod list separator colors on the scrollbar</source>
+ <location filename="settingsdialog.ui" line="152"/>
+ <source>Compact list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="457"/>
- <location filename="settingsdialog.ui" line="460"/>
- <source>Reset all colors to their default value.</source>
+ <location filename="settingsdialog.ui" line="159"/>
+ <location filename="settingsdialog.ui" line="162"/>
+ <source>Automatically hide downloads after successful installation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="463"/>
- <source>Reset Colors</source>
+ <location filename="settingsdialog.ui" line="165"/>
+ <source>Hide downloads after installation</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -8344,428 +8446,446 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="792"/>
- <source>Paths</source>
+ <location filename="settingsdialog.ui" line="200"/>
+ <source>Update to beta versions</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="800"/>
- <location filename="settingsdialog.ui" line="817"/>
- <location filename="settingsdialog.ui" line="914"/>
- <location filename="settingsdialog.ui" line="972"/>
- <location filename="settingsdialog.ui" line="1941"/>
- <source>...</source>
+ <location filename="settingsdialog.ui" line="210"/>
+ <source>Miscellaneous</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="827"/>
- <source>Caches</source>
+ <location filename="settingsdialog.ui" line="228"/>
+ <location filename="settingsdialog.ui" line="231"/>
+ <source>Dialogs will always be centered on the main window, but will remember their size.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="834"/>
- <source>Overwrite</source>
+ <location filename="settingsdialog.ui" line="234"/>
+ <source>Always center dialogs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="841"/>
- <location filename="settingsdialog.ui" line="844"/>
- <source>Directory where downloads are stored.</source>
+ <location filename="settingsdialog.ui" line="241"/>
+ <source>Show confirmation when changing instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="861"/>
- <source>Downloads</source>
+ <location filename="settingsdialog.ui" line="248"/>
+ <location filename="settingsdialog.ui" line="251"/>
+ <source>Show the menubar when the Alt key is pressed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="881"/>
- <source>Profiles</source>
+ <location filename="settingsdialog.ui" line="254"/>
+ <source>Show menubar when pressing Alt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="904"/>
- <source>Directory where mods are stored.</source>
+ <location filename="settingsdialog.ui" line="261"/>
+ <source>Whether double-clicking on a file opens the preview window or launches the program associated with it. This applies to the Data tab as well as the Conflicts and Filetree tabs in the mod info window.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="907"/>
- <source>Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don&apos;t exist in the new location (with the same name).</source>
+ <location filename="settingsdialog.ui" line="264"/>
+ <source>Open previews on double-click</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="931"/>
- <source>Mods</source>
+ <location filename="settingsdialog.ui" line="295"/>
+ <location filename="settingsdialog.ui" line="298"/>
+ <source>Reset all choices made in dialogs.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="951"/>
- <source>Managed Game</source>
+ <location filename="settingsdialog.ui" line="301"/>
+ <source>Reset Dialog Choices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="958"/>
- <source>Base Directory</source>
+ <location filename="settingsdialog.ui" line="308"/>
+ <location filename="settingsdialog.ui" line="311"/>
+ <source>Modify the categories available to arrange your mods.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="965"/>
- <source>Use %BASE_DIR% to refer to the Base Directory.</source>
+ <location filename="settingsdialog.ui" line="314"/>
+ <source>Configure Mod Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1002"/>
- <source>Nexus</source>
+ <location filename="settingsdialog.ui" line="355"/>
+ <source>Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1050"/>
- <source>Nexus Account</source>
+ <location filename="settingsdialog.ui" line="361"/>
+ <source>Style</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1059"/>
- <source>User ID:</source>
+ <location filename="settingsdialog.ui" line="370"/>
+ <location filename="settingsdialog.ui" line="373"/>
+ <source>Visual theme of the user interface.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1076"/>
- <source>Name:</source>
+ <location filename="settingsdialog.ui" line="380"/>
+ <source>Explore...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1090"/>
- <source>Account:</source>
+ <location filename="settingsdialog.ui" line="405"/>
+ <source>Colors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1107"/>
- <source>Statistics</source>
+ <location filename="settingsdialog.ui" line="457"/>
+ <location filename="settingsdialog.ui" line="460"/>
+ <source>Reset all colors to their default value.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1116"/>
- <source>Daily requests:</source>
+ <location filename="settingsdialog.ui" line="463"/>
+ <source>Reset Colors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1130"/>
- <source>Hourly requests:</source>
+ <location filename="settingsdialog.ui" line="482"/>
+ <source>Mod List</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1149"/>
- <source>Nexus Connection</source>
+ <location filename="settingsdialog.ui" line="503"/>
+ <location filename="settingsdialog.ui" line="506"/>
+ <source>Colors set on separators will also be shown in the mod list scrollbar at the location of the separator. This can be useful for quickly navigating to a specific separator.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1170"/>
- <source>Connect to Nexus</source>
+ <location filename="settingsdialog.ui" line="509"/>
+ <source>Show mod list separator colors on the scrollbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1177"/>
- <source>Manually enter the API key and try to login</source>
+ <location filename="settingsdialog.ui" line="519"/>
+ <source>Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1180"/>
- <source>Enter API Key Manually</source>
+ <location filename="settingsdialog.ui" line="522"/>
+ <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, esms, and esls) displayed in the right pane are completely unaffected by this feature.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1187"/>
- <source>Clear the stored Nexus API key and force reauthorization.</source>
+ <location filename="settingsdialog.ui" line="528"/>
+ <source>Display mods installed outside MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1190"/>
- <source>Disconnect from Nexus</source>
+ <location filename="settingsdialog.ui" line="538"/>
+ <location filename="settingsdialog.ui" line="541"/>
+ <source>Save the current filters when closing MO2 and restore them on startup.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1865"/>
- <source>Network</source>
+ <location filename="settingsdialog.ui" line="544"/>
+ <source>Remember selected filters after restarting MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1871"/>
- <source>Disable automatic internet features</source>
+ <location filename="settingsdialog.ui" line="551"/>
+ <location filename="settingsdialog.ui" line="554"/>
+ <source>Check if updates are available for mods after installing them.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1874"/>
- <source>Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser)</source>
+ <location filename="settingsdialog.ui" line="557"/>
+ <source>Check for updates when installing mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1877"/>
- <source>Offline Mode</source>
+ <location filename="settingsdialog.ui" line="567"/>
+ <location filename="settingsdialog.ui" line="570"/>
+ <source>Automatically collapse separators, categories or nexus ids after a delay when hovering them during drag.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1884"/>
- <source>Use a proxy for network connections.</source>
+ <location filename="settingsdialog.ui" line="573"/>
+ <source>Automatically collapse items during drag on hover</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1887"/>
- <source>Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy.</source>
+ <location filename="settingsdialog.ui" line="599"/>
+ <source>Collapsible Separators</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1296"/>
- <source>Endorsement Integration</source>
+ <location filename="settingsdialog.ui" line="619"/>
+ <location filename="settingsdialog.ui" line="622"/>
+ <source>Highlight collapsed separators based on conflicts and plugins from mods inside them.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1316"/>
- <location filename="settingsdialog.ui" line="1319"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, a counter is displayed in the bottom right corner. This informs the user of their remaining API requests. The Nexus API becomes unusable once these API requests run out. Checking this option will hide that counter.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <location filename="settingsdialog.ui" line="625"/>
+ <source>on separators</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1322"/>
- <source>Hide API Request Counter</source>
+ <location filename="settingsdialog.ui" line="635"/>
+ <source>Enable when sorting by</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1347"/>
- <source>Associate with &quot;Download with manager&quot; links</source>
+ <location filename="settingsdialog.ui" line="642"/>
+ <source>Show conflicts and plugins </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1354"/>
- <source>Remove cache and cookies.</source>
+ <location filename="settingsdialog.ui" line="649"/>
+ <location filename="settingsdialog.ui" line="652"/>
+ <source>When selecting a collapsed separator, highlight conflicting mods and plugins from mods inside the separator.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1357"/>
- <source>Clear Cache</source>
+ <location filename="settingsdialog.ui" line="655"/>
+ <source>from separators</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1393"/>
- <source>Known Servers (updated on download)</source>
+ <location filename="settingsdialog.ui" line="665"/>
+ <source>ascending priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1414"/>
- <source>Preferred Servers (Drag &amp; Drop)</source>
+ <location filename="settingsdialog.ui" line="675"/>
+ <source>descending priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1798"/>
- <source>Steam</source>
+ <location filename="settingsdialog.ui" line="682"/>
+ <source>Show icons on separators</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1821"/>
- <source>Username</source>
+ <location filename="settingsdialog.ui" line="704"/>
+ <source>conflicts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1807"/>
- <source>Password</source>
+ <location filename="settingsdialog.ui" line="714"/>
+ <source>flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1441"/>
- <source>Plugins</source>
+ <location filename="settingsdialog.ui" line="724"/>
+ <source>content</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="139"/>
- <source>Show meta information</source>
+ <location filename="settingsdialog.ui" line="734"/>
+ <source>version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="152"/>
- <source>Compact list</source>
+ <location filename="settingsdialog.ui" line="762"/>
+ <location filename="settingsdialog.ui" line="765"/>
+ <source>Do not share the collapse/expanded state of separators between profiles.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="159"/>
- <location filename="settingsdialog.ui" line="162"/>
- <source>Automatically hide downloads after successful installation.</source>
+ <location filename="settingsdialog.ui" line="768"/>
+ <source>Profile-specific collapse states for separators</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="165"/>
- <source>Hide downloads after installation</source>
+ <location filename="settingsdialog.ui" line="792"/>
+ <source>Paths</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="200"/>
- <source>Update to beta versions</source>
+ <location filename="settingsdialog.ui" line="800"/>
+ <location filename="settingsdialog.ui" line="817"/>
+ <location filename="settingsdialog.ui" line="914"/>
+ <location filename="settingsdialog.ui" line="972"/>
+ <location filename="settingsdialog.ui" line="1941"/>
+ <source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="210"/>
- <source>Miscellaneous</source>
+ <location filename="settingsdialog.ui" line="827"/>
+ <source>Caches</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="101"/>
- <source>https://discord.gg/NRGqdt5suP</source>
+ <location filename="settingsdialog.ui" line="834"/>
+ <source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="104"/>
- <source>&lt;a href=&quot;https://discord.gg/NRGqdt5suP&quot;&gt;Help translate Mod Organizer on Discord&lt;/a&gt;</source>
+ <location filename="settingsdialog.ui" line="841"/>
+ <location filename="settingsdialog.ui" line="844"/>
+ <source>Directory where downloads are stored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="248"/>
- <location filename="settingsdialog.ui" line="251"/>
- <source>Show the menubar when the Alt key is pressed</source>
+ <location filename="settingsdialog.ui" line="861"/>
+ <source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="254"/>
- <source>Show menubar when pressing Alt</source>
+ <location filename="settingsdialog.ui" line="881"/>
+ <source>Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="355"/>
- <source>Theme</source>
+ <location filename="settingsdialog.ui" line="904"/>
+ <source>Directory where mods are stored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="482"/>
- <source>Mod List</source>
+ <location filename="settingsdialog.ui" line="907"/>
+ <source>Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don&apos;t exist in the new location (with the same name).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="538"/>
- <location filename="settingsdialog.ui" line="541"/>
- <source>Save the current filters when closing MO2 and restore them on startup.</source>
+ <location filename="settingsdialog.ui" line="931"/>
+ <source>Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="544"/>
- <source>Remember selected filters after restarting MO</source>
+ <location filename="settingsdialog.ui" line="951"/>
+ <source>Managed Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="551"/>
- <location filename="settingsdialog.ui" line="554"/>
- <source>Check if updates are available for mods after installing them.</source>
+ <location filename="settingsdialog.ui" line="958"/>
+ <source>Base Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="557"/>
- <source>Check for updates when installing mods</source>
+ <location filename="settingsdialog.ui" line="965"/>
+ <source>Use %BASE_DIR% to refer to the Base Directory.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="567"/>
- <location filename="settingsdialog.ui" line="570"/>
- <source>Automatically collapse separators, categories or nexus ids after a delay when hovering them during drag.</source>
+ <location filename="settingsdialog.ui" line="994"/>
+ <source> All directories must be writable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="573"/>
- <source>Automatically collapse items during drag on hover</source>
+ <location filename="settingsdialog.ui" line="1002"/>
+ <source>Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="599"/>
- <source>Collapsible Separators</source>
+ <location filename="settingsdialog.ui" line="1050"/>
+ <source>Nexus Account</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="619"/>
- <location filename="settingsdialog.ui" line="622"/>
- <source>Highlight collapsed separators based on conflicts and plugins from mods inside them.</source>
+ <location filename="settingsdialog.ui" line="1059"/>
+ <source>User ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="625"/>
- <source>on separators</source>
+ <location filename="settingsdialog.ui" line="1076"/>
+ <source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="635"/>
- <source>Enable when sorting by</source>
+ <location filename="settingsdialog.ui" line="1090"/>
+ <source>Account:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="642"/>
- <source>Show conflicts and plugins </source>
+ <location filename="settingsdialog.ui" line="1107"/>
+ <source>Statistics</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="649"/>
- <location filename="settingsdialog.ui" line="652"/>
- <source>When selecting a collapsed separator, highlight conflicting mods and plugins from mods inside the separator.</source>
+ <location filename="settingsdialog.ui" line="1116"/>
+ <source>Daily requests:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="655"/>
- <source>from separators</source>
+ <location filename="settingsdialog.ui" line="1130"/>
+ <source>Hourly requests:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="665"/>
- <source>ascending priority</source>
+ <location filename="settingsdialog.ui" line="1149"/>
+ <source>Nexus Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="675"/>
- <source>descending priority</source>
+ <location filename="settingsdialog.ui" line="1170"/>
+ <source>Connect to Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="682"/>
- <source>Show icons on separators</source>
+ <location filename="settingsdialog.ui" line="1177"/>
+ <source>Manually enter the API key and try to login</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="704"/>
- <source>conflicts</source>
+ <location filename="settingsdialog.ui" line="1180"/>
+ <source>Enter API Key Manually</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="714"/>
- <source>flags</source>
+ <location filename="settingsdialog.ui" line="1187"/>
+ <source>Clear the stored Nexus API key and force reauthorization.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="724"/>
- <source>content</source>
+ <location filename="settingsdialog.ui" line="1190"/>
+ <source>Disconnect from Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="734"/>
- <source>version</source>
+ <location filename="settingsdialog.ui" line="1263"/>
+ <location filename="settingsdialog.ui" line="1728"/>
+ <source>Options</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="762"/>
- <location filename="settingsdialog.ui" line="765"/>
- <source>Do not share the collapse/expanded state of separators between profiles.</source>
+ <location filename="settingsdialog.ui" line="1296"/>
+ <source>Endorsement Integration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="768"/>
- <source>Profile-specific collapse states for separators</source>
+ <location filename="settingsdialog.ui" line="1306"/>
+ <source>Tracked Integration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="994"/>
- <source> All directories must be writable.</source>
+ <location filename="settingsdialog.ui" line="1316"/>
+ <location filename="settingsdialog.ui" line="1319"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, a counter is displayed in the bottom right corner. This informs the user of their remaining API requests. The Nexus API becomes unusable once these API requests run out. Checking this option will hide that counter.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1263"/>
- <location filename="settingsdialog.ui" line="1728"/>
- <source>Options</source>
+ <location filename="settingsdialog.ui" line="1322"/>
+ <source>Hide API Request Counter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1306"/>
- <source>Tracked Integration</source>
+ <location filename="settingsdialog.ui" line="1347"/>
+ <source>Associate with &quot;Download with manager&quot; links</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1354"/>
+ <source>Remove cache and cookies.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1357"/>
+ <source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -8774,6 +8894,21 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="settingsdialog.ui" line="1393"/>
+ <source>Known Servers (updated on download)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1414"/>
+ <source>Preferred Servers (Drag &amp; Drop)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1441"/>
+ <source>Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="settingsdialog.ui" line="1542"/>
<source>Author:</source>
<translation type="unfinished"></translation>
@@ -8819,11 +8954,63 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="settingsdialog.ui" line="1746"/>
+ <source>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1749"/>
+ <source>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)
+Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1753"/>
+ <source>Force-enable game files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1763"/>
+ <source>Enable parsing of Archives. This is an Experimental Feature. Has negative effects on performance and known incorrectness.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1766"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, MO will parse archive files (BSA, BA2) to calculate conflicts between the contents of the archive files and other loose files. This process has a noticeable cost in performance.&lt;/p&gt;&lt;p&gt;This feature should not be confused with the archive management feature offered by MO1. MO2 will only show conflicts with archives and will NOT load them into the game or program.&lt;/p&gt;&lt;p&gt;If you disable this feature, MO will only display conflicts between loose files.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="settingsdialog.ui" line="1769"/>
<source>Enable archives parsing (experimental)</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="settingsdialog.ui" line="1779"/>
+ <location filename="settingsdialog.ui" line="1782"/>
+ <source>Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1785"/>
+ <source>Lock GUI when running executable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1798"/>
+ <source>Steam</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1807"/>
+ <source>Password</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1821"/>
+ <source>Username</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="settingsdialog.ui" line="1828"/>
<source>Steam App ID</source>
<translation type="unfinished"></translation>
@@ -8850,70 +9037,64 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="519"/>
- <source>Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="522"/>
- <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, esms, and esls) displayed in the right pane are completely unaffected by this feature.</source>
+ <location filename="settingsdialog.ui" line="1865"/>
+ <source>Network</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="528"/>
- <source>Display mods installed outside MO</source>
+ <location filename="settingsdialog.ui" line="1871"/>
+ <source>Disable automatic internet features</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1746"/>
- <source>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)</source>
+ <location filename="settingsdialog.ui" line="1874"/>
+ <source>Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1749"/>
- <source>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)
-Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled.</source>
+ <location filename="settingsdialog.ui" line="1877"/>
+ <source>Offline Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1753"/>
- <source>Force-enable game files</source>
+ <location filename="settingsdialog.ui" line="1884"/>
+ <source>Use a proxy for network connections.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1779"/>
- <location filename="settingsdialog.ui" line="1782"/>
- <source>Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior.</source>
+ <location filename="settingsdialog.ui" line="1887"/>
+ <source>Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1785"/>
- <source>Lock GUI when running executable</source>
+ <location filename="settingsdialog.ui" line="1890"/>
+ <source>Use System HTTP Proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1763"/>
- <source>Enable parsing of Archives. This is an Experimental Feature. Has negative effects on performance and known incorrectness.</source>
+ <location filename="settingsdialog.ui" line="1912"/>
+ <location filename="settingsdialog.ui" line="1915"/>
+ <location filename="settingsdialog.ui" line="1918"/>
+ <location filename="settingsdialog.ui" line="1928"/>
+ <location filename="settingsdialog.ui" line="1931"/>
+ <location filename="settingsdialog.ui" line="1934"/>
+ <source>Use &quot;%1&quot; as a placeholder for the URL.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1766"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, MO will parse archive files (BSA, BA2) to calculate conflicts between the contents of the archive files and other loose files. This process has a noticeable cost in performance.&lt;/p&gt;&lt;p&gt;This feature should not be confused with the archive management feature offered by MO1. MO2 will only show conflicts with archives and will NOT load them into the game or program.&lt;/p&gt;&lt;p&gt;If you disable this feature, MO will only display conflicts between loose files.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <location filename="settingsdialog.ui" line="1921"/>
+ <source>Custom browser</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="2002"/>
- <location filename="settingsdialog.ui" line="2006"/>
- <source>For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles.
-For the other games this is not a sufficient replacement for AI!</source>
+ <location filename="settingsdialog.ui" line="1969"/>
+ <location filename="settingsdialog.ui" line="1972"/>
+ <source>Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="2010"/>
- <source>Back-date BSAs</source>
+ <location filename="settingsdialog.ui" line="1975"/>
+ <source>Reset Window Geometries</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -8931,14 +9112,20 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1969"/>
- <location filename="settingsdialog.ui" line="1972"/>
- <source>Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations.</source>
+ <location filename="settingsdialog.ui" line="1992"/>
+ <source>Executables Blacklist</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1975"/>
- <source>Reset Window Geometries</source>
+ <location filename="settingsdialog.ui" line="2002"/>
+ <location filename="settingsdialog.ui" line="2006"/>
+ <source>For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles.
+For the other games this is not a sufficient replacement for AI!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="2010"/>
+ <source>Back-date BSAs</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -8952,18 +9139,8 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="2171"/>
- <source>Hint: right click link and copy link location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="2174"/>
- <source>
- Logs and crash dumps are stored under your current instance in the &lt;a href=&quot;LOGS_FULL_PATH&quot;&gt;LOGS_DIR&lt;/a&gt;
- and &lt;a href=&quot;DUMPS_FULL_PATH&quot;&gt;DUMPS_DIR&lt;/a&gt; folders.
- Sending logs and/or crash dumps to the developers can help investigate issues.
- It is recommended to compress large log and dmp files before sending.
- </source>
+ <location filename="settingsdialog.ui" line="2074"/>
+ <source>Logs and Crashes</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -8972,36 +9149,6 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1890"/>
- <source>Use System HTTP Proxy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="1912"/>
- <location filename="settingsdialog.ui" line="1915"/>
- <location filename="settingsdialog.ui" line="1918"/>
- <location filename="settingsdialog.ui" line="1928"/>
- <location filename="settingsdialog.ui" line="1931"/>
- <location filename="settingsdialog.ui" line="1934"/>
- <source>Use &quot;%1&quot; as a placeholder for the URL.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="1921"/>
- <source>Custom browser</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="1992"/>
- <source>Executables Blacklist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="settingsdialog.ui" line="2074"/>
- <source>Logs and Crashes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="settingsdialog.ui" line="2090"/>
<source>Decides the amount of data printed to &quot;ModOrganizer.log&quot;</source>
<translation type="unfinished"></translation>
@@ -9064,6 +9211,21 @@ programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="settingsdialog.ui" line="2171"/>
+ <source>Hint: right click link and copy link location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="2174"/>
+ <source>
+ Logs and crash dumps are stored under your current instance in the &lt;a href=&quot;LOGS_FULL_PATH&quot;&gt;LOGS_DIR&lt;/a&gt;
+ and &lt;a href=&quot;DUMPS_FULL_PATH&quot;&gt;DUMPS_DIR&lt;/a&gt; folders.
+ Sending logs and/or crash dumps to the developers can help investigate issues.
+ It is recommended to compress large log and dmp files before sending.
+ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="settingsdialog.cpp" line="125"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
@@ -9312,7 +9474,7 @@ On Windows XP:
</message>
<message>
<location filename="validationprogressdialog.ui" line="35"/>
- <location filename="nxmaccessmanager.cpp" line="145"/>
+ <location filename="nxmaccessmanager.cpp" line="144"/>
<source>Connecting to Nexus...</source>
<translation type="unfinished"></translation>
</message>
@@ -9327,9 +9489,584 @@ On Windows XP:
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="143"/>
+ <location filename="nxmaccessmanager.cpp" line="142"/>
<source>Trying again...</source>
<translation type="unfinished"></translation>
</message>
</context>
+<context>
+ <name>tutorial_conflictresolution_main</name>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="5"/>
+ <source>There are multiple types of conflicts you may encounter when dealing with Mods. This tutorial will try to cover and explain how to deal with all of them.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="10"/>
+ <source>First up are file conflicts. These occur when two mods contain the same file. Most commonly this happens when several mods replace the same standard asset from the game, like the texture of an armor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="16"/>
+ <source>As an example, say you install &quot;ModA&quot; which contains stylish new iron and leather armor. Then you install &quot;ModB&quot; which contains sexy ebony and leather armor. Obviously there is a conflict now: which leather armor to use?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="22"/>
+ <source>If you were to install the mods manually, when installing &quot;ModB&quot; you would be asked if you want to overwrite conflicting files. If you choose yes, you get the leather armor from &quot;ModB&quot; otherwise you keep the one from &quot;ModA&quot;. If you later decide you made the wrong choice, you have to reinstall one of the mods.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="29"/>
+ <source>With MO, both ModA and ModB get installed completely (no overwrite dialog) and by default &quot;ModB&quot; gets to provide the leather armor because it&apos;s automatically assigned the higher priority.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="34"/>
+ <source>However, you can change the mod priority at any time using drag&amp;drop on this list. If you assign &quot;ModA&quot; a higher priority, it provides the leather armor, no re-installation required. Since the priorities of mods in this list are treated as if the mods were installed in that order, I tend to talk about &quot;installation order&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="42"/>
+ <source>If the &quot;Flags&quot;-column is enabled in the mod list, it will show you which mods are involved in a conflict and how...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="47"/>
+ <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>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="51"/>
+ <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>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="55"/>
+ <source>&lt;img src=&quot;qrc:///MO/gui/emblem_conflict_mixed&quot; /&gt; indicates that both of the above is true.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="59"/>
+ <source>&lt;img src=&quot;qrc:///MO/gui/emblem_conflict_redundant&quot; /&gt; indicates that the mod is completely overwritten by another. You could as well disable it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="63"/>
+ <source>There are two ways to see the individual files involved in a conflict:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="67"/>
+ <source>Option A: Switch to the &quot;Data&quot;-tab if necessary</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="76"/>
+ <source>... here, if you mark the highlighted control, the tree will only display files in conflict. In the right column, it says which mod currently provides the mod (because it has highest priority) and if you hover your mouse over that info, it will list which other mods contains it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="83"/>
+ <source>Option B: Open the &lt;i&gt;Information&lt;/i&gt;-Dialog of an &lt;b&gt;enabled&lt;/b&gt; mod you&apos;re interested in by either double-clicking it or selecting &lt;i&gt;Information...&lt;/i&gt; from the right-click menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="91"/>
+ <source>This was everything to know about file conflicts. The second type of conflict we have to deal with are &quot;record conflicts&quot;.</source>
+ <translation type="unfinished"></translation>
+ </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/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>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="102"/>
+ <source>As with file conflicts you can&apos;t really fix these conflicts, you have to choose which change you want. This time around however, if you choose wrong, your game may become unstable because there may be dependencies between the records of a mod.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="108"/>
+ <source>Please open the &quot;Plugins&quot;-tab...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="115"/>
+ <source>Again you can use drag&amp;drop to change priorities of plugins, thus deciding which plugin takes precedence in regards to conflicts. This is commonly called the &quot;load order&quot;. But how do you know how to order the plugins?</source>
+ <translation type="unfinished"></translation>
+ </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 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>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="128"/>
+ <source>After you installed LOOT in the default location (follow its instructions), start MO again and LOOT should automatically appear as an Executable...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="133"/>
+ <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>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="140"/>
+ <source>The final type of conflicts are also &quot;record conflicts&quot;. Like the previous type. It&apos;s confusing, so I&apos;ll just call them &quot;lists conflicts&quot; instead. The difference is the types of records in conflict. The ones in question here can be merged so you may be able to get all modifications in your game.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="146"/>
+ <source>One common example of such records are leveled lists that contain all the items that may spawn at a specific character level. Traditionally, if multiple mods add items to such a list, only one is in effect...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="151"/>
+ <source>... but there are tools to merge those mods so you can have the effects of all of them. Again, this functionality is not integrated with MO because there are already great tools. For Oblivion and Skyrim look for wrye bash, for fallout 3/nv it&apos;s wrye flash. For Skyrim there is also &quot;SkyBash&quot;. All of these can create a so-called &quot;bashed patch&quot; which is a plugin that contains the combined mergeable records from all your mods.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_main.js" line="159"/>
+ <source>This completes the tutorial.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>tutorial_conflictresolution_modinfo</name>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_modinfo.js" line="4"/>
+ <source>Please switch to the &quot;Conflicts&quot;-Tab.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_modinfo.js" line="11"/>
+ <source>Here you can see a list of files in this mod that out-prioritize others in a file conflict and one with files where this mod is overridden.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_conflictresolution_modinfo.js" line="16"/>
+ <source>Please close the information dialog again.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>tutorial_firststeps_browser</name>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_browser.js" line="5"/>
+ <source>This is a fully featured browser that is set up to open the correct nexus page for your game. You can download any mod using the &quot;DOWNLOAD WITH MANAGER&quot;-button or the &quot;manual&quot;-link and it will be downloaded by MO.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>tutorial_firststeps_main</name>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="6"/>
+ <source>Welcome to the ModOrganizer Tutorial! This will guide you through the most common features of MO.
+Please go along with the tutorial because some things can&apos;t be demonstrated if you skip something.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="12"/>
+ <source>Before we continue with the step-by-step tutorial, I&apos;d like to tell you about the other ways you can receive help on ModOrganizer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="17"/>
+ <source>The highlighted button provides hints on solving potential problems MO recognized automatically.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="19"/>
+ <source>
+There IS a notification now but you may want to hold off on clearing it until after completing the tutorial.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="29"/>
+ <source>This button provides multiple sources of information and further tutorials.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="40"/>
+ <source>Finally there are tooltips on almost every part of Mod Organizer. If there is a control in MO you don&apos;t understand, please try hovering over it to get a short description or use &quot;Help on UI&quot; from the help menu to get a longer explanation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="47"/>
+ <source>This list displays all mods installed through MO. It also displays installed DLCs and some mods installed outside MO but you have limited control over those in MO.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="54"/>
+ <source>Before we start installing mods, let&apos;s have a quick look at the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="66"/>
+ <source>Now it&apos;s time to install a few mods!Please go along with this because we need a few mods installed to demonstrate other features</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="72"/>
+ <source>There are a few ways to get mods into ModOrganizer. If you associated MO with NXM links in the settings you can now use your regular browser to send downloads from Nexus to MO. Click on &quot;Nexus&quot; to open nexus, find a mod and click the green download buttons on Nexus saying &quot;Download with Manager&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="86"/>
+ <source>You can also install mods from disk using the &quot;Install Mod&quot; button.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="92"/>
+ <source>Downloads will appear on the &quot;Downloads&quot;-tab here. You have to download and install at least one mod to proceed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="100"/>
+ <source>Great, you just installed your first mod. Please note that the installation procedure may differ based on how a mod was packaged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="106"/>
+ <source>Now you know all about downloading and installing mods but they are not enabled yet...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="111"/>
+ <source>Install a few more mods if you want, then enable mods by checking them in the left pane. Mods that aren&apos;t enabled have no effect on the game whatsoever. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="120"/>
+ <source>For some mods, enabling it on the left pane is all you have to do...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="125"/>
+ <source>...but most contain plugins. These are plugins for the game and are required to add stuff to the game (new weapons, armors, quests, areas, ...). Please open the &quot;Plugins&quot;-tab to get a list of plugins.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="136"/>
+ <source>You will notice some plugins are grayed out. These are part of the main game and can&apos;t be disabled.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="142"/>
+ <source>A single mod may contain zero, one or multiple esps. Some or all may be optional. If in doubt, please consult the documentation of the individual mod. To do so, right-click the mod and select &quot;Information&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="151"/>
+ <source>Now you know how to download, install and enable mods.
+It&apos;s important you always start the game from inside MO, otherwise the mods you installed here won&apos;t work.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="159"/>
+ <source>This combobox lets you choose &lt;i&gt;what&lt;/i&gt; to start. This way you can start the game, Launcher, Script Extender, the Creation Kit or other tools. If you miss a tool you can also configure this list but that is an advanced topic.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_main.js" line="167"/>
+ <source>This completes the basic tutorial. As homework go play a bit! After you have installed more mods you may want to read the tutorial on conflict resolution.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>tutorial_firststeps_modinfo</name>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_modinfo.js" line="5"/>
+ <source>This dialog tries to expose as much information about a mod as possible. Depending on the mod this may include readmes, screenshots, optional plugins and so on. If a certain type of information was not found in a mod, the corresponding tab is grayed out.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_modinfo.js" line="13"/>
+ <source>If you installed the mod from Nexus, the corresponding tab should give you direct access to the mod page.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_modinfo.js" line="19"/>
+ <source>We may revisit this screen in later tutorials.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>tutorial_firststeps_settings</name>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_settings.js" line="6"/>
+ <source>You can use your regular browser to download from Nexus.
+Please open the &quot;Nexus&quot;-tab</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_settings.js" line="12"/>
+ <source>Click this button so that &quot;DOWNLOAD WITH MANAGER&quot;-buttons are download with Mod Organizer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_firststeps_settings.js" line="19"/>
+ <source>Use this interface to obtain an API key from NexusMods. This is used for all API connections - downloads, updates etc. MO2 uses the Windows Credential Manager to store this data securely. If the SSO page on Nexus is failing, use the manual entry and copy the API key from your profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>tutorial_primer_main</name>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="72"/>
+ <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="73"/>
+ <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="74"/>
+ <source>Perform various actions on your mod list, such as refreshing data and checking for mod updates.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="75"/>
+ <source>Quick access to various directories, such as your MO2 mods, profiles, saves, and your active game location.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="76"/>
+ <source>Restore a mod list backup.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="77"/>
+ <source>Create a backup of your current mod list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="78"/>
+ <source>Running counter of your active mods. Hover to see a more detailed breakdown.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="79"/>
+ <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="80"/>
+ <source>Show/hide the category pane.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="81"/>
+ <source>Quickly filter the mod list as you type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="82"/>
+ <source>Switch between information views.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="83"/>
+ <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="84"/>
+ <source>Customizable list for choosing the program to run.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="85"/>
+ <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="86"/>
+ <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="87"/>
+ <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="88"/>
+ <source>Indicator of your current NexusMods API request limits.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="90"/>
+ <source>Change/manage MO2 instances or switch to portable mode.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="91"/>
+ <source>Browse to and manually install a mod from an archive on your computer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="92"/>
+ <location filename="tutorials/tutorial_primer_main.js" line="93"/>
+ <source>Automatically open NexusMods to browse and install mods via the API.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="94"/>
+ <source>Manage your MO2 profiles.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="95"/>
+ <source>Refresh everything.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="96"/>
+ <source>Open the executable editor to add and modify applications you wish to run with MO2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="97"/>
+ <source>Select from a collection of additional tools, such as an INI editor, integrated FNIS updater, and more.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="98"/>
+ <source>Configure Mod Organizer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="99"/>
+ <source>See the status of and/or endorse MO2 on NexusMods.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="100"/>
+ <source>Notifications about the current setup.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="101"/>
+ <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="102"/>
+ <source>Access more information about MO2, including these tutorials, a link to the development discord, information about the devs and dependencies.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="106"/>
+ <source>Plugins (esp/esm/esl files) of the mods in the current profile. They need to be checked to be loaded.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="107"/>
+ <source>Automatically sort plugins using the bundled LOOT application.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="108"/>
+ <source>Restore a backup of your plugin list order.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="109"/>
+ <source>Save a backup of your plugin list order.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="110"/>
+ <source>Counter of your total active plugins. Hover to see a breakdown of plugin types.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="111"/>
+ <source>Quickly filter plugin list as you type.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_primer_main.js" line="114"/>
+ <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="117"/>
+ <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="120"/>
+ <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="123"/>
+ <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="131"/>
+ <source>Click to quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>tutorial_window_installer</name>
+ <message>
+ <location filename="tutorials/tutorial_window_installer.js" line="6"/>
+ <source>This mod has been packaged in a way that Mod Organizer did not automatically recognize...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_window_installer.js" line="11"/>
+ <source>You can use drag&amp;drop on this list to fix the structure of the mod.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_window_installer.js" line="16"/>
+ <source>The correct structure replicates the data-directory of the game. That means esps, the &quot;meshes&quot;- or &quot;textures&quot;-directory and so on should be directly below &quot;&lt;data&gt;&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_window_installer.js" line="22"/>
+ <source>You can also disable files and directories that you don&apos;t want to unpack.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_window_installer.js" line="26"/>
+ <source>From the context menu (right-click) you can open textfiles, in case you want to access a readme.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="tutorials/tutorial_window_installer.js" line="31"/>
+ <source>This text will turn green if MO thinks the structure looks good.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>uibase</name>
+ <message>
+ <location filename="../../uibase/src/utility.cpp" line="1155"/>
+ <source>h</source>
+ <extracomment>Time remaining hours</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../uibase/src/utility.cpp" line="1158"/>
+ <source>m</source>
+ <extracomment>Time remaining minutes</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../uibase/src/utility.cpp" line="1161"/>
+ <source>s</source>
+ <extracomment>Time remaining seconds</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
</TS>
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 7cf3212a..0807957b 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -1428,17 +1428,20 @@ void OrganizerCore::requestDownload(const QUrl &url, QNetworkReply *reply)
QString gameName = "";
int modID = 0;
int fileID = 0;
- QRegExp nameExp("www\\.nexusmods\\.com/(\\a+)/");
- if (nameExp.indexIn(url.toString()) != -1) {
- gameName = nameExp.cap(1);
+ QRegularExpression nameExp("www\\.nexusmods\\.com/(\\a+)/");
+ auto match = nameExp.match(url.toString());
+ if (match.hasMatch()) {
+ gameName = match.captured(1);
}
- QRegExp modExp("mods/(\\d+)");
- if (modExp.indexIn(url.toString()) != -1) {
- modID = modExp.cap(1).toInt();
+ QRegularExpression modExp("mods/(\\d+)");
+ match = modExp.match(url.toString());
+ if (match.hasMatch()) {
+ modID = match.captured(1).toInt();
}
- QRegExp fileExp("fid=(\\d+)");
- if (fileExp.indexIn(reply->url().toString()) != -1) {
- fileID = fileExp.cap(1).toInt();
+ QRegularExpression fileExp("fid=(\\d+)");
+ match = fileExp.match(url.toString());
+ if (match.hasMatch()) {
+ fileID = match.captured(1).toInt();
}
m_DownloadManager.addDownload(reply,
new ModRepositoryFileInfo(gameName, modID, fileID));
diff --git a/src/pch.h b/src/pch.h
index bfc7f2d2..f12e9110 100644
--- a/src/pch.h
+++ b/src/pch.h
@@ -184,9 +184,8 @@
#include <QQueue>
#include <QRadioButton>
#include <QRect>
-#include <QRegExp>
-#include <QRegExpValidator>
#include <QRegularExpression>
+#include <QRegularExpressionValidator>
#include <QResizeEvent>
#include <QScopedArrayPointer>
#include <QScopedPointer>
@@ -221,7 +220,6 @@
#include <QTableWidget>
#include <QTemporaryFile>
#include <QTextBrowser>
-#include <QTextCodec>
#include <QTextDocument>
#include <QTextEdit>
#include <QTextStream>
@@ -243,7 +241,7 @@
#include <QVariantMap>
#include <QVector>
#include <QVersionNumber>
-#include <QWebEngineContextMenuData>
+#include <QWebEngineContextMenuRequest>
#include <QWebEngineHistory>
#include <QWebEnginePage>
#include <QWebEngineProfile>
@@ -263,7 +261,6 @@
#include <QtDebug>
#include <QtGlobal>
#include <QtGui/QtGui>
-#include <QtPlatformHeaders/QWindowsWindowFunctions>
#include <QtPlugin>
#include <QtTest/QtTest>
#include <QStandardPaths>
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp
index 3812143a..28e0af51 100644
--- a/src/pluginlist.cpp
+++ b/src/pluginlist.cpp
@@ -43,7 +43,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QDir>
#include <QFile>
#include <QFileInfo>
-#include <QTextCodec>
#include <QFileInfo>
#include <QListWidgetItem>
#include <QRegularExpression>
@@ -62,27 +61,6 @@ using namespace MOBase;
using namespace MOShared;
-static bool ByName(const PluginList::ESPInfo& LHS, const PluginList::ESPInfo& RHS)
-{
- return LHS.name.toUpper() < RHS.name.toUpper();
-}
-
-static bool ByPriority(const PluginList::ESPInfo& LHS, const PluginList::ESPInfo& RHS)
-{
- if (LHS.isMaster && !RHS.isMaster) {
- return true;
- } else if (!LHS.isMaster && RHS.isMaster) {
- return false;
- } else {
- return LHS.priority < RHS.priority;
- }
-}
-
-static bool ByDate(const PluginList::ESPInfo& LHS, const PluginList::ESPInfo& RHS)
-{
- return QFileInfo(LHS.fullPath).lastModified() < QFileInfo(RHS.fullPath).lastModified();
-}
-
static QString TruncateString(const QString& text)
{
QString new_text = text;
@@ -272,6 +250,9 @@ void PluginList::refresh(const QString &profileName
gamePlugins->readPluginLists(m_Organizer.managedGameOrganizer()->pluginList());
}
+ fixPrimaryPlugins();
+ fixPluginRelationships();
+
testMasters();
updateIndices();
@@ -287,6 +268,84 @@ void PluginList::refresh(const QString &profileName
m_Refreshed();
}
+void PluginList::fixPrimaryPlugins()
+{
+ if (!m_Organizer.settings().game().forceEnableCoreFiles()) {
+ return;
+ }
+
+ // This function ensures that the primary plugins are first and in the correct order
+ QStringList primaryPlugins = m_Organizer.managedGame()->primaryPlugins();
+ int prio = 0;
+ bool somethingChanged = false;
+ for (QString plugin : primaryPlugins) {
+ std::map<QString, int>::iterator iter = m_ESPsByName.find(plugin);
+ // Plugin is present?
+ if (iter != m_ESPsByName.end()) {
+ if (prio != m_ESPs[iter->second].priority) {
+ // Priority is wrong! Fix it!
+ int newPrio = prio;
+ setPluginPriority(iter->second, newPrio, true /* isForced */);
+ somethingChanged = true;
+ }
+ prio++;
+ }
+ }
+
+ if (somethingChanged) {
+ writePluginsList();
+ }
+}
+
+void PluginList::fixPluginRelationships()
+{
+ TimeThis timer("PluginList::fixPluginRelationships");
+
+ // Count the types of plugins
+ int masterCount = 0;
+ for (auto plugin : m_ESPs) {
+ if (plugin.hasLightExtension ||
+ plugin.hasMasterExtension ||
+ plugin.isMasterFlagged) {
+ masterCount++;
+ }
+ }
+
+ // Ensure masters are up top and normal plugins are down below
+ for (int i = 0; i < m_ESPs.size(); i++) {
+ ESPInfo& plugin = m_ESPs[i];
+ if (plugin.hasLightExtension ||
+ plugin.hasMasterExtension ||
+ plugin.isMasterFlagged) {
+ if (plugin.priority > masterCount) {
+ int newPriority = masterCount + 1;
+ setPluginPriority(i, newPriority);
+ }
+ }
+ else {
+ if (plugin.priority < masterCount) {
+ int newPriority = masterCount + 1;
+ setPluginPriority(i, newPriority);
+ }
+ }
+ }
+
+ // Ensure master/child relationships are observed
+ for (int i = 0; i < m_ESPs.size(); i++) {
+ ESPInfo& plugin = m_ESPs[i];
+ int newPriority = plugin.priority;
+ for (auto master : plugin.masters) {
+ auto iter = m_ESPsByName.find(master);
+ if (iter != m_ESPsByName.end()) {
+ newPriority = std::max(newPriority, m_ESPs[iter->second].priority);
+ }
+ }
+ if (newPriority != plugin.priority) {
+ setPluginPriority(i, newPriority);
+ }
+ }
+}
+
void PluginList::fixPriorities()
{
std::vector<std::pair<int, int>> espPrios;
@@ -846,57 +905,71 @@ int PluginList::loadOrder(const QString &name) const
}
}
-bool PluginList::isMaster(const QString &name) const
+QStringList PluginList::masters(const QString &name) const
{
auto iter = m_ESPsByName.find(name);
if (iter == m_ESPsByName.end()) {
- return false;
+ return QStringList();
+ } else {
+ QStringList result;
+ for (const QString &master : m_ESPs[iter->second].masters) {
+ result.append(master);
+ }
+ return result;
+ }
+}
+
+QString PluginList::origin(const QString &name) const
+{
+ auto iter = m_ESPsByName.find(name);
+ if (iter == m_ESPsByName.end()) {
+ return QString();
} else {
- return m_ESPs[iter->second].isMaster;
+ return m_ESPs[iter->second].originName;
}
}
-bool PluginList::isLight(const QString &name) const
+bool PluginList::hasMasterExtension(const QString& name) const
{
auto iter = m_ESPsByName.find(name);
if (iter == m_ESPsByName.end()) {
return false;
- } else {
- return m_ESPs[iter->second].isLight;
+ }
+ else {
+ return m_ESPs[iter->second].hasMasterExtension;
}
}
-bool PluginList::isLightFlagged(const QString &name) const
+bool PluginList::hasLightExtension(const QString& name) const
{
auto iter = m_ESPsByName.find(name);
if (iter == m_ESPsByName.end()) {
return false;
- } else {
- return m_ESPs[iter->second].isLightFlagged;
+ }
+ else {
+ return m_ESPs[iter->second].hasLightExtension;
}
}
-QStringList PluginList::masters(const QString &name) const
+bool PluginList::isMasterFlagged(const QString& name) const
{
auto iter = m_ESPsByName.find(name);
if (iter == m_ESPsByName.end()) {
- return QStringList();
- } else {
- QStringList result;
- for (const QString &master : m_ESPs[iter->second].masters) {
- result.append(master);
- }
- return result;
+ return false;
+ }
+ else {
+ return m_ESPs[iter->second].isMasterFlagged;
}
}
-QString PluginList::origin(const QString &name) const
+bool PluginList::isLightFlagged(const QString& name) const
{
auto iter = m_ESPsByName.find(name);
if (iter == m_ESPsByName.end()) {
- return QString();
- } else {
- return m_ESPs[iter->second].originName;
+ return false;
+ }
+ else {
+ return m_ESPs[iter->second].isLightFlagged;
}
}
@@ -961,7 +1034,7 @@ void PluginList::generatePluginIndexes()
++numSkipped;
continue;
}
- if (lightPluginsSupported && (m_ESPs[i].isLight || m_ESPs[i].isLightFlagged)) {
+ if (lightPluginsSupported && (m_ESPs[i].hasLightExtension || m_ESPs[i].isLightFlagged)) {
int ESLpos = 254 + ((numESLs + 1) / 4096);
m_ESPs[i].index = QString("%1:%2").arg(ESLpos, 2, 16, QChar('0')).arg((numESLs) % 4096, 3, 16, QChar('0')).toUpper();
++numESLs;
@@ -1090,10 +1163,12 @@ QVariant PluginList::fontData(const QModelIndex &modelIndex) const
QFont result;
- if (m_ESPs[index].isMaster) {
+ if (m_ESPs[index].hasMasterExtension ||
+ m_ESPs[index].isMasterFlagged ||
+ m_ESPs[index].hasLightExtension) {
result.setItalic(true);
result.setWeight(QFont::Bold);
- } else if (m_ESPs[index].isLight || m_ESPs[index].isLightFlagged) {
+ } else if (m_ESPs[index].isLightFlagged) {
result.setItalic(true);
}
@@ -1175,7 +1250,7 @@ QVariant PluginList::tooltipData(const QModelIndex &modelIndex) const
"be added to your game settings, overwriting in case of conflicts.");
}
- if (esp.isLightFlagged && !esp.isLight) {
+ if (esp.isLightFlagged && !esp.hasLightExtension) {
toolTip +=
"<br><br>" + tr(
"This ESP is flagged as an ESL. It will adhere to the ESP load "
@@ -1297,7 +1372,7 @@ QVariant PluginList::iconData(const QModelIndex &modelIndex) const
result.append(":/MO/gui/archive_conflict_neutral");
}
- if (esp.isLightFlagged && !esp.isLight) {
+ if (esp.isLightFlagged && !esp.hasLightExtension) {
result.append(":/MO/gui/awaiting");
}
@@ -1423,7 +1498,7 @@ Qt::ItemFlags PluginList::flags(const QModelIndex &modelIndex) const
return result;
}
-void PluginList::setPluginPriority(int row, int &newPriority)
+void PluginList::setPluginPriority(int row, int &newPriority, bool isForced)
{
int newPriorityTemp = newPriority;
@@ -1433,18 +1508,22 @@ void PluginList::setPluginPriority(int row, int &newPriority)
else if (newPriorityTemp >= static_cast<int>(m_ESPsByPriority.size()))
newPriorityTemp = static_cast<int>(m_ESPsByPriority.size()) - 1;
- if (!m_ESPs[row].isMaster && !m_ESPs[row].isLight) {
+ if (!m_ESPs[row].isMasterFlagged &&
+ !m_ESPs[row].hasLightExtension &&
+ !m_ESPs[row].hasMasterExtension) {
// 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)).isMaster ||
- m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).isLight)) {
+ (m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).isMasterFlagged ||
+ m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).hasLightExtension ||
+ m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).hasMasterExtension)) {
++newPriorityTemp;
}
} else {
// don't allow esms to be moved below esps
while ((newPriorityTemp > 0) &&
- !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).isMaster &&
- !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).isLight) {
+ !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).isMasterFlagged &&
+ !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).hasLightExtension &&
+ !m_ESPs.at(m_ESPsByPriority.at(newPriorityTemp)).hasMasterExtension) {
--newPriorityTemp;
}
// also don't allow "regular" esms to be moved above primary plugins
@@ -1454,25 +1533,54 @@ void PluginList::setPluginPriority(int row, int &newPriority)
}
}
- try {
- int oldPriority = m_ESPs.at(row).priority;
- if (newPriorityTemp > oldPriority) {
- // priority is higher than the old, so the gap we left is in lower priorities
- for (int i = oldPriority + 1; i <= newPriorityTemp; ++i) {
- --m_ESPs.at(m_ESPsByPriority.at(i)).priority;
+ int oldPriority = m_ESPs.at(row).priority;
+ if (newPriorityTemp < oldPriority) { // moving up
+ // don't allow plugins to be moved above their masters
+ for (auto master : m_ESPs[row].masters) {
+ auto iter = m_ESPsByName.find(master);
+ if (iter != m_ESPsByName.end()) {
+ int masterPriority = m_ESPs[iter->second].priority;
+ if (masterPriority >= newPriorityTemp)
+ {
+ newPriorityTemp = masterPriority + 1;
+ }
}
- emit dataChanged(index(oldPriority + 1, 0), index(newPriorityTemp, columnCount()));
- } else {
- for (int i = newPriorityTemp; i < oldPriority; ++i) {
- ++m_ESPs.at(m_ESPsByPriority.at(i)).priority;
+ }
+ }
+ else if (newPriorityTemp > oldPriority) { // moving down
+ // don't allow masters to be moved below their children
+ for (int i = oldPriority + 1; i <= newPriorityTemp; i++) {
+ PluginList::ESPInfo* otherInfo = &m_ESPs.at(m_ESPsByPriority[i]);
+ for (auto master : otherInfo->masters) {
+ if (master.compare(m_ESPs[row].name, Qt::CaseInsensitive) == 0) {
+ newPriorityTemp = otherInfo->priority - 1;
+ break;
+ }
}
- emit dataChanged(index(newPriorityTemp, 0), index(oldPriority - 1, columnCount()));
- ++newPriority;
}
+ }
+
+ try {
+ if (newPriorityTemp != oldPriority) {
+ if (newPriorityTemp > oldPriority) {
+ // priority is higher than the old, so the gap we left is in lower priorities
+ for (int i = oldPriority + 1; i <= newPriorityTemp; ++i) {
+ --m_ESPs.at(m_ESPsByPriority.at(i)).priority;
+ }
+ emit dataChanged(index(oldPriority + 1, 0), index(newPriorityTemp, columnCount()));
+ }
+ else {
+ for (int i = newPriorityTemp; i < oldPriority; ++i) {
+ ++m_ESPs.at(m_ESPsByPriority.at(i)).priority;
+ }
+ emit dataChanged(index(newPriorityTemp, 0), index(oldPriority - 1, columnCount()));
+ ++newPriority;
+ }
- m_ESPs.at(row).priority = newPriorityTemp;
- emit dataChanged(index(row, 0), index(row, columnCount()));
- m_PluginMoved(m_ESPs[row].name, oldPriority, newPriorityTemp);
+ m_ESPs.at(row).priority = newPriorityTemp;
+ emit dataChanged(index(row, 0), index(row, columnCount()));
+ m_PluginMoved(m_ESPs[row].name, oldPriority, newPriorityTemp);
+ }
} catch (const std::out_of_range&) {
reportError(tr("failed to restore load order for %1").arg(m_ESPs[row].name));
}
@@ -1490,11 +1598,11 @@ void PluginList::changePluginPriority(std::vector<int> rows, int newPriority)
// don't try to move plugins before force-enabled plugins
for (std::vector<ESPInfo>::const_iterator iter = m_ESPs.begin();
- iter != m_ESPs.end(); ++iter) {
+ iter != m_ESPs.end(); ++iter) {
if (iter->forceEnabled) {
- newPriority = std::max(newPriority, iter->priority+1);
+ newPriority = std::max(newPriority, iter->priority + 1);
}
- maxPriority = std::max(maxPriority, iter->priority+1);
+ maxPriority = std::max(maxPriority, iter->priority + 1);
minPriority = std::min(minPriority, iter->priority);
}
@@ -1586,9 +1694,10 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled,
{
try {
ESP::File file(ToWString(fullPath));
- isMaster = file.isMaster();
auto extension = name.right(3).toLower();
- isLight = lightPluginsAreSupported && (extension == "esl");
+ hasMasterExtension = (extension == "esm");
+ hasLightExtension = lightPluginsAreSupported && (extension == "esl");
+ isMasterFlagged = file.isMaster();
isLightFlagged = lightPluginsAreSupported && file.isLight();
author = QString::fromLatin1(file.author().c_str());
@@ -1599,8 +1708,9 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled,
}
} catch (const std::exception &e) {
log::error("failed to parse plugin file {}: {}", fullPath, e.what());
- isMaster = false;
- isLight = false;
+ hasMasterExtension = false;
+ hasLightExtension = false;
+ isMasterFlagged = false;
isLightFlagged = false;
}
}
diff --git a/src/pluginlist.h b/src/pluginlist.h
index a4310d2a..56ec9d3d 100644
--- a/src/pluginlist.h
+++ b/src/pluginlist.h
@@ -232,13 +232,15 @@ public:
int priority(const QString &name) const;
int loadOrder(const QString &name) const;
bool setPriority(const QString& name, int newPriority);
- bool isMaster(const QString &name) const;
- bool isLight(const QString &name) const;
- bool isLightFlagged(const QString &name) const;
QStringList masters(const QString &name) const;
QString origin(const QString &name) const;
void setLoadOrder(const QStringList& pluginList);
+ bool hasMasterExtension(const QString& name) const;
+ bool hasLightExtension(const QString& name) const;
+ bool isMasterFlagged(const QString& name) const;
+ bool isLightFlagged(const QString& name) const;
+
boost::signals2::connection onRefreshed(const std::function<void()>& callback);
boost::signals2::connection onPluginMoved(const std::function<void(const QString&, int, int)>& func);
boost::signals2::connection onPluginStateChanged(const std::function<void (const std::map<QString, PluginStates>&)> &func);
@@ -319,8 +321,9 @@ private:
int loadOrder;
FILETIME time;
QString originName;
- bool isMaster;
- bool isLight;
+ bool hasMasterExtension;
+ bool hasLightExtension;
+ bool isMasterFlagged;
bool isLightFlagged;
bool modSelected;
QString author;
@@ -341,10 +344,6 @@ private:
Loot::Plugin loot;
};
- friend bool ByName(const ESPInfo& LHS, const ESPInfo& RHS);
- friend bool ByDate(const ESPInfo& LHS, const ESPInfo& RHS);
- friend bool ByPriority(const ESPInfo& LHS, const ESPInfo& RHS);
-
private:
void syncLoadOrder();
@@ -353,12 +352,14 @@ private:
void writeLockedOrder(const QString &fileName) const;
void readLockedOrderFrom(const QString &fileName);
- void setPluginPriority(int row, int &newPriority);
+ void setPluginPriority(int row, int &newPriority, bool isForced=false);
void changePluginPriority(std::vector<int> rows, int newPriority);
void testMasters();
+ void fixPrimaryPlugins();
void fixPriorities();
+ void fixPluginRelationships();
int findPluginByPriority(int priority);
diff --git a/src/pluginlistproxy.cpp b/src/pluginlistproxy.cpp
index b9ea9e36..604aab3e 100644
--- a/src/pluginlistproxy.cpp
+++ b/src/pluginlistproxy.cpp
@@ -65,7 +65,7 @@ void PluginListProxy::setLoadOrder(const QStringList& pluginList)
bool PluginListProxy::isMaster(const QString& name) const
{
- return m_Proxied->isMaster(name);
+ return m_Proxied->isMasterFlagged(name);
}
QStringList PluginListProxy::masters(const QString& name) const
@@ -92,3 +92,23 @@ bool PluginListProxy::onPluginStateChanged(const std::function<void(const std::m
{
return m_PluginStateChanged.connect(func).connected();
}
+
+bool PluginListProxy::hasMasterExtension(const QString& name) const
+{
+ return m_Proxied->hasMasterExtension(name);
+}
+
+bool PluginListProxy::hasLightExtension(const QString& name) const
+{
+ return m_Proxied->hasLightExtension(name);
+}
+
+bool PluginListProxy::isMasterFlagged(const QString& name) const
+{
+ return m_Proxied->isMasterFlagged(name);
+}
+
+bool PluginListProxy::isLightFlagged(const QString& name) const
+{
+ return m_Proxied->isLightFlagged(name);
+}
diff --git a/src/pluginlistproxy.h b/src/pluginlistproxy.h
index e421b6ee..202b8484 100644
--- a/src/pluginlistproxy.h
+++ b/src/pluginlistproxy.h
@@ -8,7 +8,6 @@ class OrganizerProxy;
class PluginListProxy : public MOBase::IPluginList
{
-
public:
PluginListProxy(OrganizerProxy* oproxy, PluginList* pluginlist);
@@ -21,13 +20,19 @@ public:
bool setPriority(const QString& name, int newPriority) override;
int loadOrder(const QString& name) const override;
void setLoadOrder(const QStringList& pluginList) override;
- bool isMaster(const QString& name) const override;
+ [[deprecated]] bool isMaster(const QString& name) const override;
QStringList masters(const QString& name) const override;
QString origin(const QString& name) const override;
+
bool onRefreshed(const std::function<void()>& callback) override;
bool onPluginMoved(const std::function<void(const QString&, int, int)>& func) override;
bool onPluginStateChanged(const std::function<void(const std::map<QString, PluginStates>&)>& func) override;
+ bool hasMasterExtension(const QString& name) const override;
+ bool hasLightExtension(const QString& name) const override;
+ bool isMasterFlagged(const QString& name) const override;
+ bool isLightFlagged(const QString& name) const override;
+
private:
friend class OrganizerProxy;
diff --git a/src/pluginlistsortproxy.cpp b/src/pluginlistsortproxy.cpp
index 44285fd1..308a1398 100644
--- a/src/pluginlistsortproxy.cpp
+++ b/src/pluginlistsortproxy.cpp
@@ -72,7 +72,7 @@ bool PluginListSortProxy::lessThan(const QModelIndex &left,
} else {
for (int i = 0; i < lhsList.size(); ++i) {
if (lhsList.at(i) != rhsList.at(i)) {
- return lhsList.at(i) < rhsList.at(i);
+ return lhsList.at(i).toString() < rhsList.at(i).toString();
}
}
return false;
@@ -122,13 +122,13 @@ bool PluginListSortProxy::filterMatchesPlugin(const QString &plugin) const
bool display = false;
QString filterCopy = QString(m_CurrentFilter);
filterCopy.replace("||", ";").replace("OR", ";").replace("|", ";");
- QStringList ORList = filterCopy.split(";", QString::SkipEmptyParts);
+ QStringList ORList = filterCopy.split(";", Qt::SkipEmptyParts);
bool segmentGood = true;
//split in ORSegments that internally use AND logic
for (auto& ORSegment : ORList) {
- QStringList ANDKeywords = ORSegment.split(" ", QString::SkipEmptyParts);
+ QStringList ANDKeywords = ORSegment.split(" ", Qt::SkipEmptyParts);
segmentGood = true;
//check each word in the segment for match, each word needs to be matched but it doesn't matter where.
diff --git a/src/pluginlistview.cpp b/src/pluginlistview.cpp
index e27d7e66..c7183d0b 100644
--- a/src/pluginlistview.cpp
+++ b/src/pluginlistview.cpp
@@ -71,12 +71,12 @@ void PluginListView::updatePluginCount()
for (QString plugin : list->pluginNames()) {
bool active = list->isEnabled(plugin);
bool visible = m_sortProxy->filterMatchesPlugin(plugin);
- if (list->isLight(plugin) || list->isLightFlagged(plugin)) {
+ if (list->hasLightExtension(plugin) || list->isLightFlagged(plugin)) {
lightMasterCount++;
activeLightMasterCount += active;
activeVisibleCount += visible && active;
}
- else if (list->isMaster(plugin)) {
+ else if (list->hasMasterExtension(plugin) || list->isMasterFlagged(plugin)) {
masterCount++;
activeMasterCount += active;
activeVisibleCount += visible && active;
@@ -305,8 +305,7 @@ bool PluginListView::toggleSelectionState()
bool PluginListView::event(QEvent* event)
{
- auto* profile = m_core->currentProfile();
- if (event->type() == QEvent::KeyPress && profile) {
+ if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->modifiers() == Qt::ControlModifier
diff --git a/src/processrunner.cpp b/src/processrunner.cpp
index 4d83d0c8..4a954dee 100644
--- a/src/processrunner.cpp
+++ b/src/processrunner.cpp
@@ -649,7 +649,7 @@ ProcessRunner& ProcessRunner::setFromFileOrExecutable(
throw MyException(QObject::tr("No profile set"));
}
- setBinary(executable);
+ setBinary(QFileInfo(executable));
setArguments(args.join(" "));
setCurrentDirectory(cwd);
setProfileName(profileOverride);
@@ -659,7 +659,7 @@ ProcessRunner& ProcessRunner::setFromFileOrExecutable(
if (m_sp.binary.isRelative()) {
// relative path, should be relative to game directory
- setBinary(m_core.managedGame()->gameDirectory().absoluteFilePath(executable));
+ setBinary(QFileInfo(m_core.managedGame()->gameDirectory().absoluteFilePath(executable)));
}
if (cwd == "") {
diff --git a/src/qtgroupingproxy.cpp b/src/qtgroupingproxy.cpp
index a8c7ce1d..d00bd288 100644
--- a/src/qtgroupingproxy.cpp
+++ b/src/qtgroupingproxy.cpp
@@ -152,7 +152,7 @@ QtGroupingProxy::belongsTo( const QModelIndex &idx )
return rowDataList;
}
-/* m_groupHash layout
+/* m_groupMap layout
* key : index of the group in m_groupMaps
* value : a QList of the original rows in sourceModel() for the children of this group
*
@@ -167,7 +167,7 @@ QtGroupingProxy::buildTree()
return;
beginResetModel();
- m_groupHash.clear();
+ m_groupMap.clear();
//don't clear the data maps since most of it will probably be needed again.
m_parentCreateList.clear();
@@ -189,9 +189,9 @@ QtGroupingProxy::buildTree()
quint32 quint32max = std::numeric_limits<quint32>::max();
std::vector<int> rmgroups;
- QHash<quint32, QList<int> > temp;
+ QMap<quint32, QList<int> > temp;
- for (auto iter = m_groupHash.begin(); iter != m_groupHash.end(); ++iter) {
+ for (auto iter = m_groupMap.begin(); iter != m_groupMap.end(); ++iter) {
if ((iter.key() == quint32max) ||
(iter->count() < 2)) {
temp[quint32max].append(iter.value());
@@ -202,7 +202,7 @@ QtGroupingProxy::buildTree()
temp[currentKey++] = *iter;
}
}
- m_groupHash = temp;
+ m_groupMap = temp;
// second loop is necessary because qt containers can't be iterated from end to front
// and removing by index from begin to end is ugly
@@ -225,8 +225,8 @@ QtGroupingProxy::addSourceRow( const QModelIndex &idx )
if( groupData.isEmpty() )
{
updatedGroups << -1;
- if( !m_groupHash.keys().contains( std::numeric_limits<quint32>::max() ) )
- m_groupHash.insert( std::numeric_limits<quint32>::max(), QList<int>() ); //add an empty placeholder
+ if( !m_groupMap.keys().contains( std::numeric_limits<quint32>::max() ) )
+ m_groupMap.insert( std::numeric_limits<quint32>::max(), QList<int>() ); //add an empty placeholder
}
//an item can be in multiple groups
@@ -254,16 +254,16 @@ QtGroupingProxy::addSourceRow( const QModelIndex &idx )
updatedGroup = m_groupMaps.count() - 1;
}
- if( !m_groupHash.keys().contains( updatedGroup ) )
- m_groupHash.insert( updatedGroup, QList<int>() ); //add an empty placeholder
+ if( !m_groupMap.keys().contains( updatedGroup ) )
+ m_groupMap.insert( updatedGroup, QList<int>() ); //add an empty placeholder
}
if( !updatedGroups.contains( updatedGroup ) )
updatedGroups << updatedGroup;
}
- //update m_groupHash to the new source-model layout (one row added)
- QMutableHashIterator<quint32, QList<int> > i( m_groupHash );
+ //update m_groupMap to the new source-model layout (one row added)
+ QMutableMapIterator<quint32, QList<int> > i( m_groupMap );
while( i.hasNext() )
{
i.next();
@@ -360,7 +360,7 @@ QtGroupingProxy::rowCount( const QModelIndex &index ) const
if( !index.isValid() )
{
//the number of top level groups + the number of non-grouped items
- int rows = m_groupMaps.count() + m_groupHash.value( std::numeric_limits<quint32>::max() ).count();
+ int rows = m_groupMaps.count() + m_groupMap.value( std::numeric_limits<quint32>::max() ).count();
return rows;
}
@@ -368,7 +368,7 @@ QtGroupingProxy::rowCount( const QModelIndex &index ) const
if( isGroup( index ) )
{
qint64 groupIndex = index.row();
- int rows = m_groupHash.value( groupIndex ).count();
+ int rows = m_groupMap.value( groupIndex ).count();
return rows;
} else {
QModelIndex originalIndex = mapToSource( index );
@@ -455,7 +455,7 @@ QtGroupingProxy::data( const QModelIndex &index, int role ) const
} break;
case Qt::CheckStateRole: {
if (column != 0) return QVariant();
- int childCount = m_groupHash.value( row ).count();
+ int childCount = m_groupMap.value( row ).count();
int checked = 0;
QModelIndex parentIndex = this->index( row, 0, index.parent() );
for( int childRow = 0; childRow < childCount; ++childRow )
@@ -470,7 +470,7 @@ QtGroupingProxy::data( const QModelIndex &index, int role ) const
} break;
default: {
QModelIndex parentIndex = this->index( row, 0, index.parent() );
- if (m_groupHash.value( row ).count() > 0) {
+ if (m_groupMap.value( row ).count() > 0) {
return this->index(0, column, parentIndex).data(role);
} else {
return QVariant();
@@ -498,7 +498,7 @@ QtGroupingProxy::data( const QModelIndex &index, int role ) const
//map all data from children to columns of group to allow grouping one level up
QVariantList variantsOfChildren;
- int childCount = m_groupHash.value( row ).count();
+ int childCount = m_groupMap.value( row ).count();
if( childCount == 0 )
return QVariant();
@@ -573,7 +573,7 @@ QtGroupingProxy::setData( const QModelIndex &idx, const QVariant &value, int rol
m_groupMaps[idx.row()].insert( idx.column(), columnData );
int columnToChange = idx.column() ? idx.column() : m_groupedColumn;
- foreach( int originalRow, m_groupHash.value( idx.row() ) )
+ foreach( int originalRow, m_groupMap.value( idx.row() ) )
{
QModelIndex childIdx = sourceModel()->index( originalRow, columnToChange,
m_rootNode );
@@ -620,7 +620,7 @@ QtGroupingProxy::mapToSource( const QModelIndex &index ) const
if( !proxyParent.isValid() )
indexInGroup -= m_groupMaps.count();
- QList<int> childRows = m_groupHash.value( proxyParent.row() );
+ QList<int> childRows = m_groupMap.value( proxyParent.row() );
if( childRows.isEmpty() || indexInGroup >= childRows.count() || indexInGroup < 0 )
return QModelIndex();
@@ -663,7 +663,7 @@ QtGroupingProxy::mapFromSource( const QModelIndex &idx ) const
{
//idx is an item in the top level of the source model (child of the rootnode)
int groupRow = -1;
- QHashIterator<quint32, QList<int> > iterator( m_groupHash );
+ QMapIterator<quint32, QList<int> > iterator( m_groupMap );
while( iterator.hasNext() )
{
iterator.next();
@@ -677,14 +677,14 @@ QtGroupingProxy::mapFromSource( const QModelIndex &idx ) const
if( groupRow != -1 ) //it's in a group, let's find the correct row.
{
proxyParent = this->index( groupRow, 0, QModelIndex() );
- proxyRow = m_groupHash.value( groupRow ).indexOf( sourceRow );
+ proxyRow = m_groupMap.value( groupRow ).indexOf( sourceRow );
}
else
{
proxyParent = QModelIndex();
// if the proxy item is not in a group it will be below the groups.
int groupLength = m_groupMaps.count();
- int i = m_groupHash.value( std::numeric_limits<quint32>::max() ).indexOf( sourceRow );
+ int i = m_groupMap.value( std::numeric_limits<quint32>::max() ).indexOf( sourceRow );
proxyRow = groupLength + i;
}
@@ -702,7 +702,7 @@ QtGroupingProxy::flags( const QModelIndex &idx ) const
if( rootFlags.testFlag( Qt::ItemIsDropEnabled ) )
return Qt::ItemFlags( Qt::ItemIsDropEnabled );
- return 0;
+ return Qt::ItemFlags(0);
}
//only if the grouped column has the editable flag set allow the
@@ -716,7 +716,7 @@ QtGroupingProxy::flags( const QModelIndex &idx ) const
if (idx.column() == 0) {
bool checkable = true;
- foreach ( int originalRow, m_groupHash.value( idx.row() ) )
+ foreach ( int originalRow, m_groupMap.value( idx.row() ) )
{
QModelIndex originalIdx = sourceModel()->index( originalRow, 0,
m_rootNode.parent() );
@@ -732,7 +732,7 @@ QtGroupingProxy::flags( const QModelIndex &idx ) const
}
//it's possible to have empty groups
- if( m_groupHash.value( idx.row() ).count() == 0 )
+ if( m_groupMap.value( idx.row() ).count() == 0 )
{
//check the flags of this column with the root node
QModelIndex originalRootNode = sourceModel()->index( m_rootNode.row(), m_groupedColumn,
@@ -741,7 +741,7 @@ QtGroupingProxy::flags( const QModelIndex &idx ) const
}
else
{
- foreach( int originalRow, m_groupHash.value( idx.row() ) )
+ foreach( int originalRow, m_groupMap.value( idx.row() ) )
{
QModelIndex originalIdx = sourceModel()->index( originalRow, m_groupedColumn,
m_rootNode );
@@ -815,7 +815,7 @@ bool
QtGroupingProxy::removeGroup( const QModelIndex &idx )
{
beginRemoveRows( idx.parent(), idx.row(), idx.row() );
- m_groupHash.remove( idx.row() );
+ m_groupMap.remove( idx.row() );
m_groupMaps.removeAt( idx.row() );
m_parentCreateList.removeAt( idx.internalId() );
endRemoveRows();
@@ -832,7 +832,7 @@ QtGroupingProxy::hasChildren( const QModelIndex &parent ) const
}
if( isGroup( parent ) ) {
- return !m_groupHash.value( parent.row() ).isEmpty();
+ return !m_groupMap.value( parent.row() ).isEmpty();
}
return sourceModel()->hasChildren( mapToSource( parent ) );
@@ -843,7 +843,7 @@ QtGroupingProxy::dropMimeData(const QMimeData *data, Qt::DropAction action, int
{
QModelIndex idx = index(row, column, parent);
if (isGroup(idx)) {
- QList<int> childRows = m_groupHash.value(idx.row());
+ QList<int> childRows = m_groupMap.value(idx.row());
int max = *std::max_element(childRows.begin(), childRows.end());
QModelIndex newIdx = mapToSource(index(max, column, idx));
@@ -900,12 +900,12 @@ QtGroupingProxy::modelRowsAboutToBeRemoved( const QModelIndex &parent, int start
{
if( parent == m_rootNode )
{
- QHash<quint32, QList<int> >::const_iterator i;
+ QMap<quint32, QList<int> >::const_iterator i;
//HACK, we are going to call beginRemoveRows() multiple times without
// endRemoveRows() if a source index is in multiple groups.
// This can be a problem for some views/proxies, but Q*Views can handle it.
// TODO: investigate a queue for applying proxy model changes in the correct order
- for( i = m_groupHash.constBegin(); i != m_groupHash.constEnd(); ++i )
+ for( i = m_groupMap.constBegin(); i != m_groupMap.constEnd(); ++i )
{
int groupIndex = i.key();
const QList<int> &groupList = i.value();
@@ -936,7 +936,7 @@ QtGroupingProxy::modelRowsRemoved( const QModelIndex &parent, int start, int end
{
if( parent == m_rootNode )
{
- //TODO: can be optimised by iterating over m_groupHash and checking start <= r < end
+ //TODO: can be optimised by iterating over m_groupMap and checking start <= r < end
//rather than increasing i we change the stored sourceRows in-place and reuse argument start
//X-times (where X = end - start).
@@ -945,7 +945,7 @@ QtGroupingProxy::modelRowsRemoved( const QModelIndex &parent, int start, int end
//HACK: we are going to iterate the hash in reverse so calls to endRemoveRows()
// are matched up with the beginRemoveRows() in modelRowsAboutToBeRemoved()
//NOTE: easier to do reverse with java style iterator
- QMutableHashIterator<quint32, QList<int> > iter( m_groupHash );
+ QMutableMapIterator<quint32, QList<int> > iter( m_groupMap );
iter.toBack();
while( iter.hasPrevious() )
{
@@ -1020,19 +1020,19 @@ QtGroupingProxy::dumpGroups() const
QString s;
QDebug debug(&s);
- debug << "m_groupHash:\n";
- for( int groupIndex = -1; groupIndex < m_groupHash.keys().count() - 1; groupIndex++ )
+ debug << "m_groupMap:\n";
+ for( int groupIndex = -1; groupIndex < m_groupMap.keys().count() - 1; groupIndex++ )
{
- debug << groupIndex << " : " << m_groupHash.value( groupIndex ) << "\n";
+ debug << groupIndex << " : " << m_groupMap.value( groupIndex ) << "\n";
}
debug << "m_groupMaps:\n";
for( int groupIndex = 0; groupIndex < m_groupMaps.count(); groupIndex++ )
{
- debug << m_groupMaps[groupIndex] << ": " << m_groupHash.value( groupIndex ) << "\n";
+ debug << m_groupMaps[groupIndex] << ": " << m_groupMap.value( groupIndex ) << "\n";
}
- debug << m_groupHash.value( std::numeric_limits<quint32>::max() );
+ debug << m_groupMap.value( std::numeric_limits<quint32>::max() );
log::debug("{}", s);
}
diff --git a/src/qtgroupingproxy.h b/src/qtgroupingproxy.h
index c4459297..c6116d8a 100644
--- a/src/qtgroupingproxy.h
+++ b/src/qtgroupingproxy.h
@@ -115,7 +115,7 @@ protected:
* reordered when rows are inserted or removed.
* TODO:use some auto-incrementing container class (steveire's?) for the list
*/
- QHash<quint32, QList<int> > m_groupHash;
+ QMap<quint32, QList<int> > m_groupMap;
/** The data cache of the groups.
* This can be pre-loaded with data in belongsTo()
*/
diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp
index ea012a94..1b24f3f1 100644
--- a/src/selfupdater.cpp
+++ b/src/selfupdater.cpp
@@ -45,7 +45,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QNetworkReply>
#include <QProcess>
#include <QProgressDialog>
-#include <QRegExp>
#include <QStringList>
#include <QTimer>
#include <QUrl>
diff --git a/src/settingsdialoggeneral.cpp b/src/settingsdialoggeneral.cpp
index b0f40882..48045245 100644
--- a/src/settingsdialoggeneral.cpp
+++ b/src/settingsdialoggeneral.cpp
@@ -72,7 +72,7 @@ void GeneralSettingsTab::addLanguages()
QString::fromStdWString(AppConfig::translationPrefix()) +
"_([a-z]{2,3}(_[A-Z]{2,2})?).qm";
- const QRegExp exp(pattern);
+ const QRegularExpression exp(QRegularExpression::anchoredPattern(pattern));
QDirIterator iter(
QCoreApplication::applicationDirPath() + "/translations",
@@ -84,11 +84,12 @@ void GeneralSettingsTab::addLanguages()
iter.next();
const QString file = iter.fileName();
- if (!exp.exactMatch(file)) {
+ auto match = exp.match(file);
+ if (!match.hasMatch()) {
continue;
}
- const QString languageCode = exp.cap(1);
+ const QString languageCode = match.captured(1);
const QLocale locale(languageCode);
QString languageString = QString("%1 (%2)")
@@ -103,7 +104,7 @@ void GeneralSettingsTab::addLanguages()
}
}
- languages.push_back({languageString, exp.cap(1)});
+ languages.push_back({languageString, match.captured(1)});
}
if (!ui->languageBox->findText("English")) {
diff --git a/src/spawn.cpp b/src/spawn.cpp
index fbd4c286..5b14c52c 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -39,6 +39,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QtDebug>
#include <Shellapi.h>
#include <fmt/format.h>
+#include <fmt/xchar.h>
using namespace MOBase;
using namespace MOShared;
@@ -252,7 +253,7 @@ void helperFailed(
const std::wstring& cwd, const std::wstring& args)
{
SpawnParameters sp;
- sp.binary = QString::fromStdWString(binary);
+ sp.binary = QFileInfo(QString::fromStdWString(binary));
sp.currentDirectory.setPath(QString::fromStdWString(cwd));
sp.arguments = QString::fromStdWString(args);
@@ -620,7 +621,7 @@ bool startSteam(QWidget* parent)
}
SpawnParameters sp;
- sp.binary = exe;
+ sp.binary = QFileInfo(exe);
// See if username and password supplied. If so, pass them into steam.
QString username, password;
@@ -911,7 +912,7 @@ QFileInfo getCmdPath()
{
const auto p = env::get("COMSPEC");
if (!p.isEmpty()) {
- return p;
+ return QFileInfo(p);
}
QString systemDirectory;
@@ -930,7 +931,7 @@ QFileInfo getCmdPath()
systemDirectory = "C:\\Windows\\System32\\";
}
- return systemDirectory + "cmd.exe";
+ return QFileInfo(systemDirectory + "cmd.exe");
}
FileExecutionTypes getFileExecutionType(const QFileInfo& target)
diff --git a/src/statusbar.cpp b/src/statusbar.cpp
index 39acc32e..094aa743 100644
--- a/src/statusbar.cpp
+++ b/src/statusbar.cpp
@@ -229,7 +229,7 @@ QString StatusBarAction::cleanupActionText(const QString& original) const
{
QString s = original;
- s.replace(QRegExp("\\&([^&])"), "\\1"); // &Item -> Item
+ s.replace(QRegularExpression("\\&([^&])"), "\\1"); // &Item -> Item
s.replace("&&", "&"); // &&Item -> &Item
if (s.endsWith("...")) {
diff --git a/src/stylesheets/Transparent-Style-101-Green.qss b/src/stylesheets/Transparent-Style-101-Green.qss
deleted file mode 100644
index 0d35ec7e..00000000
--- a/src/stylesheets/Transparent-Style-101-Green.qss
+++ /dev/null
@@ -1,506 +0,0 @@
-#centralWidget {
- border-image: url(./Transparent-Style/Green/vault-101.png) 0 0 0 0 stretch stretch;
-}
- QDialog,Qmenu {
- border: none;
-}
- QWidget {
- color: #fff;
- background-color: rgba(0, 204, 0, 5);
- alternate-background-color: rgba(0, 204, 0, 10);
-}
- QAbstractItemView {
- color: #fff;
- background-color: rgba(0, 204, 0, 5);
- alternate-background-color: rgba(0, 204, 0, 10);
- border: 1px solid #001a00;
- border-style:outset;
- border-radius: 3px;
- selection-color: #001a00;
- outline: none;
-}
- #ProblemsDialog,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog, #ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog {
- border-image:url(./Transparent-Style/Green/vault-tec-full.png) 0 0 0 0 stretch stretch;
-}
- #EditExecutablesDialog {
- border-image: url(./Transparent-Style/Green/vault-tec.png) 0 0 0 0 stretch stretch;
-}
- #SimpleInstallDialog,#LockedDialog,QMenu {
- border-image: url(./Transparent-Style/Green/vault-tec-small.png) 0 0 0 0 stretch stretch;
-}
- #nameLabel {
- background-color: rgba(0, 0, 0, 20);
- border-top:1px solid black;
- border-bottom:1px solid black;
-}
- #ProfilesDialog,#FomodInstallerDialog {
- border-image: url(./Transparent-Style/Green/vault-tec-profiles.png) 0 0 0 0 stretch stretch;
-}
- #filesView {
- border-image: url(./Transparent-Style/Green/vault-tec-overwrite.png) 0 0 0 0 stretch stretch;
-}
-/* ******************************************** */
-/* Main Navigation Button Bar at top of window */
-/* ******************************************** */
- QToolBar {
- border: none;
-}
- QToolBar::separator {
- image: url(./Transparent-Style/Green/Vault-101-vault-boy.png);
-}
- QToolButton {
- border:2px ridge None;
- border-radius: 6px;
- margin: 3px;
- padding-left: 8px;
- padding-right: 8px;
- padding-top: 0px;
- padding-bottom: 2px;
-}
- QToolButton:hover {
- border: 2px ridge #fff;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
-}
- QToolButton:pressed {
- background: black;
-}
- QTabWidget::pane {
- background-color: transparent;
- border:transparent;
-}
- QTabWidget::tab-bar {
- alignment: center;
-}
-/* **************************************** */
-/* Tabs on top of Treeview */
-/* **************************************** */
- QTabBar {
- text-transform: uppercase;
- max-height: 22px;
- padding-bottom: 5px;
-}
- QTabBar::tab {
- border: none;
- border-bottom-style: none;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
- padding-left: 15px;
- padding-right: 15px;
- padding-top: 3px;
- padding-bottom: 3px;
- margin-right: 2px;
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
-}
- QTabBar::tab:selected {
- color: #fff;
- background-color: #00cc00;
-}
- QTabBar::tab:!selected {
- color: #00cc00;
- margin-top: 0px;
-}
- QTabBar::tab:disabled {
- color: #bbbbbb;
- border-bottom-style: none;
- margin-top: 0px;
- background-color: #000;
-}
- #deactivateESP,#activateESP {
- border:px #00cc00;
- background:QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
-}
- QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open {
- border:2px ridge #00cc00;
- image: url(./Transparent-Style/Green/arrow-right.png);
-}
- QTabBar QToolButton {
- border:2px ridge #00cc00;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
- padding: 1px;
- margin: 0;
-}
- QTabBar QToolButton::right-arrow {
- image: url(./Transparent-Style/Green/arrow-right.png);
-}
- QTabBar QToolButton::left-arrow {
- image: url(./Transparent-Style/Green/arrow-left.png);
-}
-/* **************************************** */
-/* Column names of TreeView */
-/* **************************************** */
- QTableView {
- color:#fff;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
-}
- QHeaderView::section {
- color: #00cc00;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
- border-radius: 6px;
- padding: 4px;
- padding-left: 5px;
- padding-right: 0px;
-}
- QHeaderView::section:hover {
- background: #121212;
- border: 2px solid #ff0000;
- padding: 0px;
-}
- QHeaderView::up-arrow,QHeaderView::down-arrow {
- subcontrol-origin: content;
- subcontrol-position: center right;
- width: 7px;
- height: 7px;
- margin-right: 7px;
-}
- QHeaderView::up-arrow {
- image: url(./Transparent-Style/Green/arrow-up.png);
-}
- QHeaderView::down-arrow {
- image: url(./Transparent-Style/Green/arrow-down.png);
-}
-/* **************************************** */
-/* Hover */
-/* **************************************** */
- QMenu:item:hover,QMenuBar:item:selected,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover {
- color:#fff;
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:#000;
-}
- QAbstractItemView::item:hover {
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:#000;
- padding: 3px;
-}
- #deactivateESP:hover,#activateESP:hover,QPushButton:hover,QTableView:hover,QHeaderView::selected:hover,QTabBar::tab:!selected:hover,QComboBox:hover {
- border: 1px solid #ff0000;
- padding: 1px;
- text-align: center;
-}
-/* **************************************** */
-/* Context menus, toolbar dropdowns #QMenu */
-/* **************************************** */
- QMenu {
- border-width: 3px;
- border-style: solid;
-}
- QMenu::item {
- padding: 6px 20px;
-}
- QMenu::item:selected {
- color:#fff;
- background-color: #001a00;
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
-}
- QMenu::right-arrow {
- image: url(./Transparent-Style/Green/arrow-right.png);
- subcontrol-origin: padding;
- subcontrol-position: center right;
- padding-right: 0.5em;
-}
-/* ********************* */
-/* LCD Counter */
-/* ********************* */
- QLCDNumber {
- Background:#000;
- border-color: #00cc00;
- border-style: solid;
- border-width: 1px;
- border-radius: 5px;
-}
-/* **************************************** */
-/* Launch application Drop down Box */
-/* **************************************** */
- QComboBox {
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
- border:1px outset #00cc00;
- height: 20px;
- width: 15px;
- padding: 3px;
- padding-left:3px;
- border-radius: 5px;
-}
- QComboBox::drop-down{
- subcontrol-origin: padding;
- subcontrol-position: top right;
- width: 15px;
- padding:4px;
- border-radius: 5px;
-}
- QComboBox::down-arrow{
- image:url(./Transparent-Style/Green/arrow-down.png);
-}
- QComboBox::item{
- border:3px;
- padding: 3px;
-}
-/* **************************************************************** */
-/* Action Buttons */
-/* */
-/* Open list, Rextore Backup, Create Backup, RUN, Shortcut Button */
-/* Sort, Load order backup, Load Order Restore */
-/* **************************************************************** */
- QPushButton {
- color: #00cc00;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53);
- border-width: 1px;
- border-color: 1px outset #00cc00;
- border-style: solid;
- border-radius: 4px;
- padding:5px;
- padding-right: 10px;
- padding-left: 5px;
-}
- QDialog QPushButton {
- min-width: 3em;
- min-height: 1em;
- padding-left: 1em;
- padding-right: 1em;
-}
- QPushButton::menu-indicator {
- image: url(./Transparent-Style/Green/arrow-down.png);
- background: transparent;
- subcontrol-origin: padding;
- subcontrol-position: center right;
- padding-right: 5%;
-}
- QPushButton:open {
- background-color: rgba(0, 204, 0, 100);
-}
- QPushButton:!enabled {
- border: 1px grey;
- color: grey;
- background: black;
-}
- QPushButton#displayCategoriesBtn {
- min-width: 20px;
-}
-/* **************************************** */
-/* Scroll bar */
-/* **************************************** */
- QScrollBar {
- height:20px;
- width:20px;
- background-color:transparent;
-}
- QScrollBar::handle {
- border: 1px solid #aaa;
- border-radius: 4px;
-}
- QScrollBar::handle:vertical {
- margin: 1px 4px;
- min-height:20px;
- min-width: 10px;
- background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #33ff33, stop:1 #000000);
-}
- QScrollBar::handle:vertical:hover {
- background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #33ff33);
-}
- QScrollBar::handle:horizontal {
- min-height:10px;
- min-width:20px;
- margin:4px 1px;
- background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #33ff33, stop:1 #000000);
-}
- QScrollBar::handle:horizontal:hover {
- background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #33ff33);
-}
- QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {
- background-color: transparent;
-}
- QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal {
- height:0;
- width:0;
-}
-/* ******************************************************** */
-/* Main Tree View Inherated from QAbstractItemView */
-/* ******************************************************** */
- QTreeView {
-}
- QTreeView:item {
- padding:4px;
-}
- QTreeView:item:selected {
- color: #001a00;
- border: none;
- outline: none;
- border-radius: 5px;
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color: rgba(0, 204, 0, 100);
-}
- QTreeView::branch:has-siblings:!adjoins-item {
- background:url(Transparent-Style/Green/Vault-101-item-line-v.png) center center no-repeat;
-}
- QTreeView::branch:has-siblings {
- background:url(Transparent-Style/Green/Vault-101-itemB-line.png) center center no-repeat;
-}
- QTreeView::branch:!has-children:!has-siblings:adjoins-item {
- background:url(Transparent-Style/Green/Vault-101-itemB-end.png) center center no-repeat;
-}
- QTreeView::branch:closed:has-children:has-siblings {
- background:url(Transparent-Style/Green/Vault-101-itemB-close.png) center center no-repeat;
-}
- QTreeView::branch:closed:has-children:!has-siblings {
- background:url(Transparent-Style/Green/Vault-101-itemB-close-last.png) center center no-repeat;
-}
- QTreeView::branch:open:has-children:has-siblings {
- background:url(Transparent-Style/Green/Vault-101-itemB-open.png) center center no-repeat;
-}
- QTreeView::branch:open:has-children:!has-siblings {
- background:url(Transparent-Style/Green/Vault-101-itemB-open-last.png) center center no-repeat;
-}
-
-QAbstractItemView[filtered=true] {
- border: 2px solid #f00 !important;
-}
-
-/* **************************************************************** */
-/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */
-/* common */
-/* **************************************************************** */
- QGroupBox::indicator,QTreeView::indicator,QCheckBox::indicator {
- outline: none;
- border: none;
- width: 20px;
- height: 20px;
-}
- QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate {
- image: url(./Transparent-Style/Green/checkbox-checked.png);
-}
- QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover {
- image: url(./Transparent-Style/Green/checkbox-hover.png);
-}
- QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled {
- image: url(./Transparent-Style/Green/checkbox-checked-disabled.png);
-}
- QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked {
- image: url(./Transparent-Style/Green/checkbox.png);
-}
- QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover {
- image: url(./Transparent-Style/Green/checkbox-checked-hover.png);
-}
- QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled {
- image: url(./Transparent-Style/Green/checkbox-checked-disabled.png);
-}
- QTreeWidget#categoriesList::item:has-children {
- background-image: url(./Transparent-Style/Green/arrow-right.png);
-}
- QTreeWidget#categoriesList::item:has-children:open {
- background-image: url(./Transparent-Style/Green/branch-opened.png);
-}
-/* ******************************** */
-/* Special styles */
-/* increase categories tab width */
-/* ******************************** */
- QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item {
- padding: .3em 0;
-}
- QTreeWidget#categoriesGroup,QTreeWidget#categoriesList {
- min-width: 200px;
-}
- QTreeWidget#categoriesList::item {
- background-position: center left;
- background-repeat: no-repeat;
- padding: 0.35em 4px;
-}
-/* ********************* */
-/* Display Radio Button */
-/* ********************* */
- QRadioButton::indicator {
- width: 16px;
- height: 16px;
-}
- QRadioButton::indicator::checked {
- image: url(./Transparent-Style/Green/radio-checked.png);
-}
- QRadioButton::indicator::unchecked {
- image: url(./Transparent-Style/Green/radio.png);
-}
- QRadioButton::indicator::unchecked:hover {
- image: url(./Transparent-Style/Green/radio-hover.png);
-}
-/* **************************************** */
-/* Spinners #QSpinBox, #QDoubleSpinBox */
-/* **************************************** */
- QAbstractSpinBox {
- min-height: 24px;
-}
- QAbstractSpinBox::up-button,QAbstractSpinBox::down-button {
- border-style: solid;
- border-width: 1px;
- subcontrol-origin: padding;
-}
- QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover {
- background-color: #141414;
-}
- QAbstractSpinBox::up-button {
- subcontrol-position: top right;
-}
- QAbstractSpinBox::down-button {
- subcontrol-position: bottom right;
-}
- QAbstractSpinBox::up-arrow {
- image: url(./Transparent-Style/Green/arrow-up.png);
-}
- QAbstractSpinBox::down-arrow {
- image: url(./Transparent-Style/Green/arrow-down.png);
-}
-/* **************************************** */
-/* Tooltips #QToolTip, #SaveGameInfoWidget */
-/* **************************************** */
- QToolTip {
- background-color:transparent;
- color:#C0C0C0;
- padding:0px;
- border-width:7px;
- border-style:solid;
- border-color:transparent;
- border-image:url(./Transparent-Style/Green/border-image.png) 27 repeat repeat;
-}
- SaveGameInfoWidget {
- background-color:#121212;
- color:#C0C0C0;
-}
-
-QStatusBar::item {border: None;}
-
-/* **************************** */
-/* Handles Web, Nexus info tab */
-/* **************************** */
- QWebView {
- background-color: Black;
-}
- QLineEdit {
- font-family: Source Sans Pro;
- background:#000;
- border-width: 1px;
- border-radius:5px;
- margin: 0px;
- padding-left:2px;
- selection-background-color: rgba(0, 204, 0, 10);
-}
-/* Font size */
- QLabel, QMenu, QPushButton, QTabBar, QTextEdit, QLineEdit, QWebView, QComboBox, QComboBox:editable, QAbstractSpinBox, QGroupBox, QCheckBox, QRadioButton {
- color: #cccccc;
- font-family: Source Sans Pro;
- font-size: 14px;
-}
-
-LinkLabel {
- qproperty-linkColor: #3399FF;
-}
-
- QAbstractItemView {
- color: #cccccc;
- font-family: Source Sans Pro;
- font-size: 14px;
-}
-
-QLineEdit[valid-filter=false] {
- background-color: #661111 !important;
-}
diff --git a/src/stylesheets/Transparent-Style-BOS.qss b/src/stylesheets/Transparent-Style-BOS.qss
deleted file mode 100644
index 4812ca37..00000000
--- a/src/stylesheets/Transparent-Style-BOS.qss
+++ /dev/null
@@ -1,758 +0,0 @@
-#centralWidget {
- border-image: url(./Transparent-Style/Fallout-BOS.png) 0 0 0 0 stretch stretch;
-}
- QWidget#TextViewer{
-}
- QWidget{
- color: #fff;
- background-color: rgba(45,45,48,30);
- alternate-background-color: rgba(38,38,38,30);
-}
- QWidget:disabled{
-}
- QAbstractItemView{
- color: #dcdcdc;
- background-color: rgba(45,45,48,30);
- alternate-background-color: rgba(38,38,38,50);
- border: 1px solid #3F3F46;
- /* Grey - Blue*/
- border-style:outset;
- border-radius: 3px;
- selection-color: #3F3F46;
- /* Grey - Blue*/
- outline: none;
- padding-left:0;
-}
- #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog {
- border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #toolBarArea{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #EditExecutablesDialog{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #SimpleInstallDialog,#LockedDialog,QMenu{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #nameLabel{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:rgba(154,154,0,0.3);
- color:#fff;
-}
- #ProfilesDialog,#FomodInstallerDialog{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #filesView{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
-/* ******************************************** */
-/* Main Navigation Button Bar at top of window */
-/* ******************************************** */
- QToolBar{
- /*border: none;
- */
-}
- QToolBar::separator{
- /*image: url(./Transparent-Style/Vault-101-vault-logo.png);
- */
-}
- QToolButton{
- border:2px solid None;
- border-radius: 6px;
- margin: 3px;
- padding-left: 8px;
- padding-right: 8px;
- padding-top: 0px;
- padding-bottom: 2px;
-}
- QToolButton:hover{
- border-radius: 3px;
- border: 0px;
- padding: 0px;
- background: trANSPARENT;
- border: 0px ridge #9A9A00;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53);
-}
- QToolButton:pressed{
- background: black;
-}
-/* **************************************** */
-/* Tabs on top of Treeview */
-/* **************************************** */
- QTabWidget::pane{
- border-color:#3F3F46;
- /* Grey - Blue*/
- /* border-top-color:#9A9A00;
- */
- top: 0px;
- border-style:hidden;
- border-width:1px;
-}
- QTabWidget::tab-bar{
- alignment: center;
-}
- QTabBar{
- color: #cccccc;
- font-family: Segoe UI;
- font-size: 16px;
- text-transform: none;
- min-height:auto;
- padding-bottom: 5px;
-}
- QTabBar::tab{
- border: none;
- border-bottom-style: none;
- background-color: rgba(154,154,0,0.3);
- padding-left: 9px;
- padding-right: 9px;
- padding-top: 3px;
- padding-bottom: 3px;
- margin-right: 2px;
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
-}
- QTabBar::tab:disabled{
- color: #404040;
- background-color: #000;
- margin-top: 0px;
-}
- QTabBar::tab:selected{
- color: #dcdcdc;
- background-color: #9A9A00;
- /*Yellow opaque*/
-}
- QTabBar::tab:!selected:hover{
- border-radius: 3px;
- border-top:3px double #9A9A00;
- border-bottom:3px double #9A9A00;
- padding: 1px;
- text-align: center;
- background-color: #9A9A00;
- color:#fff;
- Height: 20%;
-}
-/* QTabBar::tab:!selected{
- color: #808080;
- background-color: #404040;
- margin-top: 0px;
-}
- */
- #deactivateESP,#activateESP{
- border:#b30000;
- background:#333337;
-}
-/* **************************************** */
-/* <More View> on top of Treeview */
-/* **************************************** */
- QTabBar QToolButton{
- border-radius: 0px;
- border: 0px;
- padding: 0px;
- background: transparent;
-}
- QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{
- image: url(./Transparent-Style/arrow-up.png);
-}
- QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{
- image: url(./Transparent-Style/arrow-down.png);
-}
- QTabBar QToolButton::right-arrow{
- image: url(./Transparent-Style/narrow-arrow-right.png);
-}
- QTabBar QToolButton::left-arrow{
- image: url(./Transparent-Style/narrow-arrow-left.png);
-}
-/* **************************************** */
-/* Column names of TreeView */
-/* **************************************** */
- QTableView{
- gridline-color:#3F3F46;
- selection-background-color:#9A9A00;
- selection-color:#F1F1F1;
- /* White */
- text-align: center;
- min-height:24px;
-}
- QHeaderView{
- min-height:24px;
- /*Top Bar on menus*/
- padding: 3px;
-}
- QHeaderView::section{
- /* color: #cc3333;
- */
- background-color: #252526;
- border-radius: 0px;
- padding: 0px;
- padding-left: 5px;
-}
- QHeaderView::section:hover{
- background: rgba(154,154,0,0.3);
- border: 1px solid #9a9a00;
- padding: 0px;
- padding-left: 5px;
-}
- QHeaderView::up-arrow,QHeaderView::down-arrow{
- min-height:Auto;
- min-width:Auto;
-}
- QHeaderView::up-arrow{
- image: url(./Transparent-Style/arrow-up.png);
- min-height:25px;
- min-width:15px;
- padding-right: 0px;
-}
-QHeaderView::down-arrow{
- image: url(./Transparent-Style/arrow-down.png);
-}
-/* **************************************** */
-/* Hover */
-/* **************************************** */
- QMenu:item:hover,QMenuBar::item:selected,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{
- color:#fff;
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:rgba(154,154,0,0.3);
-}
- QAbstractItemView::item:hover{
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:rgba(154,154,0,0.3);
- padding: 3px;
-}
-/*#DownloadListView{
-}
-*/
- #DownloadListView{
- outline: 1px solid #e8e8e8;
- border: 0px solid #9a9a00;
-}
- #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{
- border: 1px solid #9a9a00;
- padding: 1px;
- text-align: center;
- color:#fff;
-}
-/* **************************************** */
-/* Context menus, toolbar dropdowns #QMenu */
-/* **************************************** */
- QMenu{
- border-width: 3px;
- border-style: solid;
-}
-QMenu::item{
- padding: 6px 20px;
-}
-QMenu::item:selected{
- color:#fff;
- background-color: #3F3F46;
- /* Grey - Blue*/
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QMenu::right-arrow{
- image: url(./Transparent-Style/arrow-right.png);
- /* right click main menu top option*/
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
- border:0px outset #3F3F46;
- /* Grey - Blue*/
-}
-/* ********************* */
-/* LCD Counter */
-/* ********************* */
- QLCDNumber{
- color: #9A9A00;
- Background: #000;
- border-color: #3F3F46;
- /* Grey - Blue*/
- border-style: solid;
- border-width: 1px;
- border-radius: 5px;
-}
-/* **************************************** */
-/* Launch application Drop down Box */
-/* **************************************** */
- QComboBox{
- background-color: #333337;
- padding: 3px 5px 5px 5px;
- height: 26px;
- border-radius: 5px;
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QComboBox:on{
- padding: 3px 5px 5px 5px;
- color: white;
- background-color: #3F3F46;
- /* Grey - Blue*/
-}
- QComboBox:hover{
- border-radius: 3px;
- border-top:3px double #9A9A00;
- border-bottom:3px double #9A9A00;
- /* padding: 0px;
- */
-}
- QComboBox::drop-down{
- /* Down arrow in combo box */
- outline: none;
- border: none;
- border-width: 1px;
-}
- QComboBox::menu-indicator{
- image: url(./Transparent-Style/arrow-down.png);
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
- border:1px outset #3F3F46;
- /* Grey - Blue*/
-}
-/* ************************* */
-/* QComboBox::down-arrow:on, */
-/* ************************* */
- QComboBox::down-arrow:hover,QComboBox::down-arrow:focus {
- image: url(./Transparent-Style/arrow-down-hover.png);
-}
- QComboBox::up-arrow:hover,QComboBox::up-arrow:focus {
- image: url(./Transparent-Style/arrow-up-hover.png);
-}
- QComboBox::down-arrow{
- image:url(./Transparent-Style/arrow-down.png);
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
-}
- QComboBox::down-arrow:on{
- image:url(./Transparent-Style/arrow-up.png);
-}
- QComboBox:editable {
- background: black;
- /* color: pink;
- */
-}
- QComboBox::item{
-}
- QComboBox QAbstractItemView{
- selection-color:#fff;
- outline: 1px solid #9a9a00;
- selection-background-color:#3F3F46;
- /* Grey - Blue*/
- border-top:1px solid #9a9a00;
- border-bottom:1px solid #9a9a00;
- padding: 5px;
-}
-/* **************************************************************** */
-/* Action Buttons */
-/* */
-/* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */
-/* Sort, Load order backup, Load Order Restore */
-/* **************************************************************** */
- QPushButton{
- background-color: #333337;
- min-height:26px;
- padding:1px 5%;
- text-align: center;
- border-radius: 5px;
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QPushButton::menu-indicator{
- image: url(./Transparent-Style/arrow-down.png);
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
- border:1px hidden #3F3F46;
- /* Grey - Blue*/
-}
- QPushButton::menu-indicator:Hover{
- image: url(./Transparent-Style/arrow-down-hover.png);
-}
- QPushButton:focus{
-}
- QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{
- background: #3F3F46;
- /* Grey - Blue*/
- border-radius: 1px;
- border: 1px solid #9a9a00;
-}
- QPushButton:hover{
- border-radius: 3px;
- border-top:3px double #9A9A00;
- border-bottom:3px double #9A9A00;
-}
- QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{
- color:#fff;
- border-color:#707070;
- border-style:solid;
- border-width:1px;
-}
- QPushButton:disabled{
-}
- QPushButton:open{
-}
- QPushButton:!enabled{
-}
-/* **************************************** */
-/* Filter Button */
-/* **************************************** */
- QPushButton#displayCategoriesBtn{
- min-width: 20px;
- background:transparent;
- color: transparent;
- border: 1px hidden #9a9a00;
-}
- QPushButton#displayCategoriesBtn:checked{
- image: url(./Transparent-Style/arrow-left.png);
-}
- QPushButton#displayCategoriesBtn:!checked{
- image: url(./Transparent-Style/arrow-right.png);
-}
- QPushButton#displayCategoriesBtn:checked:hover{
- image: url(./Transparent-Style/arrow-left-hover.png);
-}
- QPushButton#displayCategoriesBtn:!checked:hover{
- image: url(./Transparent-Style/arrow-right-hover.png);
-}
-/* **************************************** */
-/* Scroll bar */
-/* **************************************** */
- QScrollBar{
- height:20px;
- width:20px;
- background-color:transparent;
-}
- QScrollBar::handle{
- border: 1px solid #aaa;
- border-radius: 4px;
-}
- QScrollBar::handle:vertical{
- margin: 1px 4px;
- min-height:20px;
- min-width: 10px;
- background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000);
-}
- QScrollBar::handle:vertical:hover{
- background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00);
-}
- QScrollBar::handle:horizontal{
- min-height:10px;
- min-width:20px;
- margin:4px 1px;
- background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000);
-}
- QScrollBar::handle:horizontal:hover{
- background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00);
-}
- QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{
- background-color: transparent;
-}
- QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{
- height:0;
- width:0;
-}
-/* ******************************************************** */
-/* Main Tree View Inherited from QAbstractItemView */
-/* ******************************************************** */
- QTreeView {
-}
- QTreeView:item{
- padding: 3px;
- font-size: 16px;
- height: 18px;
- /*Bottom text Box*/
-}
- QTreeView:item:selected{
- color:#fff;
- padding: 0px;
- background-color: #3F3F46;
- /* Grey - Blue*/
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QTreeView:item QLineEdit{
- outline: none;
- border: none;
- padding: 0px;
- margin: 0px;
-}
- QTreeView::branch:has-siblings:!adjoins-item{
- background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat;
-}
- QTreeView::branch:has-siblings{
- background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat;
-}
- QTreeView::branch:!has-children:!has-siblings:adjoins-item{
- background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat;
-}
- QTreeView::branch:closed:has-children:has-siblings{
- background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat;
-}
- QTreeView::branch:closed:has-children:!has-siblings{
- background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat;
-}
- QTreeView::branch:open:has-children:has-siblings{
- background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat;
-}
- QTreeView::branch:open:has-children:!has-siblings{
- background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat;
-}
-
-QAbstractItemView[filtered=true] {
- border: 2px solid #f00 !important;
-}
-
-/* **************************************************************** */
-/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */
-/* common */
-/* **************************************************************** */
- QTreeView::indicator,QCheckBox::indicator{
- outline: none;
- border: none;
- padding: 0px;
- width: 24px;
- height: 24px;
-}
- QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{
- image: url(./Transparent-Style/checkbox-checked.png);
-}
- QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{
- image: url(./Transparent-Style/checkbox-hover.png);
-}
- QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{
- image: url(./Transparent-Style/checkbox-checked-disabled.png);
-}
- QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{
- image: url(./Transparent-Style/checkbox.png);
-}
- QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{
- image: url(./Transparent-Style/checkbox-checked-hover.png);
-}
- QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{
- image: url(./Transparent-Style/checkbox-checked-disabled.png);
-}
- QTreeWidget#categoriesList::item:has-children{
- background-image: url(./Transparent-Style/arrow-right-small.png);
-}
- QTreeWidget#categoriesList::item:has-children:open{
- background-image: url(./Transparent-Style/branch-opened.png);
-}
-/* ******************************** */
-/* Special styles */
-/* increase categories tab width */
-/* ******************************** */
- QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{
- padding: .3em 0em;
-}
- QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{
- padding: .3em 0em;
-}
- QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{
- min-width: 200px;
-}
- QTreeWidget#categoriesList::item {
- background-position: center left;
- background-repeat: no-repeat;
- padding: 0.35em 4px;
-}
-/* ********************* */
-/* Display Radio Button */
-/* ********************* */
- QRadioButton::indicator{
- width: 16px;
- height: 16px;
-}
- QRadioButton::indicator::checked{
- image: url(./Transparent-Style/radio-BOS-checked.png);
-}
- QRadioButton::indicator::unchecked{
- image: url(./Transparent-Style/radio-BOS.png);
-}
- QRadioButton::indicator::unchecked:hover{
- image: url(./Transparent-Style/radio-BOS-hover.png);
-}
-/* **************************************** */
-/* Spinners #QSpinBox, #QDoubleSpinBox */
-/* **************************************** */
- QAbstractSpinBox{
- padding: 5px;
- background-color: transparent;
- color: #eff0f1;
- border-radius: 2px;
- min-width: Auto;
-}
- QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{
- border-style: solid;
- border-width: 1px;
- subcontrol-origin: border;
-}
- QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{
- background-color: transparent;
-}
- QAbstractSpinBox::up-button{
- background-color: transparent;
- subcontrol-origin: border;
- subcontrol-position: center right;
- padding-right: 5px;
- /* subcontrol-position: top right;
- */
-}
- QAbstractSpinBox::down-button{
- background-color: transparent;
- subcontrol-origin: border;
- subcontrol-position: center left;
- padding-left: 5px;
- /* subcontrol-position: bottom right;
- */
-}
- QAbstractSpinBox::up-arrow{
- border-image: url(./Transparent-Style/narrow-arrow-right.png);
-}
-QAbstractSpinBox::down-arrow{
- border-image: url(./Transparent-Style/narrow-arrow-left.png);
-}
-/* QTextEdit,QWebView,QLineEdit,QComboBox{
- border-color:#3F3F46;
- /* Grey - Blue*/
- /*
-}
-*/
-/* **************************************** */
-/* Tooltips #QToolTip, #SaveGameInfoWidget */
-/* **************************************** */
- QToolTip{
- background-color:#121212;
- color:#C0C0C0;
- padding:0px;
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
- SaveGameInfoWidget{
- font-size: 16px;
- background-color:#121212;
- color:#C0C0C0;
- padding:0px;
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
-/* **************************** */
-/* Handles Web, Nexus info tab */
-/* **************************** */
- QWebView{
- background-color: Black;
-}
- QLineEdit{
- font-family: Segoe UI;
- min-height: 20px;
- font-size: 16px;
- background-color:#3F3F46;
- selection-background-color: rgba(154,154,0,0.6);
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
- QTextEdit{
- color: #cccccc;
- font-family: Segoe UI;
- font-size: 16px;
- /* background-color:#000;
- */
- selection-background-color: rgba(154,154,0,0.6);
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
-
-QStatusBar::item {border: None;}
-
-/* Font size */
- QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{
- color: #cccccc;
- font-family: Segoe UI;
- font-size: 16px;
- /* was 14px Profile font size */
-}
- QAbstractItemView{
- color: #cccccc;
- font-family: Segoe UI;
- /* font-family: Source Sans Pro;
- */
- font-size: 16px;
- /* Body font size*/
-}
- QRadioButton{
- color: #cccccc;
- font-family: Segoe UI;
- /* font-family: Source Sans Pro;
- */
- font-size: 16px;
-}
- QWebView,QComboBox,QComboBox:editable{
- font-family:Segoe UI;
- font-style: normal;
- font-weight: normal;
- font-size: 16px;
- background-color:#000;
- /* border-color:#3F3F46;
- /* Grey - Blue*/
- color: #cccccc;
- font-family: Arial;
- font-size: 16px;
- /* Filter Name*/
-}
- QHeaderView::section{
- /* font-family: Source Sans Pro;
- */
- font-family: Segoe UI;
- font-size: 16px;
- /*Top Bar on menus font*/
-}
- QListView::item{
- color:#F1F1F1;
- /* White */
-}
- QGroupBox {
-}
- QGroupBox::title {
- subcontrol-origin: margin;
- subcontrol-position: top center;
-}
- QGroupBox::indicator {
- subcontrol-origin: margin;
- subcontrol-position: top center;
-}
- QLabel {
- color: #cccccc;
- /* color: #F1F1F1;
- /* White */
- /* border: none;
- outline: none;
- border-radius: 5px;
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
- */
-}
-
-LinkLabel {
- qproperty-linkColor: #3399FF;
-}
-
-QLineEdit[valid-filter=false] {
- background-color: #661111 !important;
-}
diff --git a/src/stylesheets/Transparent-Style-Skyrim.qss b/src/stylesheets/Transparent-Style-Skyrim.qss
deleted file mode 100644
index 97fb862b..00000000
--- a/src/stylesheets/Transparent-Style-Skyrim.qss
+++ /dev/null
@@ -1,758 +0,0 @@
-#centralWidget {
- border-image: url(./Transparent-Style/Background-skyrim.png) 0 0 0 0 stretch stretch;
-}
- QWidget#TextViewer{
-}
- QWidget{
- color: #fff;
- background-color: rgba(45,45,48,30);
- alternate-background-color: rgba(38,38,38,30);
-}
- QWidget:disabled{
-}
- QAbstractItemView{
- color: #dcdcdc;
- background-color: rgba(45,45,48,30);
- alternate-background-color: rgba(38,38,38,50);
- border: 1px solid #3F3F46;
- /* Grey - Blue*/
- border-style:outset;
- border-radius: 3px;
- selection-color: #3F3F46;
- /* Grey - Blue*/
- outline: none;
- padding-left:0;
-}
- #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog {
- border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #toolBarArea{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #EditExecutablesDialog{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #SimpleInstallDialog,#LockedDialog,QMenu{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #nameLabel{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:rgba(154,154,0,0.3);
- color:#fff;
-}
- #ProfilesDialog,#FomodInstallerDialog{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
- #filesView{
- border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch;
-}
-/* ******************************************** */
-/* Main Navigation Button Bar at top of window */
-/* ******************************************** */
- QToolBar{
- /*border: none;
- */
-}
- QToolBar::separator{
- /*image: url(./Transparent-Style/Vault-101-vault-logo.png);
- */
-}
- QToolButton{
- border:2px solid None;
- border-radius: 6px;
- margin: 3px;
- padding-left: 8px;
- padding-right: 8px;
- padding-top: 0px;
- padding-bottom: 2px;
-}
- QToolButton:hover{
- border-radius: 3px;
- border: 0px;
- padding: 0px;
- background: trANSPARENT;
- border: 0px ridge #9A9A00;
- background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53);
-}
- QToolButton:pressed{
- background: black;
-}
-/* **************************************** */
-/* Tabs on top of Treeview */
-/* **************************************** */
- QTabWidget::pane{
- border-color:#3F3F46;
- /* Grey - Blue*/
- /* border-top-color:#9A9A00;
- */
- top: 0px;
- border-style:hidden;
- border-width:1px;
-}
- QTabWidget::tab-bar{
- alignment: center;
-}
- QTabBar{
- color: #cccccc;
- font-family: Segoe UI;
- font-size: 16px;
- text-transform: none;
- min-height:auto;
- padding-bottom: 5px;
-}
- QTabBar::tab{
- border: none;
- border-bottom-style: none;
- background-color: rgba(154,154,0,0.3);
- padding-left: 9px;
- padding-right: 9px;
- padding-top: 3px;
- padding-bottom: 3px;
- margin-right: 2px;
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
-}
- QTabBar::tab:disabled{
- color: #404040;
- background-color: #000;
- margin-top: 0px;
-}
- QTabBar::tab:selected{
- color: #dcdcdc;
- background-color: #9A9A00;
- /*Yellow opaque*/
-}
- QTabBar::tab:!selected:hover{
- border-radius: 3px;
- border-top:3px double #9A9A00;
- border-bottom:3px double #9A9A00;
- padding: 1px;
- text-align: center;
- background-color: #9A9A00;
- color:#fff;
- Height: 20%;
-}
-/* QTabBar::tab:!selected{
- color: #808080;
- background-color: #404040;
- margin-top: 0px;
-}
- */
- #deactivateESP,#activateESP{
- border:#b30000;
- background:#333337;
-}
-/* **************************************** */
-/* <More View> on top of Treeview */
-/* **************************************** */
- QTabBar QToolButton{
- border-radius: 0px;
- border: 0px;
- padding: 0px;
- background: transparent;
-}
- QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{
- image: url(./Transparent-Style/arrow-up.png);
-}
- QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{
- image: url(./Transparent-Style/arrow-down.png);
-}
- QTabBar QToolButton::right-arrow{
- image: url(./Transparent-Style/narrow-arrow-right.png);
-}
- QTabBar QToolButton::left-arrow{
- image: url(./Transparent-Style/narrow-arrow-left.png);
-}
-/* **************************************** */
-/* Column names of TreeView */
-/* **************************************** */
- QTableView{
- gridline-color:#3F3F46;
- selection-background-color:#9A9A00;
- selection-color:#F1F1F1;
- /* White */
- text-align: center;
- min-height:24px;
-}
- QHeaderView{
- min-height:24px;
- /*Top Bar on menus*/
- padding: 3px;
-}
- QHeaderView::section{
- /* color: #cc3333;
- */
- background-color: #252526;
- border-radius: 0px;
- padding: 0px;
- padding-left: 5px;
-}
- QHeaderView::section:hover{
- background: rgba(154,154,0,0.3);
- border: 1px solid #9a9a00;
- padding: 0px;
- padding-left: 5px;
-}
- QHeaderView::up-arrow,QHeaderView::down-arrow{
- min-height:Auto;
- min-width:Auto;
-}
- QHeaderView::up-arrow{
- image: url(./Transparent-Style/arrow-up.png);
- min-height:25px;
- min-width:15px;
- padding-right: 0px;
-}
-QHeaderView::down-arrow{
- image: url(./Transparent-Style/arrow-down.png);
-}
-/* **************************************** */
-/* Hover */
-/* **************************************** */
- QMenu:item:hover,QMenuBar::item:selected,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{
- color:#fff;
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:rgba(154,154,0,0.3);
-}
- QAbstractItemView::item:hover{
- border-top:1px solid #b9d7fc;
- border-bottom:1px solid #b9d7fc;
- background-color:rgba(154,154,0,0.3);
- padding: 3px;
-}
-/*#DownloadListView{
-}
-*/
- #DownloadListView{
- outline: 1px solid #e8e8e8;
- border: 0px solid #9a9a00;
-}
- #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{
- border: 1px solid #9a9a00;
- padding: 1px;
- text-align: center;
- color:#fff;
-}
-/* **************************************** */
-/* Context menus, toolbar dropdowns #QMenu */
-/* **************************************** */
- QMenu{
- border-width: 3px;
- border-style: solid;
-}
-QMenu::item{
- padding: 6px 20px;
-}
-QMenu::item:selected{
- color:#fff;
- background-color: #3F3F46;
- /* Grey - Blue*/
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QMenu::right-arrow{
- image: url(./Transparent-Style/arrow-right.png);
- /* right click main menu top option*/
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
- border:0px outset #3F3F46;
- /* Grey - Blue*/
-}
-/* ********************* */
-/* LCD Counter */
-/* ********************* */
- QLCDNumber{
- color: #9A9A00;
- Background: #000;
- border-color: #3F3F46;
- /* Grey - Blue*/
- border-style: solid;
- border-width: 1px;
- border-radius: 5px;
-}
-/* **************************************** */
-/* Launch application Drop down Box */
-/* **************************************** */
- QComboBox{
- background-color: #333337;
- padding: 3px 5px 5px 5px;
- height: 26px;
- border-radius: 5px;
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QComboBox:on{
- padding: 3px 5px 5px 5px;
- color: white;
- background-color: #3F3F46;
- /* Grey - Blue*/
-}
- QComboBox:hover{
- border-radius: 3px;
- border-top:3px double #9A9A00;
- border-bottom:3px double #9A9A00;
- /* padding: 0px;
- */
-}
- QComboBox::drop-down{
- /* Down arrow in combo box */
- outline: none;
- border: none;
- border-width: 1px;
-}
- QComboBox::menu-indicator{
- image: url(./Transparent-Style/arrow-down.png);
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
- border:1px outset #3F3F46;
- /* Grey - Blue*/
-}
-/* ************************* */
-/* QComboBox::down-arrow:on, */
-/* ************************* */
- QComboBox::down-arrow:hover,QComboBox::down-arrow:focus {
- image: url(./Transparent-Style/arrow-down-hover.png);
-}
- QComboBox::up-arrow:hover,QComboBox::up-arrow:focus {
- image: url(./Transparent-Style/arrow-up-hover.png);
-}
- QComboBox::down-arrow{
- image:url(./Transparent-Style/arrow-down.png);
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
-}
- QComboBox::down-arrow:on{
- image:url(./Transparent-Style/arrow-up.png);
-}
- QComboBox:editable {
- background: black;
- /* color: pink;
- */
-}
- QComboBox::item{
-}
- QComboBox QAbstractItemView{
- selection-color:#fff;
- outline: 1px solid #9a9a00;
- selection-background-color:#3F3F46;
- /* Grey - Blue*/
- border-top:1px solid #9a9a00;
- border-bottom:1px solid #9a9a00;
- padding: 5px;
-}
-/* **************************************************************** */
-/* Action Buttons */
-/* */
-/* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */
-/* Sort, Load order backup, Load Order Restore */
-/* **************************************************************** */
- QPushButton{
- background-color: #333337;
- min-height:26px;
- padding:1px 5%;
- text-align: center;
- border-radius: 5px;
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QPushButton::menu-indicator{
- image: url(./Transparent-Style/arrow-down.png);
- subcontrol-origin: padding;
- subcontrol-position: center right;
- width: 18px;
- height: 18px;
- border:1px hidden #3F3F46;
- /* Grey - Blue*/
-}
- QPushButton::menu-indicator:Hover{
- image: url(./Transparent-Style/arrow-down-hover.png);
-}
- QPushButton:focus{
-}
- QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{
- background: #3F3F46;
- /* Grey - Blue*/
- border-radius: 1px;
- border: 1px solid #9a9a00;
-}
- QPushButton:hover{
- border-radius: 3px;
- border-top:3px double #9A9A00;
- border-bottom:3px double #9A9A00;
-}
- QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{
- color:#fff;
- border-color:#707070;
- border-style:solid;
- border-width:1px;
-}
- QPushButton:disabled{
-}
- QPushButton:open{
-}
- QPushButton:!enabled{
-}
-/* **************************************** */
-/* Filter Button */
-/* **************************************** */
- QPushButton#displayCategoriesBtn{
- min-width: 20px;
- background:transparent;
- color: transparent;
- border: 1px hidden #9a9a00;
-}
- QPushButton#displayCategoriesBtn:checked{
- image: url(./Transparent-Style/arrow-left.png);
-}
- QPushButton#displayCategoriesBtn:!checked{
- image: url(./Transparent-Style/arrow-right.png);
-}
- QPushButton#displayCategoriesBtn:checked:hover{
- image: url(./Transparent-Style/arrow-left-hover.png);
-}
- QPushButton#displayCategoriesBtn:!checked:hover{
- image: url(./Transparent-Style/arrow-right-hover.png);
-}
-/* **************************************** */
-/* Scroll bar */
-/* **************************************** */
- QScrollBar{
- height:20px;
- width:20px;
- background-color:transparent;
-}
- QScrollBar::handle{
- border: 1px solid #aaa;
- border-radius: 4px;
-}
- QScrollBar::handle:vertical{
- margin: 1px 4px;
- min-height:20px;
- min-width: 10px;
- background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000);
-}
- QScrollBar::handle:vertical:hover{
- background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00);
-}
- QScrollBar::handle:horizontal{
- min-height:10px;
- min-width:20px;
- margin:4px 1px;
- background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000);
-}
- QScrollBar::handle:horizontal:hover{
- background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00);
-}
- QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{
- background-color: transparent;
-}
- QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{
- height:0;
- width:0;
-}
-/* ******************************************************** */
-/* Main Tree View Inherited from QAbstractItemView */
-/* ******************************************************** */
- QTreeView {
-}
- QTreeView:item{
- padding: 3px;
- font-size: 16px;
- height: 18px;
- /*Bottom text Box*/
-}
- QTreeView:item:selected{
- color:#fff;
- padding: 0px;
- background-color: #3F3F46;
- /* Grey - Blue*/
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
-}
- QTreeView:item QLineEdit{
- outline: none;
- border: none;
- padding: 0px;
- margin: 0px;
-}
- QTreeView::branch:has-siblings:!adjoins-item{
- background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat;
-}
- QTreeView::branch:has-siblings{
- background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat;
-}
- QTreeView::branch:!has-children:!has-siblings:adjoins-item{
- background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat;
-}
- QTreeView::branch:closed:has-children:has-siblings{
- background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat;
-}
- QTreeView::branch:closed:has-children:!has-siblings{
- background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat;
-}
- QTreeView::branch:open:has-children:has-siblings{
- background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat;
-}
- QTreeView::branch:open:has-children:!has-siblings{
- background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat;
-}
-
-QAbstractItemView[filtered=true] {
- border: 2px solid #f00 !important;
-}
-
-/* **************************************************************** */
-/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */
-/* common */
-/* **************************************************************** */
- QTreeView::indicator,QCheckBox::indicator{
- outline: none;
- border: none;
- padding: 0px;
- width: 24px;
- height: 24px;
-}
- QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{
- image: url(./Transparent-Style/checkbox-checked.png);
-}
- QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{
- image: url(./Transparent-Style/checkbox-hover.png);
-}
- QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{
- image: url(./Transparent-Style/checkbox-checked-disabled.png);
-}
- QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{
- image: url(./Transparent-Style/checkbox.png);
-}
- QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{
- image: url(./Transparent-Style/checkbox-checked-hover.png);
-}
- QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{
- image: url(./Transparent-Style/checkbox-checked-disabled.png);
-}
- QTreeWidget#categoriesList::item:has-children{
- background-image: url(./Transparent-Style/arrow-right-small.png);
-}
- QTreeWidget#categoriesList::item:has-children:open{
- background-image: url(./Transparent-Style/branch-opened.png);
-}
-/* ******************************** */
-/* Special styles */
-/* increase categories tab width */
-/* ******************************** */
- QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{
- padding: .3em 0em;
-}
- QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{
- padding: .3em 0em;
-}
- QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{
- min-width: 200px;
-}
- QTreeWidget#categoriesList::item {
- background-position: center left;
- background-repeat: no-repeat;
- padding: 0.35em 4px;
-}
-/* ********************* */
-/* Display Radio Button */
-/* ********************* */
- QRadioButton::indicator{
- width: 16px;
- height: 16px;
-}
- QRadioButton::indicator::checked{
- image: url(./Transparent-Style/radio-BOS-checked.png);
-}
- QRadioButton::indicator::unchecked{
- image: url(./Transparent-Style/radio-BOS.png);
-}
- QRadioButton::indicator::unchecked:hover{
- image: url(./Transparent-Style/radio-BOS-hover.png);
-}
-/* **************************************** */
-/* Spinners #QSpinBox, #QDoubleSpinBox */
-/* **************************************** */
- QAbstractSpinBox{
- padding: 5px;
- background-color: transparent;
- color: #eff0f1;
- border-radius: 2px;
- min-width: Auto;
-}
- QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{
- border-style: solid;
- border-width: 1px;
- subcontrol-origin: border;
-}
- QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{
- background-color: transparent;
-}
- QAbstractSpinBox::up-button{
- background-color: transparent;
- subcontrol-origin: border;
- subcontrol-position: center right;
- padding-right: 5px;
- /* subcontrol-position: top right;
- */
-}
- QAbstractSpinBox::down-button{
- background-color: transparent;
- subcontrol-origin: border;
- subcontrol-position: center left;
- padding-left: 5px;
- /* subcontrol-position: bottom right;
- */
-}
- QAbstractSpinBox::up-arrow{
- border-image: url(./Transparent-Style/narrow-arrow-right.png);
-}
-QAbstractSpinBox::down-arrow{
- border-image: url(./Transparent-Style/narrow-arrow-left.png);
-}
-/* QTextEdit,QWebView,QLineEdit,QComboBox{
- border-color:#3F3F46;
- /* Grey - Blue*/
- /*
-}
-*/
-/* **************************************** */
-/* Tooltips #QToolTip, #SaveGameInfoWidget */
-/* **************************************** */
- QToolTip{
- background-color:#121212;
- color:#C0C0C0;
- padding:0px;
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
- SaveGameInfoWidget{
- font-size: 16px;
- background-color:#121212;
- color:#C0C0C0;
- padding:0px;
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
-
-QStatusBar::item {border: None;}
-
-/* **************************** */
-/* Handles Web, Nexus info tab */
-/* **************************** */
- QWebView{
- background-color: Black;
-}
- QLineEdit{
- font-family: Segoe UI;
- min-height: 20px;
- font-size: 16px;
- background-color:#3F3F46;
- selection-background-color: rgba(154,154,0,0.6);
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
- QTextEdit{
- color: #cccccc;
- font-family: Segoe UI;
- font-size: 16px;
- /* background-color:#000;
- */
- selection-background-color: rgba(154,154,0,0.6);
- border-color:#9A9A00;
- border-radius: 3px;
- border-width:1px;
- border-style:solid;
-}
-/* Font size */
- QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{
- color: #cccccc;
- font-family: Segoe UI;
- font-size: 16px;
- /* was 14px Profile font size */
-}
- QAbstractItemView{
- color: #cccccc;
- font-family: Segoe UI;
- /* font-family: Source Sans Pro;
- */
- font-size: 16px;
- /* Body font size*/
-}
- QRadioButton{
- color: #cccccc;
- font-family: Segoe UI;
- /* font-family: Source Sans Pro;
- */
- font-size: 16px;
-}
- QWebView,QComboBox,QComboBox:editable{
- font-family:Segoe UI;
- font-style: normal;
- font-weight: normal;
- font-size: 16px;
- background-color:#000;
- /* border-color:#3F3F46;
- /* Grey - Blue*/
- color: #cccccc;
- font-family: Arial;
- font-size: 16px;
- /* Filter Name*/
-}
- QHeaderView::section{
- /* font-family: Source Sans Pro;
- */
- font-family: Segoe UI;
- font-size: 16px;
- /*Top Bar on menus font*/
-}
- QListView::item{
- color:#F1F1F1;
- /* White */
-}
- QGroupBox {
-}
- QGroupBox::title {
- subcontrol-origin: margin;
- subcontrol-position: top center;
-}
- QGroupBox::indicator {
- subcontrol-origin: margin;
- subcontrol-position: top center;
-}
- QLabel {
- color: #cccccc;
- /* color: #F1F1F1;
- /* White */
- /* border: none;
- outline: none;
- border-radius: 5px;
- border-top:1px solid #9A9A00;
- border-bottom:1px solid #9A9A00;
- */
-}
-
-LinkLabel {
- qproperty-linkColor: #3399FF;
-}
-
-QLineEdit[valid-filter=false] {
- background-color: #661111 !important;
-}
diff --git a/src/texteditor.cpp b/src/texteditor.cpp
index 4a8080f4..7f62a6ef 100644
--- a/src/texteditor.cpp
+++ b/src/texteditor.cpp
@@ -107,10 +107,14 @@ bool TextEditor::save()
file.open(QIODevice::WriteOnly);
file.resize(0);
- QTextCodec* codec = QTextCodec::codecForName(m_encoding.toUtf8());
+ auto codec = QStringConverter::encodingForName(m_encoding.toLocal8Bit());
+ if (!codec.has_value())
+ return false;
+ QStringEncoder encoder(codec.value());
+
QString data = toPlainText().replace("\n", "\r\n");
- file.write(codec->fromUnicode(data));
+ file.write(encoder.encode(data));
document()->setModified(false);
return true;
@@ -284,7 +288,7 @@ void TextEditor::resizeEvent(QResizeEvent* e)
void TextEditor::paintLineNumbers(QPaintEvent* e, const QColor& textColor)
{
QStyleOption opt;
- opt.init(m_lineNumbers);
+ opt.initFrom(m_lineNumbers);
QPainter painter(m_lineNumbers);
diff --git a/src/tutorials/TutorialDescription.qml b/src/tutorials/TutorialDescription.qml
index 4079b70d..e8b4cb28 100644
--- a/src/tutorials/TutorialDescription.qml
+++ b/src/tutorials/TutorialDescription.qml
@@ -50,6 +50,6 @@ Rectangle {
MouseArea {
id: clickArea
anchors.fill: parent
- onClicked: parent.clicked(mouse)
+ onClicked: parent.clicked()
}
}
diff --git a/src/version.rc b/src/version.rc
index 517ce6f1..2f79f4c3 100644
--- a/src/version.rc
+++ b/src/version.rc
@@ -3,14 +3,14 @@
// If VS_FF_PRERELEASE is not set, MO labels the build as a release and uses VER_FILEVERSION to determine version number.
// Otherwise, if letters are used in VER_FILEVERSION_STR, uses the full MOBase::VersionInfo parser
// Otherwise, uses the numbers from VER_FILEVERSION and sets the release type as pre-alpha
-#define VER_FILEVERSION 2,4,3
-#define VER_FILEVERSION_STR "2.4.3\0"
+#define VER_FILEVERSION 2,5,0
+#define VER_FILEVERSION_STR "2.5.0-alpha1\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_FILEVERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
-FILEFLAGS (0)
+FILEFLAGS VS_FF_PRERELEASE
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE (0)
@@ -24,7 +24,7 @@ BEGIN
VALUE "FileDescription", "Mod Organizer 2 GUI\0"
VALUE "OriginalFilename", "ModOrganizer.exe\0"
VALUE "InternalName", "ModOrganizer2\0"
- VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2021 Mod Organizer 2 contributors\0"
+ VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2022 Mod Organizer 2 contributors\0"
VALUE "ProductName", "Mod Organizer 2\0"
VALUE "ProductVersion", VER_FILEVERSION_STR
END