summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp1480
-rw-r--r--src/mainwindow.cpp37
-rw-r--r--src/mainwindow.h1316
-rw-r--r--src/nxmaccessmanager.cpp2
-rw-r--r--src/organizer_en.ts2817
-rw-r--r--src/organizercore.cpp4
-rw-r--r--src/settings.cpp8
-rw-r--r--src/settings.h1
-rw-r--r--src/settingsdialog.cpp48
-rw-r--r--src/settingsdialog.h10
-rw-r--r--src/settingsdialog.ui2837
11 files changed, 4553 insertions, 4007 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 631ec5b5..a8942b1a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,740 +1,740 @@
-/*
-Copyright (C) 2012 Sebastian Herbord. All rights reserved.
-
-This file is part of Mod Organizer.
-
-Mod Organizer is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Mod Organizer is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-
-#ifdef LEAK_CHECK_WITH_VLD
-#include <wchar.h>
-#include <vld.h>
-#endif // LEAK_CHECK_WITH_VLD
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <DbgHelp.h>
-
-#include <appconfig.h>
-#include <utility.h>
-#include <scopeguard.h>
-#include "mainwindow.h"
-#include <report.h>
-#include "modlist.h"
-#include "profile.h"
-#include "spawn.h"
-#include "executableslist.h"
-#include "singleinstance.h"
-#include "utility.h"
-#include "helper.h"
-#include "logbuffer.h"
-#include "selectiondialog.h"
-#include "moapplication.h"
-#include "tutorialmanager.h"
-#include "nxmaccessmanager.h"
-#include "instancemanager.h"
-#include "moshortcut.h"
-#include "organizercore.h"
-
-#include <eh.h>
-#include <windows_error.h>
-#include <usvfs.h>
-
-#include <QApplication>
-#include <QPushButton>
-#include <QListWidget>
-#include <QComboBox>
-#include <QCheckBox>
-#include <QDir>
-#include <QFileInfo>
-#include <QSettings>
-#include <QWhatsThis>
-#include <QToolBar>
-#include <QFileDialog>
-#include <QDesktopServices>
-#include <QMessageBox>
-#include <QSharedMemory>
-#include <QBuffer>
-#include <QSplashScreen>
-#include <QDirIterator>
-#include <QDesktopServices>
-#include <QLibraryInfo>
-#include <QSslSocket>
-#include <QtPlatformHeaders/QWindowsWindowFunctions>
-
-#include <boost/scoped_array.hpp>
-
-#include <ShellAPI.h>
-
-#include <cstdarg>
-#include <iostream>
-#include <sstream>
-#include <stdexcept>
-
-
-#pragma comment(linker, "/manifestDependency:\"name='dlls' processorArchitecture='x86' version='1.0.0.0' type='win32' \"")
-
-
-using namespace MOBase;
-using namespace MOShared;
-
-bool createAndMakeWritable(const std::wstring &subPath) {
- QString const dataPath = qApp->property("dataPath").toString();
- QString fullPath = dataPath + "/" + QString::fromStdWString(subPath);
-
- if (!QDir(fullPath).exists() && !QDir().mkdir(fullPath)) {
- QMessageBox::critical(nullptr, QObject::tr("Error"),
- QObject::tr("Failed to create \"%1\". Your user "
- "account probably lacks permission.")
- .arg(fullPath));
- return false;
- } else {
- return true;
- }
-}
-
-bool bootstrap()
-{
- // remove the temporary backup directory in case we're restarting after an update
- QString backupDirectory = qApp->applicationDirPath() + "/update_backup";
- if (QDir(backupDirectory).exists()) {
- shellDelete(QStringList(backupDirectory));
- }
-
- // cycle logfile
- removeOldFiles(qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::logPath()),
- "usvfs*.log", 5, QDir::Name);
-
- if (!createAndMakeWritable(AppConfig::logPath())) {
- return false;
- }
-
- return true;
-}
-
-LPTOP_LEVEL_EXCEPTION_FILTER prevUnhandledExceptionFilter = nullptr;
-
-static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs)
-{
- const std::wstring& dumpPath = OrganizerCore::crashDumpsPath();
- int dumpRes =
- CreateMiniDump(exceptionPtrs, OrganizerCore::getGlobalCrashDumpsType(), dumpPath.c_str());
- if (!dumpRes)
- qCritical("ModOrganizer has crashed, crash dump created.");
- else
- qCritical("ModOrganizer has crashed, CreateMiniDump failed (%d, error %lu).", dumpRes, GetLastError());
-
- if (prevUnhandledExceptionFilter)
- return prevUnhandledExceptionFilter(exceptionPtrs);
- else
- return EXCEPTION_CONTINUE_SEARCH;
-}
-
-// Parses the first parseArgCount arguments of the current process command line and returns
-// them in parsedArgs, the rest of the command line is returned untouched.
-LPCWSTR UntouchedCommandLineArguments(int parseArgCount, std::vector<std::wstring>& parsedArgs)
-{
- LPCWSTR cmd = GetCommandLineW();
- LPCWSTR arg = nullptr; // to skip executable name
- for (; parseArgCount >= 0 && *cmd; ++cmd)
- {
- if (*cmd == '"') {
- int escaped = 0;
- for (++cmd; *cmd && (*cmd != '"' || escaped % 2 != 0); ++cmd)
- escaped = *cmd == '\\' ? escaped + 1 : 0;
- }
- if (*cmd == ' ') {
- if (arg)
- if (cmd-1 > arg && *arg == '"' && *(cmd-1) == '"')
- parsedArgs.push_back(std::wstring(arg+1, cmd-1));
- else
- parsedArgs.push_back(std::wstring(arg, cmd));
- arg = cmd + 1;
- --parseArgCount;
- }
- }
- return cmd;
-}
-
-static int SpawnWaitProcess(LPCWSTR workingDirectory, LPCWSTR commandLine) {
- PROCESS_INFORMATION pi{ 0 };
- STARTUPINFO si{ 0 };
- si.cb = sizeof(si);
- std::wstring commandLineCopy = commandLine;
-
- if (!CreateProcessW(NULL, &commandLineCopy[0], NULL, NULL, FALSE, 0, NULL, workingDirectory, &si, &pi)) {
- // A bit of a problem where to log the error message here, at least this way you can get the message
- // using a either DebugView or a live debugger:
- std::wostringstream ost;
- ost << L"CreateProcess failed: " << commandLine << ", " << GetLastError();
- OutputDebugStringW(ost.str().c_str());
- return -1;
- }
-
- WaitForSingleObject(pi.hProcess, INFINITE);
-
- DWORD exitCode = (DWORD)-1;
- ::GetExitCodeProcess(pi.hProcess, &exitCode);
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- return static_cast<int>(exitCode);
-}
-
-static DWORD WaitForProcess() {
-
-}
-
-static bool HaveWriteAccess(const std::wstring &path)
-{
- bool writable = false;
-
- const static SECURITY_INFORMATION requestedFileInformation = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;
-
- DWORD length = 0;
- if (!::GetFileSecurityW(path.c_str(), requestedFileInformation, nullptr, 0UL, &length)
- && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
- std::string tempBuffer;
- tempBuffer.reserve(length);
- PSECURITY_DESCRIPTOR security = (PSECURITY_DESCRIPTOR)tempBuffer.data();
- if (security
- && ::GetFileSecurity(path.c_str(), requestedFileInformation, security, length, &length)) {
- HANDLE token = nullptr;
- const static DWORD tokenDesiredAccess = TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_DUPLICATE | STANDARD_RIGHTS_READ;
- if (!::OpenThreadToken(::GetCurrentThread(), tokenDesiredAccess, TRUE, &token)) {
- if (!::OpenProcessToken(::GetCurrentProcess(), tokenDesiredAccess, &token)) {
- throw std::runtime_error("Unable to get any thread or process token");
- }
- }
-
- HANDLE impersonatedToken = nullptr;
- if (::DuplicateToken(token, SecurityImpersonation, &impersonatedToken)) {
- GENERIC_MAPPING mapping = { 0xFFFFFFFF };
- mapping.GenericRead = FILE_GENERIC_READ;
- mapping.GenericWrite = FILE_GENERIC_WRITE;
- mapping.GenericExecute = FILE_GENERIC_EXECUTE;
- mapping.GenericAll = FILE_ALL_ACCESS;
-
- DWORD genericAccessRights = FILE_GENERIC_WRITE;
- ::MapGenericMask(&genericAccessRights, &mapping);
-
- PRIVILEGE_SET privileges = { 0 };
- DWORD grantedAccess = 0;
- DWORD privilegesLength = sizeof(privileges);
- BOOL result = 0;
- if (::AccessCheck(security, impersonatedToken, genericAccessRights, &mapping, &privileges, &privilegesLength, &grantedAccess, &result)) {
- writable = result != 0;
- }
- ::CloseHandle(impersonatedToken);
- }
-
- ::CloseHandle(token);
- }
- }
- return writable;
-}
-
-
-QString determineProfile(QStringList &arguments, const QSettings &settings)
-{
- QString selectedProfileName = QString::fromUtf8(settings.value("selected_profile", "").toByteArray());
- { // see if there is a profile on the command line
- int profileIndex = arguments.indexOf("-p", 1);
- if ((profileIndex != -1) && (profileIndex < arguments.size() - 1)) {
- qDebug("profile overwritten on command line");
- selectedProfileName = arguments.at(profileIndex + 1);
- }
- arguments.removeAt(profileIndex);
- arguments.removeAt(profileIndex);
- }
- if (selectedProfileName.isEmpty()) {
- qDebug("no configured profile");
- selectedProfileName = "Default";
- } else {
- qDebug("configured profile: %s", qUtf8Printable(selectedProfileName));
- }
-
- return selectedProfileName;
-}
-
-MOBase::IPluginGame *selectGame(QSettings &settings, QDir const &gamePath, MOBase::IPluginGame *game)
-{
- settings.setValue("gameName", game->gameName());
- //Sadly, hookdll needs gamePath in order to run. So following code block is
- //commented out
- /*if (gamePath == game->gameDirectory()) {
- settings.remove("gamePath");
- } else*/ {
- QString gameDir = gamePath.absolutePath();
- game->setGamePath(gameDir);
- settings.setValue("gamePath", QDir::toNativeSeparators(gameDir).toUtf8().constData());
- }
- return game; //Woot
-}
-
-
-MOBase::IPluginGame *determineCurrentGame(QString const &moPath, QSettings &settings, PluginContainer const &plugins)
-{
- //Determine what game we are running where. Be very paranoid in case the
- //user has done something odd.
- //If the game name has been set up, use that.
- QString gameName = settings.value("gameName", "").toString();
- if (!gameName.isEmpty()) {
- MOBase::IPluginGame *game = plugins.managedGame(gameName);
- if (game == nullptr) {
- reportError(QObject::tr("Plugin to handle %1 no longer installed").arg(gameName));
- return nullptr;
- }
- QString gamePath = QString::fromUtf8(settings.value("gamePath", "").toByteArray());
- if (gamePath == "") {
- gamePath = game->gameDirectory().absolutePath();
- }
- QDir gameDir(gamePath);
- if (game->looksValid(gameDir)) {
- return selectGame(settings, gameDir, game);
- }
- }
-
- //gameName wasn't set, or otherwise can't be found. Try looking through all
- //the plugins using the gamePath
- QString gamePath = QString::fromUtf8(settings.value("gamePath", "").toByteArray());
- if (!gamePath.isEmpty()) {
- QDir gameDir(gamePath);
- //Look to see if one of the installed games binary file exists in the current
- //game directory.
- for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
- if (game->looksValid(gameDir)) {
- return selectGame(settings, gameDir, game);
- }
- }
- }
-
- //The following code would try to determine the right game to mange but it would usually find the wrong one
- //so it was commented out.
- /*
- //OK, we are in a new setup or existing info is useless.
- //See if MO has been installed inside a game directory
- for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
- if (game->isInstalled() && moPath.startsWith(game->gameDirectory().absolutePath())) {
- //Found it.
- return selectGame(settings, game->gameDirectory(), game);
- }
- }
-
- //Try walking up the directory tree to see if MO has been installed inside a game
- {
- QDir gameDir(moPath);
- do {
- //Look to see if one of the installed games binary file exists in the current
- //directory.
- for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
- if (game->looksValid(gameDir)) {
- return selectGame(settings, gameDir, game);
- }
- }
- //OK, chop off the last directory and try again
- } while (gameDir.cdUp());
- }
- */
-
- //Then try a selection dialogue.
- if (!gamePath.isEmpty() || !gameName.isEmpty()) {
- reportError(QObject::tr("Could not use configuration settings for game \"%1\", path \"%2\".").
- arg(gameName).arg(gamePath));
- }
-
- SelectionDialog selection(QObject::tr("Please select the game to manage"), nullptr, QSize(32, 32));
-
- for (IPluginGame *game : plugins.plugins<IPluginGame>()) {
- if (game->isInstalled()) {
- QString path = game->gameDirectory().absolutePath();
- selection.addChoice(game->gameIcon(), game->gameName(), path, QVariant::fromValue(game));
- }
- }
-
- selection.addChoice(QString("Browse..."), QString(), QVariant::fromValue(static_cast<IPluginGame *>(nullptr)));
-
- while (selection.exec() != QDialog::Rejected) {
- IPluginGame * game = selection.getChoiceData().value<IPluginGame *>();
- if (game != nullptr) {
- return selectGame(settings, game->gameDirectory(), game);
- }
-
- gamePath = QFileDialog::getExistingDirectory(
- nullptr, QObject::tr("Please select the game to manage"), QString(),
- QFileDialog::ShowDirsOnly);
-
- if (!gamePath.isEmpty()) {
- QDir gameDir(gamePath);
- QList<IPluginGame *> possibleGames;
- for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
- if (game->looksValid(gameDir)) {
- possibleGames.append(game);
- //return selectGame(settings, gameDir, game);
- }
- }
- if (possibleGames.count() > 1) {
- SelectionDialog browseSelection(QObject::tr("Please select the game to manage"), nullptr, QSize(32, 32));
- for (IPluginGame *game : possibleGames) {
- QString path = game->gameDirectory().absolutePath();
- browseSelection.addChoice(game->gameIcon(), game->gameName(), path, QVariant::fromValue(game));
- }
- if (browseSelection.exec() == QDialog::Accepted) {
- return selectGame(settings, gameDir, browseSelection.getChoiceData().value<IPluginGame *>());
- } else {
- reportError(QObject::tr("Canceled finding game in \"%1\".").arg(gamePath));
- }
- } else if(possibleGames.count() == 1) {
- return selectGame(settings, gameDir, possibleGames[0]);
- } else {
- reportError(QObject::tr("No game identified in \"%1\". The directory is required to contain "
- "the game binary.").arg(gamePath));
- }
- }
- }
-
- return nullptr;
-}
-
-
-// extend path to include dll directory so plugins don't need a manifest
-// (using AddDllDirectory would be an alternative to this but it seems fairly
-// complicated esp.
-// since it isn't easily accessible on Windows < 8
-// SetDllDirectory replaces other search directories and this seems to
-// propagate to child processes)
-void setupPath()
-{
- static const int BUFSIZE = 4096;
-
- qDebug("MO at: %s", qUtf8Printable(QDir::toNativeSeparators(
- QCoreApplication::applicationDirPath())));
-
- QCoreApplication::setLibraryPaths(QStringList(QCoreApplication::applicationDirPath() + "/dlls") + QCoreApplication::libraryPaths());
-
- boost::scoped_array<TCHAR> oldPath(new TCHAR[BUFSIZE]);
- DWORD offset = ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), BUFSIZE);
- if (offset > BUFSIZE) {
- oldPath.reset(new TCHAR[offset]);
- ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), offset);
- }
-
- std::wstring newPath(ToWString(QDir::toNativeSeparators(
- QCoreApplication::applicationDirPath())) + L"\\dlls");
- newPath += L";";
- newPath += oldPath.get();
-
- ::SetEnvironmentVariableW(L"PATH", newPath.c_str());
-}
-
-static void preloadSsl()
-{
- QString appPath = QDir::toNativeSeparators(QCoreApplication::applicationDirPath());
- if (GetModuleHandleA("libeay32.dll"))
- qWarning("libeay32.dll already loaded?!");
- else {
- QString libeay32 = appPath + "\\libeay32.dll";
- if (!QFile::exists(libeay32))
- qWarning("libeay32.dll not found: %s", qUtf8Printable(libeay32));
- else if (!LoadLibraryW(libeay32.toStdWString().c_str()))
- qWarning("failed to load: %s, %d", qUtf8Printable(libeay32), GetLastError());
- }
- if (GetModuleHandleA("ssleay32.dll"))
- qWarning("ssleay32.dll already loaded?!");
- else {
- QString ssleay32 = appPath + "\\ssleay32.dll";
- if (!QFile::exists(ssleay32))
- qWarning("ssleay32.dll not found: %s", qUtf8Printable(ssleay32));
- else if (!LoadLibraryW(ssleay32.toStdWString().c_str()))
- qWarning("failed to load: %s, %d", qUtf8Printable(ssleay32), GetLastError());
- }
-}
-
-static QString getVersionDisplayString()
-{
- return createVersionInfo().displayString(3);
-}
-
-int runApplication(MOApplication &application, SingleInstance &instance,
- const QString &splashPath)
-{
-
- qDebug("Starting Mod Organizer version %s revision %s", qUtf8Printable(getVersionDisplayString()),
-#if defined(HGID)
- HGID
-#elif defined(GITID)
- GITID
-#else
- "unknown"
-#endif
- );
-
-#if !defined(QT_NO_SSL)
- preloadSsl();
- qDebug("ssl support: %d", QSslSocket::supportsSsl());
-#else
- qDebug("non-ssl build");
-#endif
-
- QString dataPath = application.property("dataPath").toString();
- qDebug("data path: %s", qUtf8Printable(dataPath));
-
- if (!bootstrap()) {
- reportError("failed to set up data paths");
- return 1;
- }
-
- QWindowsWindowFunctions::setWindowActivationBehavior(QWindowsWindowFunctions::AlwaysActivateWindow);
-
- QStringList arguments = application.arguments();
-
- try {
- qDebug("Working directory: %s", qUtf8Printable(QDir::toNativeSeparators(QDir::currentPath())));
-
- QSettings settings(dataPath + "/"
- + QString::fromStdWString(AppConfig::iniFileName()),
- QSettings::IniFormat);
-
- // global crashDumpType sits in OrganizerCore to make a bit less ugly to update it when the settings are changed during runtime
- OrganizerCore::setGlobalCrashDumpsType(settings.value("Settings/crash_dumps_type", static_cast<int>(CrashDumpsType::Mini)).toInt());
-
- qDebug("Loaded settings:");
- settings.beginGroup("Settings");
- for (auto k : settings.allKeys())
- if (!k.contains("username") && !k.contains("password"))
- qDebug(" %s=%s", k.toUtf8().data(), settings.value(k).toString().toUtf8().data());
- settings.endGroup();
-
-
- qDebug("initializing core");
- OrganizerCore organizer(settings);
- if (!organizer.bootstrap()) {
- reportError("failed to set up data paths");
- return 1;
- }
- qDebug("initialize plugins");
- PluginContainer pluginContainer(&organizer);
- pluginContainer.loadPlugins();
-
- MOBase::IPluginGame *game = determineCurrentGame(
- application.applicationDirPath(), settings, pluginContainer);
- if (game == nullptr) {
- return 1;
- }
- if (splashPath.startsWith(':')) {
- // currently using MO splash, see if the plugin contains one
- QString pluginSplash
- = QString(":/%1/splash").arg(game->gameShortName());
- QImage image(pluginSplash);
- if (!image.isNull()) {
- image.save(dataPath + "/splash.png");
- } else {
- qDebug("no plugin splash");
- }
- }
-
- organizer.setManagedGame(game);
- organizer.createDefaultProfile();
-
- if (!settings.contains("game_edition")) {
- QStringList editions = game->gameVariants();
- if (editions.size() > 1) {
- SelectionDialog selection(
- QObject::tr("Please select the game edition you have (MO can't "
- "start the game correctly if this is set "
- "incorrectly!)"),
- nullptr);
- selection.setWindowFlag(Qt::WindowStaysOnTopHint, true);
- int index = 0;
- for (const QString &edition : editions) {
- selection.addChoice(edition, "", index++);
- }
- if (selection.exec() == QDialog::Rejected) {
- return 1;
- } else {
- settings.setValue("game_edition", selection.getChoiceString());
- }
- }
- }
- game->setGameVariant(settings.value("game_edition").toString());
-
- qDebug("managing game at %s", qUtf8Printable(QDir::toNativeSeparators(
- game->gameDirectory().absolutePath())));
-
- organizer.updateExecutablesList(settings);
-
- QString selectedProfileName = determineProfile(arguments, settings);
- organizer.setCurrentProfile(selectedProfileName);
-
- // if we have a command line parameter, it is either a nxm link or
- // a binary to start
- if (arguments.size() > 1) {
- if (MOShortcut shortcut{ arguments.at(1) }) {
- if (shortcut.hasExecutable()) {
- try {
- organizer.runShortcut(shortcut);
- return 0;
- }
- catch (const std::exception &e) {
- reportError(
- QObject::tr("failed to start shortcut: %1").arg(e.what()));
- return 1;
- }
- }
- }
- else if (OrganizerCore::isNxmLink(arguments.at(1))) {
- qDebug("starting download from command line: %s",
- qUtf8Printable(arguments.at(1)));
- organizer.externalMessage(arguments.at(1));
- }
- else {
- QString exeName = arguments.at(1);
- qDebug("starting %s from command line", qUtf8Printable(exeName));
- arguments.removeFirst(); // remove application name (ModOrganizer.exe)
- arguments.removeFirst(); // remove binary name
- // pass the remaining parameters to the binary
- try {
- organizer.startApplication(exeName, arguments, QString(), QString());
- return 0;
- }
- catch (const std::exception &e) {
- reportError(
- QObject::tr("failed to start application: %1").arg(e.what()));
- return 1;
- }
- }
- }
-
- QPixmap pixmap(splashPath);
- QSplashScreen splash(pixmap);
- splash.show();
- splash.activateWindow();
-
- QString apiKey;
- if (organizer.settings().getNexusApiKey(apiKey)) {
- NexusInterface::instance(&pluginContainer)->getAccessManager()->apiCheck(apiKey);
- }
-
- qDebug("initializing tutorials");
- TutorialManager::init(
- qApp->applicationDirPath() + "/"
- + QString::fromStdWString(AppConfig::tutorialsPath()) + "/",
- &organizer);
-
- if (!application.setStyleFile(settings.value("Settings/style", "").toString())) {
- // disable invalid stylesheet
- settings.setValue("Settings/style", "");
- }
-
- int res = 1;
- { // scope to control lifetime of mainwindow
- // set up main window and its data structures
- MainWindow mainWindow(settings, organizer, pluginContainer);
-
- QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application,
- SLOT(setStyleFile(QString)));
- QObject::connect(&instance, SIGNAL(messageSent(QString)), &organizer,
- SLOT(externalMessage(QString)));
-
- mainWindow.processUpdates();
- mainWindow.readSettings();
-
- qDebug("displaying main window");
- mainWindow.show();
- mainWindow.activateWindow();
-
- splash.finish(&mainWindow);
- return application.exec();
- }
- } catch (const std::exception &e) {
- reportError(e.what());
- return 1;
- }
-}
-
-
-int main(int argc, char *argv[])
-{
- //Should allow for better scaling of ui with higher resolution displays
- QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
-
- if (argc >= 4) {
- std::vector<std::wstring> arg;
- auto args = UntouchedCommandLineArguments(2, arg);
- if (arg[0] == L"launch")
- return SpawnWaitProcess(arg[1].c_str(), args);
- }
-
- MOApplication application(argc, argv);
- QStringList arguments = application.arguments();
-
- setupPath();
-
- bool forcePrimary = false;
- if (arguments.contains("update")) {
- arguments.removeAll("update");
- forcePrimary = true;
- }
-
- MOShortcut moshortcut{ arguments.size() > 1 ? arguments.at(1) : "" };
-
- SingleInstance instance(forcePrimary);
- if (!instance.primaryInstance()) {
- if (moshortcut ||
- arguments.size() > 1 && OrganizerCore::isNxmLink(arguments.at(1)))
- {
- qDebug("not primary instance, sending shortcut/download message");
- instance.sendMessage(arguments.at(1));
- return 0;
- } else if (arguments.size() == 1) {
- QMessageBox::information(
- nullptr, QObject::tr("Mod Organizer"),
- QObject::tr("An instance of Mod Organizer is already running"));
- return 0;
- }
- } // we continue for the primary instance OR if MO was called with parameters
-
- do {
- QString dataPath;
-
- try {
- InstanceManager& instanceManager = InstanceManager::instance();
- if (moshortcut && moshortcut.hasInstance())
- instanceManager.overrideInstance(moshortcut.instance());
- dataPath = instanceManager.determineDataPath();
- } catch (const std::exception &e) {
- if (strcmp(e.what(),"Canceled"))
- QMessageBox::critical(nullptr, QObject::tr("Failed to set up instance"), e.what());
- return 1;
- }
- application.setProperty("dataPath", dataPath);
-
- // initialize dump collection only after "dataPath" since the crashes are stored under it
- prevUnhandledExceptionFilter = SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
-
- LogBuffer::init(1000, QtDebugMsg, qApp->property("dataPath").toString() + "/logs/mo_interface.log");
-
- QString splash = dataPath + "/splash.png";
- if (!QFile::exists(dataPath + "/splash.png")) {
- splash = ":/MO/gui/splash";
- }
-
- int result = runApplication(application, instance, splash);
- if (result != INT_MAX) {
- return result;
- }
- argc = 1;
- moshortcut = MOShortcut("");
- } while (true);
-}
+/*
+Copyright (C) 2012 Sebastian Herbord. All rights reserved.
+
+This file is part of Mod Organizer.
+
+Mod Organizer is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Mod Organizer is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifdef LEAK_CHECK_WITH_VLD
+#include <wchar.h>
+#include <vld.h>
+#endif // LEAK_CHECK_WITH_VLD
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <DbgHelp.h>
+
+#include <appconfig.h>
+#include <utility.h>
+#include <scopeguard.h>
+#include "mainwindow.h"
+#include <report.h>
+#include "modlist.h"
+#include "profile.h"
+#include "spawn.h"
+#include "executableslist.h"
+#include "singleinstance.h"
+#include "utility.h"
+#include "helper.h"
+#include "logbuffer.h"
+#include "selectiondialog.h"
+#include "moapplication.h"
+#include "tutorialmanager.h"
+#include "nxmaccessmanager.h"
+#include "instancemanager.h"
+#include "moshortcut.h"
+#include "organizercore.h"
+
+#include <eh.h>
+#include <windows_error.h>
+#include <usvfs.h>
+
+#include <QApplication>
+#include <QPushButton>
+#include <QListWidget>
+#include <QComboBox>
+#include <QCheckBox>
+#include <QDir>
+#include <QFileInfo>
+#include <QSettings>
+#include <QWhatsThis>
+#include <QToolBar>
+#include <QFileDialog>
+#include <QDesktopServices>
+#include <QMessageBox>
+#include <QSharedMemory>
+#include <QBuffer>
+#include <QSplashScreen>
+#include <QDirIterator>
+#include <QDesktopServices>
+#include <QLibraryInfo>
+#include <QSslSocket>
+#include <QtPlatformHeaders/QWindowsWindowFunctions>
+
+#include <boost/scoped_array.hpp>
+
+#include <ShellAPI.h>
+
+#include <cstdarg>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+
+#pragma comment(linker, "/manifestDependency:\"name='dlls' processorArchitecture='x86' version='1.0.0.0' type='win32' \"")
+
+
+using namespace MOBase;
+using namespace MOShared;
+
+bool createAndMakeWritable(const std::wstring &subPath) {
+ QString const dataPath = qApp->property("dataPath").toString();
+ QString fullPath = dataPath + "/" + QString::fromStdWString(subPath);
+
+ if (!QDir(fullPath).exists() && !QDir().mkdir(fullPath)) {
+ QMessageBox::critical(nullptr, QObject::tr("Error"),
+ QObject::tr("Failed to create \"%1\". Your user "
+ "account probably lacks permission.")
+ .arg(fullPath));
+ return false;
+ } else {
+ return true;
+ }
+}
+
+bool bootstrap()
+{
+ // remove the temporary backup directory in case we're restarting after an update
+ QString backupDirectory = qApp->applicationDirPath() + "/update_backup";
+ if (QDir(backupDirectory).exists()) {
+ shellDelete(QStringList(backupDirectory));
+ }
+
+ // cycle logfile
+ removeOldFiles(qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::logPath()),
+ "usvfs*.log", 5, QDir::Name);
+
+ if (!createAndMakeWritable(AppConfig::logPath())) {
+ return false;
+ }
+
+ return true;
+}
+
+LPTOP_LEVEL_EXCEPTION_FILTER prevUnhandledExceptionFilter = nullptr;
+
+static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs)
+{
+ const std::wstring& dumpPath = OrganizerCore::crashDumpsPath();
+ int dumpRes =
+ CreateMiniDump(exceptionPtrs, OrganizerCore::getGlobalCrashDumpsType(), dumpPath.c_str());
+ if (!dumpRes)
+ qCritical("ModOrganizer has crashed, crash dump created.");
+ else
+ qCritical("ModOrganizer has crashed, CreateMiniDump failed (%d, error %lu).", dumpRes, GetLastError());
+
+ if (prevUnhandledExceptionFilter)
+ return prevUnhandledExceptionFilter(exceptionPtrs);
+ else
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+
+// Parses the first parseArgCount arguments of the current process command line and returns
+// them in parsedArgs, the rest of the command line is returned untouched.
+LPCWSTR UntouchedCommandLineArguments(int parseArgCount, std::vector<std::wstring>& parsedArgs)
+{
+ LPCWSTR cmd = GetCommandLineW();
+ LPCWSTR arg = nullptr; // to skip executable name
+ for (; parseArgCount >= 0 && *cmd; ++cmd)
+ {
+ if (*cmd == '"') {
+ int escaped = 0;
+ for (++cmd; *cmd && (*cmd != '"' || escaped % 2 != 0); ++cmd)
+ escaped = *cmd == '\\' ? escaped + 1 : 0;
+ }
+ if (*cmd == ' ') {
+ if (arg)
+ if (cmd-1 > arg && *arg == '"' && *(cmd-1) == '"')
+ parsedArgs.push_back(std::wstring(arg+1, cmd-1));
+ else
+ parsedArgs.push_back(std::wstring(arg, cmd));
+ arg = cmd + 1;
+ --parseArgCount;
+ }
+ }
+ return cmd;
+}
+
+static int SpawnWaitProcess(LPCWSTR workingDirectory, LPCWSTR commandLine) {
+ PROCESS_INFORMATION pi{ 0 };
+ STARTUPINFO si{ 0 };
+ si.cb = sizeof(si);
+ std::wstring commandLineCopy = commandLine;
+
+ if (!CreateProcessW(NULL, &commandLineCopy[0], NULL, NULL, FALSE, 0, NULL, workingDirectory, &si, &pi)) {
+ // A bit of a problem where to log the error message here, at least this way you can get the message
+ // using a either DebugView or a live debugger:
+ std::wostringstream ost;
+ ost << L"CreateProcess failed: " << commandLine << ", " << GetLastError();
+ OutputDebugStringW(ost.str().c_str());
+ return -1;
+ }
+
+ WaitForSingleObject(pi.hProcess, INFINITE);
+
+ DWORD exitCode = (DWORD)-1;
+ ::GetExitCodeProcess(pi.hProcess, &exitCode);
+ CloseHandle(pi.hThread);
+ CloseHandle(pi.hProcess);
+ return static_cast<int>(exitCode);
+}
+
+static DWORD WaitForProcess() {
+
+}
+
+static bool HaveWriteAccess(const std::wstring &path)
+{
+ bool writable = false;
+
+ const static SECURITY_INFORMATION requestedFileInformation = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;
+
+ DWORD length = 0;
+ if (!::GetFileSecurityW(path.c_str(), requestedFileInformation, nullptr, 0UL, &length)
+ && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
+ std::string tempBuffer;
+ tempBuffer.reserve(length);
+ PSECURITY_DESCRIPTOR security = (PSECURITY_DESCRIPTOR)tempBuffer.data();
+ if (security
+ && ::GetFileSecurity(path.c_str(), requestedFileInformation, security, length, &length)) {
+ HANDLE token = nullptr;
+ const static DWORD tokenDesiredAccess = TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_DUPLICATE | STANDARD_RIGHTS_READ;
+ if (!::OpenThreadToken(::GetCurrentThread(), tokenDesiredAccess, TRUE, &token)) {
+ if (!::OpenProcessToken(::GetCurrentProcess(), tokenDesiredAccess, &token)) {
+ throw std::runtime_error("Unable to get any thread or process token");
+ }
+ }
+
+ HANDLE impersonatedToken = nullptr;
+ if (::DuplicateToken(token, SecurityImpersonation, &impersonatedToken)) {
+ GENERIC_MAPPING mapping = { 0xFFFFFFFF };
+ mapping.GenericRead = FILE_GENERIC_READ;
+ mapping.GenericWrite = FILE_GENERIC_WRITE;
+ mapping.GenericExecute = FILE_GENERIC_EXECUTE;
+ mapping.GenericAll = FILE_ALL_ACCESS;
+
+ DWORD genericAccessRights = FILE_GENERIC_WRITE;
+ ::MapGenericMask(&genericAccessRights, &mapping);
+
+ PRIVILEGE_SET privileges = { 0 };
+ DWORD grantedAccess = 0;
+ DWORD privilegesLength = sizeof(privileges);
+ BOOL result = 0;
+ if (::AccessCheck(security, impersonatedToken, genericAccessRights, &mapping, &privileges, &privilegesLength, &grantedAccess, &result)) {
+ writable = result != 0;
+ }
+ ::CloseHandle(impersonatedToken);
+ }
+
+ ::CloseHandle(token);
+ }
+ }
+ return writable;
+}
+
+
+QString determineProfile(QStringList &arguments, const QSettings &settings)
+{
+ QString selectedProfileName = QString::fromUtf8(settings.value("selected_profile", "").toByteArray());
+ { // see if there is a profile on the command line
+ int profileIndex = arguments.indexOf("-p", 1);
+ if ((profileIndex != -1) && (profileIndex < arguments.size() - 1)) {
+ qDebug("profile overwritten on command line");
+ selectedProfileName = arguments.at(profileIndex + 1);
+ }
+ arguments.removeAt(profileIndex);
+ arguments.removeAt(profileIndex);
+ }
+ if (selectedProfileName.isEmpty()) {
+ qDebug("no configured profile");
+ selectedProfileName = "Default";
+ } else {
+ qDebug("configured profile: %s", qUtf8Printable(selectedProfileName));
+ }
+
+ return selectedProfileName;
+}
+
+MOBase::IPluginGame *selectGame(QSettings &settings, QDir const &gamePath, MOBase::IPluginGame *game)
+{
+ settings.setValue("gameName", game->gameName());
+ //Sadly, hookdll needs gamePath in order to run. So following code block is
+ //commented out
+ /*if (gamePath == game->gameDirectory()) {
+ settings.remove("gamePath");
+ } else*/ {
+ QString gameDir = gamePath.absolutePath();
+ game->setGamePath(gameDir);
+ settings.setValue("gamePath", QDir::toNativeSeparators(gameDir).toUtf8().constData());
+ }
+ return game; //Woot
+}
+
+
+MOBase::IPluginGame *determineCurrentGame(QString const &moPath, QSettings &settings, PluginContainer const &plugins)
+{
+ //Determine what game we are running where. Be very paranoid in case the
+ //user has done something odd.
+ //If the game name has been set up, use that.
+ QString gameName = settings.value("gameName", "").toString();
+ if (!gameName.isEmpty()) {
+ MOBase::IPluginGame *game = plugins.managedGame(gameName);
+ if (game == nullptr) {
+ reportError(QObject::tr("Plugin to handle %1 no longer installed").arg(gameName));
+ return nullptr;
+ }
+ QString gamePath = QString::fromUtf8(settings.value("gamePath", "").toByteArray());
+ if (gamePath == "") {
+ gamePath = game->gameDirectory().absolutePath();
+ }
+ QDir gameDir(gamePath);
+ if (game->looksValid(gameDir)) {
+ return selectGame(settings, gameDir, game);
+ }
+ }
+
+ //gameName wasn't set, or otherwise can't be found. Try looking through all
+ //the plugins using the gamePath
+ QString gamePath = QString::fromUtf8(settings.value("gamePath", "").toByteArray());
+ if (!gamePath.isEmpty()) {
+ QDir gameDir(gamePath);
+ //Look to see if one of the installed games binary file exists in the current
+ //game directory.
+ for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
+ if (game->looksValid(gameDir)) {
+ return selectGame(settings, gameDir, game);
+ }
+ }
+ }
+
+ //The following code would try to determine the right game to mange but it would usually find the wrong one
+ //so it was commented out.
+ /*
+ //OK, we are in a new setup or existing info is useless.
+ //See if MO has been installed inside a game directory
+ for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
+ if (game->isInstalled() && moPath.startsWith(game->gameDirectory().absolutePath())) {
+ //Found it.
+ return selectGame(settings, game->gameDirectory(), game);
+ }
+ }
+
+ //Try walking up the directory tree to see if MO has been installed inside a game
+ {
+ QDir gameDir(moPath);
+ do {
+ //Look to see if one of the installed games binary file exists in the current
+ //directory.
+ for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
+ if (game->looksValid(gameDir)) {
+ return selectGame(settings, gameDir, game);
+ }
+ }
+ //OK, chop off the last directory and try again
+ } while (gameDir.cdUp());
+ }
+ */
+
+ //Then try a selection dialogue.
+ if (!gamePath.isEmpty() || !gameName.isEmpty()) {
+ reportError(QObject::tr("Could not use configuration settings for game \"%1\", path \"%2\".").
+ arg(gameName).arg(gamePath));
+ }
+
+ SelectionDialog selection(QObject::tr("Please select the game to manage"), nullptr, QSize(32, 32));
+
+ for (IPluginGame *game : plugins.plugins<IPluginGame>()) {
+ if (game->isInstalled()) {
+ QString path = game->gameDirectory().absolutePath();
+ selection.addChoice(game->gameIcon(), game->gameName(), path, QVariant::fromValue(game));
+ }
+ }
+
+ selection.addChoice(QString("Browse..."), QString(), QVariant::fromValue(static_cast<IPluginGame *>(nullptr)));
+
+ while (selection.exec() != QDialog::Rejected) {
+ IPluginGame * game = selection.getChoiceData().value<IPluginGame *>();
+ if (game != nullptr) {
+ return selectGame(settings, game->gameDirectory(), game);
+ }
+
+ gamePath = QFileDialog::getExistingDirectory(
+ nullptr, QObject::tr("Please select the game to manage"), QString(),
+ QFileDialog::ShowDirsOnly);
+
+ if (!gamePath.isEmpty()) {
+ QDir gameDir(gamePath);
+ QList<IPluginGame *> possibleGames;
+ for (IPluginGame * const game : plugins.plugins<IPluginGame>()) {
+ if (game->looksValid(gameDir)) {
+ possibleGames.append(game);
+ //return selectGame(settings, gameDir, game);
+ }
+ }
+ if (possibleGames.count() > 1) {
+ SelectionDialog browseSelection(QObject::tr("Please select the game to manage"), nullptr, QSize(32, 32));
+ for (IPluginGame *game : possibleGames) {
+ QString path = game->gameDirectory().absolutePath();
+ browseSelection.addChoice(game->gameIcon(), game->gameName(), path, QVariant::fromValue(game));
+ }
+ if (browseSelection.exec() == QDialog::Accepted) {
+ return selectGame(settings, gameDir, browseSelection.getChoiceData().value<IPluginGame *>());
+ } else {
+ reportError(QObject::tr("Canceled finding game in \"%1\".").arg(gamePath));
+ }
+ } else if(possibleGames.count() == 1) {
+ return selectGame(settings, gameDir, possibleGames[0]);
+ } else {
+ reportError(QObject::tr("No game identified in \"%1\". The directory is required to contain "
+ "the game binary.").arg(gamePath));
+ }
+ }
+ }
+
+ return nullptr;
+}
+
+
+// extend path to include dll directory so plugins don't need a manifest
+// (using AddDllDirectory would be an alternative to this but it seems fairly
+// complicated esp.
+// since it isn't easily accessible on Windows < 8
+// SetDllDirectory replaces other search directories and this seems to
+// propagate to child processes)
+void setupPath()
+{
+ static const int BUFSIZE = 4096;
+
+ qDebug("MO at: %s", qUtf8Printable(QDir::toNativeSeparators(
+ QCoreApplication::applicationDirPath())));
+
+ QCoreApplication::setLibraryPaths(QStringList(QCoreApplication::applicationDirPath() + "/dlls") + QCoreApplication::libraryPaths());
+
+ boost::scoped_array<TCHAR> oldPath(new TCHAR[BUFSIZE]);
+ DWORD offset = ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), BUFSIZE);
+ if (offset > BUFSIZE) {
+ oldPath.reset(new TCHAR[offset]);
+ ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), offset);
+ }
+
+ std::wstring newPath(ToWString(QDir::toNativeSeparators(
+ QCoreApplication::applicationDirPath())) + L"\\dlls");
+ newPath += L";";
+ newPath += oldPath.get();
+
+ ::SetEnvironmentVariableW(L"PATH", newPath.c_str());
+}
+
+static void preloadSsl()
+{
+ QString appPath = QDir::toNativeSeparators(QCoreApplication::applicationDirPath());
+ if (GetModuleHandleA("libeay32.dll"))
+ qWarning("libeay32.dll already loaded?!");
+ else {
+ QString libeay32 = appPath + "\\libeay32.dll";
+ if (!QFile::exists(libeay32))
+ qWarning("libeay32.dll not found: %s", qUtf8Printable(libeay32));
+ else if (!LoadLibraryW(libeay32.toStdWString().c_str()))
+ qWarning("failed to load: %s, %d", qUtf8Printable(libeay32), GetLastError());
+ }
+ if (GetModuleHandleA("ssleay32.dll"))
+ qWarning("ssleay32.dll already loaded?!");
+ else {
+ QString ssleay32 = appPath + "\\ssleay32.dll";
+ if (!QFile::exists(ssleay32))
+ qWarning("ssleay32.dll not found: %s", qUtf8Printable(ssleay32));
+ else if (!LoadLibraryW(ssleay32.toStdWString().c_str()))
+ qWarning("failed to load: %s, %d", qUtf8Printable(ssleay32), GetLastError());
+ }
+}
+
+static QString getVersionDisplayString()
+{
+ return createVersionInfo().displayString(3);
+}
+
+int runApplication(MOApplication &application, SingleInstance &instance,
+ const QString &splashPath)
+{
+
+ qDebug("Starting Mod Organizer version %s revision %s", qUtf8Printable(getVersionDisplayString()),
+#if defined(HGID)
+ HGID
+#elif defined(GITID)
+ GITID
+#else
+ "unknown"
+#endif
+ );
+
+#if !defined(QT_NO_SSL)
+ preloadSsl();
+ qDebug("ssl support: %d", QSslSocket::supportsSsl());
+#else
+ qDebug("non-ssl build");
+#endif
+
+ QString dataPath = application.property("dataPath").toString();
+ qDebug("data path: %s", qUtf8Printable(dataPath));
+
+ if (!bootstrap()) {
+ reportError("failed to set up data paths");
+ return 1;
+ }
+
+ QWindowsWindowFunctions::setWindowActivationBehavior(QWindowsWindowFunctions::AlwaysActivateWindow);
+
+ QStringList arguments = application.arguments();
+
+ try {
+ qDebug("Working directory: %s", qUtf8Printable(QDir::toNativeSeparators(QDir::currentPath())));
+
+ QSettings settings(dataPath + "/"
+ + QString::fromStdWString(AppConfig::iniFileName()),
+ QSettings::IniFormat);
+
+ // global crashDumpType sits in OrganizerCore to make a bit less ugly to update it when the settings are changed during runtime
+ OrganizerCore::setGlobalCrashDumpsType(settings.value("Settings/crash_dumps_type", static_cast<int>(CrashDumpsType::Mini)).toInt());
+
+ qDebug("Loaded settings:");
+ settings.beginGroup("Settings");
+ for (auto k : settings.allKeys())
+ if (!k.contains("username") && !k.contains("password") && !k.contains("nexus_api_key"))
+ qDebug(" %s=%s", k.toUtf8().data(), settings.value(k).toString().toUtf8().data());
+ settings.endGroup();
+
+
+ qDebug("initializing core");
+ OrganizerCore organizer(settings);
+ if (!organizer.bootstrap()) {
+ reportError("failed to set up data paths");
+ return 1;
+ }
+ qDebug("initialize plugins");
+ PluginContainer pluginContainer(&organizer);
+ pluginContainer.loadPlugins();
+
+ MOBase::IPluginGame *game = determineCurrentGame(
+ application.applicationDirPath(), settings, pluginContainer);
+ if (game == nullptr) {
+ return 1;
+ }
+ if (splashPath.startsWith(':')) {
+ // currently using MO splash, see if the plugin contains one
+ QString pluginSplash
+ = QString(":/%1/splash").arg(game->gameShortName());
+ QImage image(pluginSplash);
+ if (!image.isNull()) {
+ image.save(dataPath + "/splash.png");
+ } else {
+ qDebug("no plugin splash");
+ }
+ }
+
+ organizer.setManagedGame(game);
+ organizer.createDefaultProfile();
+
+ if (!settings.contains("game_edition")) {
+ QStringList editions = game->gameVariants();
+ if (editions.size() > 1) {
+ SelectionDialog selection(
+ QObject::tr("Please select the game edition you have (MO can't "
+ "start the game correctly if this is set "
+ "incorrectly!)"),
+ nullptr);
+ selection.setWindowFlag(Qt::WindowStaysOnTopHint, true);
+ int index = 0;
+ for (const QString &edition : editions) {
+ selection.addChoice(edition, "", index++);
+ }
+ if (selection.exec() == QDialog::Rejected) {
+ return 1;
+ } else {
+ settings.setValue("game_edition", selection.getChoiceString());
+ }
+ }
+ }
+ game->setGameVariant(settings.value("game_edition").toString());
+
+ qDebug("managing game at %s", qUtf8Printable(QDir::toNativeSeparators(
+ game->gameDirectory().absolutePath())));
+
+ organizer.updateExecutablesList(settings);
+
+ QString selectedProfileName = determineProfile(arguments, settings);
+ organizer.setCurrentProfile(selectedProfileName);
+
+ // if we have a command line parameter, it is either a nxm link or
+ // a binary to start
+ if (arguments.size() > 1) {
+ if (MOShortcut shortcut{ arguments.at(1) }) {
+ if (shortcut.hasExecutable()) {
+ try {
+ organizer.runShortcut(shortcut);
+ return 0;
+ }
+ catch (const std::exception &e) {
+ reportError(
+ QObject::tr("failed to start shortcut: %1").arg(e.what()));
+ return 1;
+ }
+ }
+ }
+ else if (OrganizerCore::isNxmLink(arguments.at(1))) {
+ qDebug("starting download from command line: %s",
+ qUtf8Printable(arguments.at(1)));
+ organizer.externalMessage(arguments.at(1));
+ }
+ else {
+ QString exeName = arguments.at(1);
+ qDebug("starting %s from command line", qUtf8Printable(exeName));
+ arguments.removeFirst(); // remove application name (ModOrganizer.exe)
+ arguments.removeFirst(); // remove binary name
+ // pass the remaining parameters to the binary
+ try {
+ organizer.startApplication(exeName, arguments, QString(), QString());
+ return 0;
+ }
+ catch (const std::exception &e) {
+ reportError(
+ QObject::tr("failed to start application: %1").arg(e.what()));
+ return 1;
+ }
+ }
+ }
+
+ QPixmap pixmap(splashPath);
+ QSplashScreen splash(pixmap);
+ splash.show();
+ splash.activateWindow();
+
+ QString apiKey;
+ if (organizer.settings().getNexusApiKey(apiKey)) {
+ NexusInterface::instance(&pluginContainer)->getAccessManager()->apiCheck(apiKey);
+ }
+
+ qDebug("initializing tutorials");
+ TutorialManager::init(
+ qApp->applicationDirPath() + "/"
+ + QString::fromStdWString(AppConfig::tutorialsPath()) + "/",
+ &organizer);
+
+ if (!application.setStyleFile(settings.value("Settings/style", "").toString())) {
+ // disable invalid stylesheet
+ settings.setValue("Settings/style", "");
+ }
+
+ int res = 1;
+ { // scope to control lifetime of mainwindow
+ // set up main window and its data structures
+ MainWindow mainWindow(settings, organizer, pluginContainer);
+
+ QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application,
+ SLOT(setStyleFile(QString)));
+ QObject::connect(&instance, SIGNAL(messageSent(QString)), &organizer,
+ SLOT(externalMessage(QString)));
+
+ mainWindow.processUpdates();
+ mainWindow.readSettings();
+
+ qDebug("displaying main window");
+ mainWindow.show();
+ mainWindow.activateWindow();
+
+ splash.finish(&mainWindow);
+ return application.exec();
+ }
+ } catch (const std::exception &e) {
+ reportError(e.what());
+ return 1;
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ //Should allow for better scaling of ui with higher resolution displays
+ QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+
+ if (argc >= 4) {
+ std::vector<std::wstring> arg;
+ auto args = UntouchedCommandLineArguments(2, arg);
+ if (arg[0] == L"launch")
+ return SpawnWaitProcess(arg[1].c_str(), args);
+ }
+
+ MOApplication application(argc, argv);
+ QStringList arguments = application.arguments();
+
+ setupPath();
+
+ bool forcePrimary = false;
+ if (arguments.contains("update")) {
+ arguments.removeAll("update");
+ forcePrimary = true;
+ }
+
+ MOShortcut moshortcut{ arguments.size() > 1 ? arguments.at(1) : "" };
+
+ SingleInstance instance(forcePrimary);
+ if (!instance.primaryInstance()) {
+ if (moshortcut ||
+ arguments.size() > 1 && OrganizerCore::isNxmLink(arguments.at(1)))
+ {
+ qDebug("not primary instance, sending shortcut/download message");
+ instance.sendMessage(arguments.at(1));
+ return 0;
+ } else if (arguments.size() == 1) {
+ QMessageBox::information(
+ nullptr, QObject::tr("Mod Organizer"),
+ QObject::tr("An instance of Mod Organizer is already running"));
+ return 0;
+ }
+ } // we continue for the primary instance OR if MO was called with parameters
+
+ do {
+ QString dataPath;
+
+ try {
+ InstanceManager& instanceManager = InstanceManager::instance();
+ if (moshortcut && moshortcut.hasInstance())
+ instanceManager.overrideInstance(moshortcut.instance());
+ dataPath = instanceManager.determineDataPath();
+ } catch (const std::exception &e) {
+ if (strcmp(e.what(),"Canceled"))
+ QMessageBox::critical(nullptr, QObject::tr("Failed to set up instance"), e.what());
+ return 1;
+ }
+ application.setProperty("dataPath", dataPath);
+
+ // initialize dump collection only after "dataPath" since the crashes are stored under it
+ prevUnhandledExceptionFilter = SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
+
+ LogBuffer::init(1000, QtDebugMsg, qApp->property("dataPath").toString() + "/logs/mo_interface.log");
+
+ QString splash = dataPath + "/splash.png";
+ if (!QFile::exists(dataPath + "/splash.png")) {
+ splash = ":/MO/gui/splash";
+ }
+
+ int result = runApplication(application, instance, splash);
+ if (result != INT_MAX) {
+ return result;
+ }
+ argc = 1;
+ moshortcut = MOShortcut("");
+ } while (true);
+}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index add1ef7f..9003d6b2 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -392,8 +392,8 @@ MainWindow::MainWindow(QSettings &initSettings
connect(NexusInterface::instance(&pluginContainer), SIGNAL(requestNXMDownload(QString)), &m_OrganizerCore, SLOT(downloadRequestedNXM(QString)));
connect(NexusInterface::instance(&pluginContainer), SIGNAL(nxmDownloadURLsAvailable(QString,int,int,QVariant,QVariant,int)), this, SLOT(nxmDownloadURLs(QString,int,int,QVariant,QVariant,int)));
- connect(NexusInterface::instance(&pluginContainer), SIGNAL(needLogin()), &m_OrganizerCore, SLOT(nexusLogin()));
- connect(NexusInterface::instance(&pluginContainer)->getAccessManager(), SIGNAL(loginFailed(QString)), this, SLOT(loginFailed(QString)));
+ connect(NexusInterface::instance(&pluginContainer), SIGNAL(needLogin()), &m_OrganizerCore, SLOT(nexusApi()));
+ connect(NexusInterface::instance(&pluginContainer)->getAccessManager(), SIGNAL(validateFailed(QString)), this, SLOT(validationFailed(QString)));
connect(NexusInterface::instance(&pluginContainer)->getAccessManager(), SIGNAL(credentialsReceived(const QString&, bool)),
this, SLOT(updateWindowTitle(const QString&, bool)));
@@ -2695,7 +2695,7 @@ void MainWindow::endorseMod(ModInfo::Ptr mod)
} else {
QString apiKey;
if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- m_OrganizerCore.doAfterLogin(boost::bind(&MainWindow::endorseMod, this, mod));
+ m_OrganizerCore.doAfterLogin([&]() { this->endorseMod(mod); });
NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
} else {
MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
@@ -2708,21 +2708,21 @@ void MainWindow::endorse_clicked()
{
QItemSelectionModel *selection = ui->modList->selectionModel();
if (selection->hasSelection() && selection->selectedRows().count() > 1) {
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->loggedIn()) {
+ if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
MessageDialog::showMessage(tr("Endorsing multiple mods will take a while. Please wait..."), this);
for (QModelIndex idx : selection->selectedRows()) {
ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(true);
}
}
else {
- QString username, password;
- if (m_OrganizerCore.settings().getNexusLogin(username, password)) {
+ QString apiKey;
+ if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
MessageDialog::showMessage(tr("Endorsing multiple mods will take a while. Please wait..."), this);
for (QModelIndex idx : selection->selectedRows()) {
ModInfo::Ptr modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
- m_OrganizerCore.doAfterLogin(boost::bind(&MainWindow::endorseMod, this, modInfo));
+ m_OrganizerCore.doAfterLogin([&]() { this->endorseMod(modInfo); });
}
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->login(username, password);
+ NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
} else {
MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
return;
@@ -2750,12 +2750,12 @@ void MainWindow::dontendorse_clicked()
void MainWindow::unendorseMod(ModInfo::Ptr mod)
{
- QString apiKey;
if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
ModInfo::getByIndex(m_ContextRow)->endorse(false);
} else {
+ QString apiKey;
if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- m_OrganizerCore.doAfterLogin([this] () { this->unendorse_clicked(); });
+ m_OrganizerCore.doAfterLogin([&]() { this->unendorseMod(mod); });
NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
} else {
MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
@@ -2768,21 +2768,20 @@ void MainWindow::unendorse_clicked()
{
QItemSelectionModel *selection = ui->modList->selectionModel();
if (selection->hasSelection() && selection->selectedRows().count() > 1) {
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->loggedIn()) {
+ if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
MessageDialog::showMessage(tr("Unendorsing multiple mods will take a while. Please wait..."), this);
for (QModelIndex idx : selection->selectedRows()) {
ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(false);
}
- }
- else {
- QString username, password;
- if (m_OrganizerCore.settings().getNexusLogin(username, password)) {
+ } else {
+ QString apiKey;
+ if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
MessageDialog::showMessage(tr("Unendorsing multiple mods will take a while. Please wait..."), this);
for (QModelIndex idx : selection->selectedRows()) {
ModInfo::Ptr modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
- m_OrganizerCore.doAfterLogin(boost::bind(&MainWindow::unendorseMod, this, modInfo));
+ m_OrganizerCore.doAfterLogin([&]() { this->unendorseMod(modInfo); });
}
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->login(username, password);
+ NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
} else {
MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
return;
@@ -2794,9 +2793,9 @@ void MainWindow::unendorse_clicked()
}
}
-void MainWindow::loginFailed(const QString &error)
+void MainWindow::validationFailed(const QString &error)
{
- qDebug("login failed: %s", qUtf8Printable(error));
+ qDebug("Nexus API validation failed: %s", qUtf8Printable(error));
statusBar()->hide();
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 0e39c613..caf94c0e 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -1,658 +1,658 @@
-/*
-Copyright (C) 2012 Sebastian Herbord. All rights reserved.
-
-This file is part of Mod Organizer.
-
-Mod Organizer is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Mod Organizer is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef MAINWINDOW_H
-#define MAINWINDOW_H
-
-#include "bsafolder.h"
-#include "browserdialog.h"
-#include "delayedfilewriter.h"
-#include "errorcodes.h"
-#include "imoinfo.h"
-#include "iuserinterface.h"
-#include "modinfo.h"
-#include "modlistsortproxy.h"
-#include "savegameinfo.h"
-#include "tutorialcontrol.h"
-
-//Note the commented headers here can be replaced with forward references,
-//when I get round to cleaning up main.cpp
-struct Executable;
-class CategoryFactory;
-class LockedDialogBase;
-class OrganizerCore;
-#include "plugincontainer.h" //class PluginContainer;
-class PluginListSortProxy;
-namespace BSA { class Archive; }
-#include "iplugingame.h" //namespace MOBase { class IPluginGame; }
-namespace MOBase { class IPluginModPage; }
-namespace MOBase { class IPluginTool; }
-namespace MOBase { class ISaveGame; }
-
-namespace MOShared { class DirectoryEntry; }
-
-#include <QByteArray>
-#include <QDir>
-#include <QFileInfo>
-#include <QFileSystemWatcher>
-#include <QList>
-#include <QMainWindow>
-#include <QObject>
-#include <QPersistentModelIndex>
-#include <QProcess>
-#include <QString>
-#include <QStringList>
-#include <QTime>
-#include <QTimer>
-#include <QHeaderView>
-#include <QVariant>
-#include <Qt>
-#include <QtConcurrent/QtConcurrentRun>
-
-class QAction;
-class QAbstractItemModel;
-class QDateTime;
-class QEvent;
-class QFile;
-class QListWidgetItem;
-class QMenu;
-class QModelIndex;
-class QPoint;
-class QProgressBar;
-class QProgressDialog;
-class QTranslator;
-class QTreeWidgetItem;
-class QUrl;
-class QSettings;
-class QWidget;
-
-#ifndef Q_MOC_RUN
-#include <boost/signals2.hpp>
-#endif
-
-//Sigh - just for HANDLE
-#define WIN32_LEAN_AND_MEAN
-#include <Windows.h>
-
-#include <functional>
-#include <set>
-#include <string>
-#include <vector>
-
-namespace Ui {
- class MainWindow;
-}
-
-
-
-class MainWindow : public QMainWindow, public IUserInterface
-{
- Q_OBJECT
-
- friend class OrganizerProxy;
-
-public:
-
- explicit MainWindow(QSettings &initSettings,
- OrganizerCore &organizerCore, PluginContainer &pluginContainer,
- QWidget *parent = 0);
- ~MainWindow();
-
- void storeSettings(QSettings &settings) override;
- void readSettings();
- void processUpdates();
-
- virtual ILockedWaitingForProcess* lock() override;
- virtual void unlock() override;
-
- bool addProfile();
- void updateBSAList(const QStringList &defaultArchives, const QStringList &activeArchives);
- void refreshDataTree();
- void refreshDataTreeKeepExpandedNodes();
- void refreshSaveList();
-
- void setModListSorting(int index);
- void setESPListSorting(int index);
-
- void saveArchiveList();
-
- void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr);
- void registerPluginTools(std::vector<MOBase::IPluginTool *> toolPlugins);
- void registerModPage(MOBase::IPluginModPage *modPage);
-
- void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info);
-
- void createStdoutPipe(HANDLE *stdOutRead, HANDLE *stdOutWrite);
- std::string readFromPipe(HANDLE stdOutRead);
- void processLOOTOut(const std::string &lootOut, std::string &errorMessages, QProgressDialog &dialog);
-
- void updateModInDirectoryStructure(unsigned int index, ModInfo::Ptr modInfo);
-
- QString getOriginDisplayName(int originID);
-
- void installTranslator(const QString &name);
-
- virtual void disconnectPlugins();
-
- void displayModInformation(ModInfo::Ptr modInfo, unsigned int index, int tab);
-
- virtual bool closeWindow();
- virtual void setWindowEnabled(bool enabled);
-
- virtual MOBase::DelayedFileWriterBase &archivesWriter() override { return m_ArchiveListWriter; }
-
-public slots:
-
- void displayColumnSelection(const QPoint &pos);
-
- void modorder_changed();
- void esplist_changed();
- void refresher_progress(int percent);
- void directory_refreshed();
-
- void toolPluginInvoke();
- void modPagePluginInvoke();
-
-signals:
-
- /**
- * @brief emitted after the information dialog has been closed
- */
- void modInfoDisplayed();
-
- /**
- * @brief emitted when the selected style changes
- */
- void styleChanged(const QString &styleFile);
-
-
- void modListDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
-
-protected:
-
- virtual void showEvent(QShowEvent *event);
- virtual void closeEvent(QCloseEvent *event);
- virtual bool eventFilter(QObject *obj, QEvent *event);
- virtual void resizeEvent(QResizeEvent *event);
- virtual void dragEnterEvent(QDragEnterEvent *event);
- virtual void dropEvent(QDropEvent *event);
-
-private slots:
- void on_actionChange_Game_triggered();
-
-private slots:
- void on_clickBlankButton_clicked();
-
-private:
-
- void cleanup();
-
- void actionToToolButton(QAction *&sourceAction);
-
- void updateToolBar();
- void activateSelectedProfile();
-
- void setExecutableIndex(int index);
-
- void startSteam();
-
- void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon);
- bool refreshProfiles(bool selectProfile = true);
- void refreshExecutablesList();
- void installMod(QString fileName = "");
-
- QList<MOBase::IOrganizer::FileInfo> findFileInfos(const QString &path, const std::function<bool (const MOBase::IOrganizer::FileInfo &)> &filter) const;
-
- bool modifyExecutablesDialog();
- void displayModInformation(int row, int tab = -1);
- void testExtractBSA(int modIndex);
-
- void writeDataToFile(QFile &file, const QString &directory, const MOShared::DirectoryEntry &directoryEntry);
-
- void refreshFilters();
-
- /**
- * Sets category selections from menu; for multiple mods, this will only apply
- * the changes made in the menu (which is the delta between the current menu selection and the reference mod)
- * @param menu the menu after editing by the user
- * @param modRow index of the mod to edit
- * @param referenceRow row of the reference mod
- */
- void addRemoveCategoriesFromMenu(QMenu *menu, int modRow, int referenceRow);
-
- /**
- * Sets category selections from menu; for multiple mods, this will completely
- * replace the current set of categories on each selected with those selected in the menu
- * @param menu the menu after editing by the user
- * @param modRow index of the mod to edit
- */
- void replaceCategoriesFromMenu(QMenu *menu, int modRow);
-
- bool populateMenuCategories(QMenu *menu, int targetID);
-
- void initDownloadView();
- void updateDownloadView();
-
- // remove invalid category-references from mods
- void fixCategories();
-
- void createEndorseWidget();
- void createHelpWidget();
-
- bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName);
-
- size_t checkForProblems();
-
- int getBinaryExecuteInfo(const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments);
- QTreeWidgetItem *addFilterItem(QTreeWidgetItem *root, const QString &name, int categoryID, ModListSortProxy::FilterType type);
- void addContentFilters();
- void addCategoryFilters(QTreeWidgetItem *root, const std::set<int> &categoriesUsed, int targetID);
-
- void setCategoryListVisible(bool visible);
-
- void displaySaveGameInfo(QListWidgetItem *newItem);
-
- HANDLE nextChildProcess();
-
- bool errorReported(QString &logFile);
-
- void updateESPLock(bool locked);
-
- static void setupNetworkProxy(bool activate);
- void activateProxy(bool activate);
- void setBrowserGeometry(const QByteArray &geometry);
-
- bool createBackup(const QString &filePath, const QDateTime &time);
- QString queryRestore(const QString &filePath);
-
- void initModListContextMenu(QMenu *menu);
- void addModSendToContextMenu(QMenu *menu);
- void addPluginSendToContextMenu(QMenu *menu);
-
- QMenu *openFolderMenu();
-
- std::set<QString> enabledArchives();
-
- void scheduleUpdateButton();
-
- QDir currentSavesDir() const;
-
- void startMonitorSaves();
- void stopMonitorSaves();
-
- void dropLocalFile(const QUrl &url, const QString &outputDir, bool move);
-
- bool registerWidgetState(const QString &name, QHeaderView *view, const char *oldSettingName = nullptr);
-
- void sendSelectedModsToPriority(int newPriority);
- void sendSelectedPluginsToPriority(int newPriority);
-
-private:
-
- static const char *PATTERN_BACKUP_GLOB;
- static const char *PATTERN_BACKUP_REGEX;
- static const char *PATTERN_BACKUP_DATE;
-
-private:
-
- Ui::MainWindow *ui;
-
- QAction *m_Sep; // Executable Shortcuts are added after this. Non owning.
-
- bool m_WasVisible;
-
- MOBase::TutorialControl m_Tutorial;
-
- int m_OldProfileIndex;
-
- std::vector<QString> m_ModNameList; // the mod-list to go with the directory structure
- QProgressBar *m_RefreshProgress;
- bool m_Refreshing;
-
- QStringList m_DefaultArchives;
-
- QAbstractItemModel *m_ModListGroupingProxy;
- ModListSortProxy *m_ModListSortProxy;
-
- PluginListSortProxy *m_PluginListSortProxy;
-
- int m_OldExecutableIndex;
-
- int m_ContextRow;
- QPersistentModelIndex m_ContextIdx;
- QTreeWidgetItem *m_ContextItem;
- QAction *m_ContextAction;
-
- CategoryFactory &m_CategoryFactory;
-
- int m_ModsToUpdate;
-
- bool m_LoginAttempted;
-
- QTimer m_CheckBSATimer;
- QTimer m_SaveMetaTimer;
- QTimer m_UpdateProblemsTimer;
-
- QFuture<void> m_MetaSave;
-
- QTime m_StartTime;
- //SaveGameInfoWidget *m_CurrentSaveView;
- MOBase::ISaveGameInfoWidget *m_CurrentSaveView;
-
- OrganizerCore &m_OrganizerCore;
- PluginContainer &m_PluginContainer;
-
- QString m_CurrentLanguage;
- std::vector<QTranslator*> m_Translators;
-
- BrowserDialog m_IntegratedBrowser;
-
- QFileSystemWatcher m_SavesWatcher;
-
- std::vector<QTreeWidgetItem*> m_RemoveWidget;
-
- QByteArray m_ArchiveListHash;
-
- bool m_DidUpdateMasterList;
-
- LockedDialogBase *m_LockDialog { nullptr };
- uint64_t m_LockCount { 0 };
-
- bool m_closing{ false };
-
- bool m_showArchiveData{ true };
-
- std::vector<std::pair<QString, QHeaderView*>> m_PersistedGeometry;
-
- MOBase::DelayedFileWriter m_ArchiveListWriter;
-
- enum class ShortcutType {
- Toolbar,
- Desktop,
- StartMenu
- };
-
- void addWindowsLink(ShortcutType const);
-
- Executable const &getSelectedExecutable() const;
- Executable &getSelectedExecutable();
-
-private slots:
-
- void updateWindowTitle(const QString &accountName, bool premium);
-
- void showMessage(const QString &message);
- void showError(const QString &message);
-
-
- // main window actions
- void helpTriggered();
- void issueTriggered();
- void wikiTriggered();
- void discordTriggered();
- void tutorialTriggered();
- void extractBSATriggered();
-
- //modlist shortcuts
- void openExplorer_activated();
- void refreshProfile_activated();
-
- // modlist context menu
- void installMod_clicked();
- void createEmptyMod_clicked();
- void createSeparator_clicked();
- void restoreBackup_clicked();
- void renameMod_clicked();
- void removeMod_clicked();
- void setColor_clicked();
- void resetColor_clicked();
- void backupMod_clicked();
- void reinstallMod_clicked();
- void endorse_clicked();
- void dontendorse_clicked();
- void unendorse_clicked();
- void ignoreMissingData_clicked();
- void markConverted_clicked();
- void visitOnNexus_clicked();
- void visitWebPage_clicked();
- void openExplorer_clicked();
- void openOriginExplorer_clicked();
- void openOriginInformation_clicked();
- void information_clicked();
- void enableSelectedMods_clicked();
- void disableSelectedMods_clicked();
- void sendSelectedModsToTop_clicked();
- void sendSelectedModsToBottom_clicked();
- void sendSelectedModsToPriority_clicked();
- void sendSelectedModsToSeparator_clicked();
- // savegame context menu
- void deleteSavegame_clicked();
- void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets);
- // data-tree context menu
- void writeDataToFile();
- void openDataFile();
- void addAsExecutable();
- void previewDataFile();
- void hideFile();
- void unhideFile();
-
- // pluginlist context menu
- void enableSelectedPlugins_clicked();
- void disableSelectedPlugins_clicked();
- void sendSelectedPluginsToTop_clicked();
- void sendSelectedPluginsToBottom_clicked();
- void sendSelectedPluginsToPriority_clicked();
-
- void linkToolbar();
- void linkDesktop();
- void linkMenu();
-
- void languageChange(const QString &newLanguage);
- void saveSelectionChanged(QListWidgetItem *newItem);
-
- void windowTutorialFinished(const QString &windowName);
-
- BSA::EErrorCode extractBSA(BSA::Archive &archive, BSA::Folder::Ptr folder, const QString &destination, QProgressDialog &extractProgress);
-
- void createModFromOverwrite();
- /**
- * @brief sends the content of the overwrite folder to an already existing mod
- */
- void moveOverwriteContentToExistingMod();
- /**
- * @brief actually sends the content of the overwrite folder to specified mod
- */
- void doMoveOverwriteContentToMod(const QString &modAbsolutePath);
- void clearOverwrite();
-
- void procError(QProcess::ProcessError error);
- void procFinished(int exitCode, QProcess::ExitStatus exitStatus);
-
- // nexus related
- void checkModsForUpdates();
-
- void loginFailed(const QString &message);
-
- void linkClicked(const QString &url);
-
- void updateAvailable();
-
- void motdReceived(const QString &motd);
- void notEndorsedYet();
- void wontEndorse();
-
- void originModified(int originID);
-
- void addRemoveCategories_MenuHandler();
- void replaceCategories_MenuHandler();
-
- void addPrimaryCategoryCandidates();
-
- void modDetailsUpdated(bool success);
-
- void modInstalled(const QString &modName);
-
- void nxmUpdatesAvailable(const std::vector<int> &modIDs, QVariant userData, QVariant resultData, int requestID);
- void nxmEndorsementToggled(QString, int, QVariant, QVariant resultData, int);
- void nxmDownloadURLs(QString, int modID, int fileID, QVariant userData, QVariant resultData, int requestID);
- void nxmRequestFailed(QString, int modID, int fileID, QVariant userData, int requestID, const QString &errorString);
-
- void editCategories();
- void deselectFilters();
-
- void displayModInformation(const QString &modName, int tab);
- void modOpenNext(int tab=-1);
- void modOpenPrev(int tab=-1);
-
- void modRenamed(const QString &oldName, const QString &newName);
- void modRemoved(const QString &fileName);
-
- void hideSaveGameInfo();
-
- void hookUpWindowTutorials();
-
- void resumeDownload(int downloadIndex);
- void endorseMod(ModInfo::Ptr mod);
- void unendorseMod(ModInfo::Ptr mod);
- void cancelModListEditor();
-
- void lockESPIndex();
- void unlockESPIndex();
-
- void enableVisibleMods();
- void disableVisibleMods();
- void exportModListCSV();
- void openInstanceFolder();
- void openLogsFolder();
- void openInstallFolder();
- void openPluginsFolder();
- void openDownloadsFolder();
- void openModsFolder();
- void openProfileFolder();
- void openIniFolder();
- void openGameFolder();
- void openMyGamesFolder();
- void startExeAction();
-
- void checkBSAList();
-
- void updateProblemsButton();
-
- void saveModMetas();
-
- void updateStyle(const QString &style);
-
- void modlistChanged(const QModelIndex &index, int role);
- void modlistChanged(const QModelIndexList &indicies, int role);
- void fileMoved(const QString &filePath, const QString &oldOriginName, const QString &newOriginName);
-
-
- void modFilterActive(bool active);
- void espFilterChanged(const QString &filter);
- void downloadFilterChanged(const QString &filter);
-
- void expandModList(const QModelIndex &index);
-
- /**
- * @brief resize columns in mod list and plugin list to content
- */
- void resizeLists(bool modListCustom, bool pluginListCustom);
-
- /**
- * @brief allow columns in mod list and plugin list to be resized
- */
- void allowListResize();
-
- void toolBar_customContextMenuRequested(const QPoint &point);
- void removeFromToolbar();
- void overwriteClosed(int);
-
- void changeVersioningScheme();
- void ignoreUpdate();
- void unignoreUpdate();
-
- void refreshSavesIfOpen();
- void expandDataTreeItem(QTreeWidgetItem *item);
- void about();
- void delayedRemove();
-
- void modlistSelectionChanged(const QModelIndex &current, const QModelIndex &previous);
- void modListSortIndicatorChanged(int column, Qt::SortOrder order);
- void modListSectionResized(int logicalIndex, int oldSize, int newSize);
-
- void modlistSelectionsChanged(const QItemSelection &current);
- void esplistSelectionsChanged(const QItemSelection &current);
-
- void search_activated();
- void searchClear_activated();
-
- void updateModCount();
- void updatePluginCount();
-
-private slots: // ui slots
- // actions
- void on_actionAdd_Profile_triggered();
- void on_actionInstallMod_triggered();
- void on_actionModify_Executables_triggered();
- void on_actionNexus_triggered();
- void on_actionNotifications_triggered();
- void on_actionSettings_triggered();
- void on_actionUpdate_triggered();
- void on_actionEndorseMO_triggered();
-
- void on_bsaList_customContextMenuRequested(const QPoint &pos);
- void on_clearFiltersButton_clicked();
- void on_btnRefreshData_clicked();
- void on_btnRefreshDownloads_clicked();
- void on_categoriesList_customContextMenuRequested(const QPoint &pos);
- void on_conflictsCheckBox_toggled(bool checked);
- void on_showArchiveDataCheckBox_toggled(bool checked);
- void on_dataTree_customContextMenuRequested(const QPoint &pos);
- void on_executablesListBox_currentIndexChanged(int index);
- void on_modList_customContextMenuRequested(const QPoint &pos);
- void on_modList_doubleClicked(const QModelIndex &index);
- void on_listOptionsBtn_pressed();
- void on_espList_doubleClicked(const QModelIndex &index);
- void on_profileBox_currentIndexChanged(int index);
- void on_savegameList_customContextMenuRequested(const QPoint &pos);
- void on_startButton_clicked();
- void on_tabWidget_currentChanged(int index);
-
- void on_espList_customContextMenuRequested(const QPoint &pos);
- void on_displayCategoriesBtn_toggled(bool checked);
- void on_groupCombo_currentIndexChanged(int index);
- void on_categoriesList_itemSelectionChanged();
- void on_linkButton_pressed();
- void on_showHiddenBox_toggled(bool checked);
- void on_bsaList_itemChanged(QTreeWidgetItem *item, int column);
- void on_bossButton_clicked();
-
- void on_saveButton_clicked();
- void on_restoreButton_clicked();
- void on_restoreModsButton_clicked();
- void on_saveModsButton_clicked();
- void on_actionCopy_Log_to_Clipboard_triggered();
- void on_categoriesAndBtn_toggled(bool checked);
- void on_categoriesOrBtn_toggled(bool checked);
- void on_managedArchiveLabel_linkHovered(const QString &link);
-};
-
-
-
-#endif // MAINWINDOW_H
+/*
+Copyright (C) 2012 Sebastian Herbord. All rights reserved.
+
+This file is part of Mod Organizer.
+
+Mod Organizer is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Mod Organizer is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include "bsafolder.h"
+#include "browserdialog.h"
+#include "delayedfilewriter.h"
+#include "errorcodes.h"
+#include "imoinfo.h"
+#include "iuserinterface.h"
+#include "modinfo.h"
+#include "modlistsortproxy.h"
+#include "savegameinfo.h"
+#include "tutorialcontrol.h"
+
+//Note the commented headers here can be replaced with forward references,
+//when I get round to cleaning up main.cpp
+struct Executable;
+class CategoryFactory;
+class LockedDialogBase;
+class OrganizerCore;
+#include "plugincontainer.h" //class PluginContainer;
+class PluginListSortProxy;
+namespace BSA { class Archive; }
+#include "iplugingame.h" //namespace MOBase { class IPluginGame; }
+namespace MOBase { class IPluginModPage; }
+namespace MOBase { class IPluginTool; }
+namespace MOBase { class ISaveGame; }
+
+namespace MOShared { class DirectoryEntry; }
+
+#include <QByteArray>
+#include <QDir>
+#include <QFileInfo>
+#include <QFileSystemWatcher>
+#include <QList>
+#include <QMainWindow>
+#include <QObject>
+#include <QPersistentModelIndex>
+#include <QProcess>
+#include <QString>
+#include <QStringList>
+#include <QTime>
+#include <QTimer>
+#include <QHeaderView>
+#include <QVariant>
+#include <Qt>
+#include <QtConcurrent/QtConcurrentRun>
+
+class QAction;
+class QAbstractItemModel;
+class QDateTime;
+class QEvent;
+class QFile;
+class QListWidgetItem;
+class QMenu;
+class QModelIndex;
+class QPoint;
+class QProgressBar;
+class QProgressDialog;
+class QTranslator;
+class QTreeWidgetItem;
+class QUrl;
+class QSettings;
+class QWidget;
+
+#ifndef Q_MOC_RUN
+#include <boost/signals2.hpp>
+#endif
+
+//Sigh - just for HANDLE
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+
+#include <functional>
+#include <set>
+#include <string>
+#include <vector>
+
+namespace Ui {
+ class MainWindow;
+}
+
+
+
+class MainWindow : public QMainWindow, public IUserInterface
+{
+ Q_OBJECT
+
+ friend class OrganizerProxy;
+
+public:
+
+ explicit MainWindow(QSettings &initSettings,
+ OrganizerCore &organizerCore, PluginContainer &pluginContainer,
+ QWidget *parent = 0);
+ ~MainWindow();
+
+ void storeSettings(QSettings &settings) override;
+ void readSettings();
+ void processUpdates();
+
+ virtual ILockedWaitingForProcess* lock() override;
+ virtual void unlock() override;
+
+ bool addProfile();
+ void updateBSAList(const QStringList &defaultArchives, const QStringList &activeArchives);
+ void refreshDataTree();
+ void refreshDataTreeKeepExpandedNodes();
+ void refreshSaveList();
+
+ void setModListSorting(int index);
+ void setESPListSorting(int index);
+
+ void saveArchiveList();
+
+ void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr);
+ void registerPluginTools(std::vector<MOBase::IPluginTool *> toolPlugins);
+ void registerModPage(MOBase::IPluginModPage *modPage);
+
+ void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info);
+
+ void createStdoutPipe(HANDLE *stdOutRead, HANDLE *stdOutWrite);
+ std::string readFromPipe(HANDLE stdOutRead);
+ void processLOOTOut(const std::string &lootOut, std::string &errorMessages, QProgressDialog &dialog);
+
+ void updateModInDirectoryStructure(unsigned int index, ModInfo::Ptr modInfo);
+
+ QString getOriginDisplayName(int originID);
+
+ void installTranslator(const QString &name);
+
+ virtual void disconnectPlugins();
+
+ void displayModInformation(ModInfo::Ptr modInfo, unsigned int index, int tab);
+
+ virtual bool closeWindow();
+ virtual void setWindowEnabled(bool enabled);
+
+ virtual MOBase::DelayedFileWriterBase &archivesWriter() override { return m_ArchiveListWriter; }
+
+public slots:
+
+ void displayColumnSelection(const QPoint &pos);
+
+ void modorder_changed();
+ void esplist_changed();
+ void refresher_progress(int percent);
+ void directory_refreshed();
+
+ void toolPluginInvoke();
+ void modPagePluginInvoke();
+
+signals:
+
+ /**
+ * @brief emitted after the information dialog has been closed
+ */
+ void modInfoDisplayed();
+
+ /**
+ * @brief emitted when the selected style changes
+ */
+ void styleChanged(const QString &styleFile);
+
+
+ void modListDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+
+protected:
+
+ virtual void showEvent(QShowEvent *event);
+ virtual void closeEvent(QCloseEvent *event);
+ virtual bool eventFilter(QObject *obj, QEvent *event);
+ virtual void resizeEvent(QResizeEvent *event);
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dropEvent(QDropEvent *event);
+
+private slots:
+ void on_actionChange_Game_triggered();
+
+private slots:
+ void on_clickBlankButton_clicked();
+
+private:
+
+ void cleanup();
+
+ void actionToToolButton(QAction *&sourceAction);
+
+ void updateToolBar();
+ void activateSelectedProfile();
+
+ void setExecutableIndex(int index);
+
+ void startSteam();
+
+ void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon);
+ bool refreshProfiles(bool selectProfile = true);
+ void refreshExecutablesList();
+ void installMod(QString fileName = "");
+
+ QList<MOBase::IOrganizer::FileInfo> findFileInfos(const QString &path, const std::function<bool (const MOBase::IOrganizer::FileInfo &)> &filter) const;
+
+ bool modifyExecutablesDialog();
+ void displayModInformation(int row, int tab = -1);
+ void testExtractBSA(int modIndex);
+
+ void writeDataToFile(QFile &file, const QString &directory, const MOShared::DirectoryEntry &directoryEntry);
+
+ void refreshFilters();
+
+ /**
+ * Sets category selections from menu; for multiple mods, this will only apply
+ * the changes made in the menu (which is the delta between the current menu selection and the reference mod)
+ * @param menu the menu after editing by the user
+ * @param modRow index of the mod to edit
+ * @param referenceRow row of the reference mod
+ */
+ void addRemoveCategoriesFromMenu(QMenu *menu, int modRow, int referenceRow);
+
+ /**
+ * Sets category selections from menu; for multiple mods, this will completely
+ * replace the current set of categories on each selected with those selected in the menu
+ * @param menu the menu after editing by the user
+ * @param modRow index of the mod to edit
+ */
+ void replaceCategoriesFromMenu(QMenu *menu, int modRow);
+
+ bool populateMenuCategories(QMenu *menu, int targetID);
+
+ void initDownloadView();
+ void updateDownloadView();
+
+ // remove invalid category-references from mods
+ void fixCategories();
+
+ void createEndorseWidget();
+ void createHelpWidget();
+
+ bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName);
+
+ size_t checkForProblems();
+
+ int getBinaryExecuteInfo(const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments);
+ QTreeWidgetItem *addFilterItem(QTreeWidgetItem *root, const QString &name, int categoryID, ModListSortProxy::FilterType type);
+ void addContentFilters();
+ void addCategoryFilters(QTreeWidgetItem *root, const std::set<int> &categoriesUsed, int targetID);
+
+ void setCategoryListVisible(bool visible);
+
+ void displaySaveGameInfo(QListWidgetItem *newItem);
+
+ HANDLE nextChildProcess();
+
+ bool errorReported(QString &logFile);
+
+ void updateESPLock(bool locked);
+
+ static void setupNetworkProxy(bool activate);
+ void activateProxy(bool activate);
+ void setBrowserGeometry(const QByteArray &geometry);
+
+ bool createBackup(const QString &filePath, const QDateTime &time);
+ QString queryRestore(const QString &filePath);
+
+ void initModListContextMenu(QMenu *menu);
+ void addModSendToContextMenu(QMenu *menu);
+ void addPluginSendToContextMenu(QMenu *menu);
+
+ QMenu *openFolderMenu();
+
+ std::set<QString> enabledArchives();
+
+ void scheduleUpdateButton();
+
+ QDir currentSavesDir() const;
+
+ void startMonitorSaves();
+ void stopMonitorSaves();
+
+ void dropLocalFile(const QUrl &url, const QString &outputDir, bool move);
+
+ bool registerWidgetState(const QString &name, QHeaderView *view, const char *oldSettingName = nullptr);
+
+ void sendSelectedModsToPriority(int newPriority);
+ void sendSelectedPluginsToPriority(int newPriority);
+
+private:
+
+ static const char *PATTERN_BACKUP_GLOB;
+ static const char *PATTERN_BACKUP_REGEX;
+ static const char *PATTERN_BACKUP_DATE;
+
+private:
+
+ Ui::MainWindow *ui;
+
+ QAction *m_Sep; // Executable Shortcuts are added after this. Non owning.
+
+ bool m_WasVisible;
+
+ MOBase::TutorialControl m_Tutorial;
+
+ int m_OldProfileIndex;
+
+ std::vector<QString> m_ModNameList; // the mod-list to go with the directory structure
+ QProgressBar *m_RefreshProgress;
+ bool m_Refreshing;
+
+ QStringList m_DefaultArchives;
+
+ QAbstractItemModel *m_ModListGroupingProxy;
+ ModListSortProxy *m_ModListSortProxy;
+
+ PluginListSortProxy *m_PluginListSortProxy;
+
+ int m_OldExecutableIndex;
+
+ int m_ContextRow;
+ QPersistentModelIndex m_ContextIdx;
+ QTreeWidgetItem *m_ContextItem;
+ QAction *m_ContextAction;
+
+ CategoryFactory &m_CategoryFactory;
+
+ int m_ModsToUpdate;
+
+ bool m_LoginAttempted;
+
+ QTimer m_CheckBSATimer;
+ QTimer m_SaveMetaTimer;
+ QTimer m_UpdateProblemsTimer;
+
+ QFuture<void> m_MetaSave;
+
+ QTime m_StartTime;
+ //SaveGameInfoWidget *m_CurrentSaveView;
+ MOBase::ISaveGameInfoWidget *m_CurrentSaveView;
+
+ OrganizerCore &m_OrganizerCore;
+ PluginContainer &m_PluginContainer;
+
+ QString m_CurrentLanguage;
+ std::vector<QTranslator*> m_Translators;
+
+ BrowserDialog m_IntegratedBrowser;
+
+ QFileSystemWatcher m_SavesWatcher;
+
+ std::vector<QTreeWidgetItem*> m_RemoveWidget;
+
+ QByteArray m_ArchiveListHash;
+
+ bool m_DidUpdateMasterList;
+
+ LockedDialogBase *m_LockDialog { nullptr };
+ uint64_t m_LockCount { 0 };
+
+ bool m_closing{ false };
+
+ bool m_showArchiveData{ true };
+
+ std::vector<std::pair<QString, QHeaderView*>> m_PersistedGeometry;
+
+ MOBase::DelayedFileWriter m_ArchiveListWriter;
+
+ enum class ShortcutType {
+ Toolbar,
+ Desktop,
+ StartMenu
+ };
+
+ void addWindowsLink(ShortcutType const);
+
+ Executable const &getSelectedExecutable() const;
+ Executable &getSelectedExecutable();
+
+private slots:
+
+ void updateWindowTitle(const QString &accountName, bool premium);
+
+ void showMessage(const QString &message);
+ void showError(const QString &message);
+
+
+ // main window actions
+ void helpTriggered();
+ void issueTriggered();
+ void wikiTriggered();
+ void discordTriggered();
+ void tutorialTriggered();
+ void extractBSATriggered();
+
+ //modlist shortcuts
+ void openExplorer_activated();
+ void refreshProfile_activated();
+
+ // modlist context menu
+ void installMod_clicked();
+ void createEmptyMod_clicked();
+ void createSeparator_clicked();
+ void restoreBackup_clicked();
+ void renameMod_clicked();
+ void removeMod_clicked();
+ void setColor_clicked();
+ void resetColor_clicked();
+ void backupMod_clicked();
+ void reinstallMod_clicked();
+ void endorse_clicked();
+ void dontendorse_clicked();
+ void unendorse_clicked();
+ void ignoreMissingData_clicked();
+ void markConverted_clicked();
+ void visitOnNexus_clicked();
+ void visitWebPage_clicked();
+ void openExplorer_clicked();
+ void openOriginExplorer_clicked();
+ void openOriginInformation_clicked();
+ void information_clicked();
+ void enableSelectedMods_clicked();
+ void disableSelectedMods_clicked();
+ void sendSelectedModsToTop_clicked();
+ void sendSelectedModsToBottom_clicked();
+ void sendSelectedModsToPriority_clicked();
+ void sendSelectedModsToSeparator_clicked();
+ // savegame context menu
+ void deleteSavegame_clicked();
+ void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets);
+ // data-tree context menu
+ void writeDataToFile();
+ void openDataFile();
+ void addAsExecutable();
+ void previewDataFile();
+ void hideFile();
+ void unhideFile();
+
+ // pluginlist context menu
+ void enableSelectedPlugins_clicked();
+ void disableSelectedPlugins_clicked();
+ void sendSelectedPluginsToTop_clicked();
+ void sendSelectedPluginsToBottom_clicked();
+ void sendSelectedPluginsToPriority_clicked();
+
+ void linkToolbar();
+ void linkDesktop();
+ void linkMenu();
+
+ void languageChange(const QString &newLanguage);
+ void saveSelectionChanged(QListWidgetItem *newItem);
+
+ void windowTutorialFinished(const QString &windowName);
+
+ BSA::EErrorCode extractBSA(BSA::Archive &archive, BSA::Folder::Ptr folder, const QString &destination, QProgressDialog &extractProgress);
+
+ void createModFromOverwrite();
+ /**
+ * @brief sends the content of the overwrite folder to an already existing mod
+ */
+ void moveOverwriteContentToExistingMod();
+ /**
+ * @brief actually sends the content of the overwrite folder to specified mod
+ */
+ void doMoveOverwriteContentToMod(const QString &modAbsolutePath);
+ void clearOverwrite();
+
+ void procError(QProcess::ProcessError error);
+ void procFinished(int exitCode, QProcess::ExitStatus exitStatus);
+
+ // nexus related
+ void checkModsForUpdates();
+
+ void validationFailed(const QString &message);
+
+ void linkClicked(const QString &url);
+
+ void updateAvailable();
+
+ void motdReceived(const QString &motd);
+ void notEndorsedYet();
+ void wontEndorse();
+
+ void originModified(int originID);
+
+ void addRemoveCategories_MenuHandler();
+ void replaceCategories_MenuHandler();
+
+ void addPrimaryCategoryCandidates();
+
+ void modDetailsUpdated(bool success);
+
+ void modInstalled(const QString &modName);
+
+ void nxmUpdatesAvailable(const std::vector<int> &modIDs, QVariant userData, QVariant resultData, int requestID);
+ void nxmEndorsementToggled(QString, int, QVariant, QVariant resultData, int);
+ void nxmDownloadURLs(QString, int modID, int fileID, QVariant userData, QVariant resultData, int requestID);
+ void nxmRequestFailed(QString, int modID, int fileID, QVariant userData, int requestID, const QString &errorString);
+
+ void editCategories();
+ void deselectFilters();
+
+ void displayModInformation(const QString &modName, int tab);
+ void modOpenNext(int tab=-1);
+ void modOpenPrev(int tab=-1);
+
+ void modRenamed(const QString &oldName, const QString &newName);
+ void modRemoved(const QString &fileName);
+
+ void hideSaveGameInfo();
+
+ void hookUpWindowTutorials();
+
+ void resumeDownload(int downloadIndex);
+ void endorseMod(ModInfo::Ptr mod);
+ void unendorseMod(ModInfo::Ptr mod);
+ void cancelModListEditor();
+
+ void lockESPIndex();
+ void unlockESPIndex();
+
+ void enableVisibleMods();
+ void disableVisibleMods();
+ void exportModListCSV();
+ void openInstanceFolder();
+ void openLogsFolder();
+ void openInstallFolder();
+ void openPluginsFolder();
+ void openDownloadsFolder();
+ void openModsFolder();
+ void openProfileFolder();
+ void openIniFolder();
+ void openGameFolder();
+ void openMyGamesFolder();
+ void startExeAction();
+
+ void checkBSAList();
+
+ void updateProblemsButton();
+
+ void saveModMetas();
+
+ void updateStyle(const QString &style);
+
+ void modlistChanged(const QModelIndex &index, int role);
+ void modlistChanged(const QModelIndexList &indicies, int role);
+ void fileMoved(const QString &filePath, const QString &oldOriginName, const QString &newOriginName);
+
+
+ void modFilterActive(bool active);
+ void espFilterChanged(const QString &filter);
+ void downloadFilterChanged(const QString &filter);
+
+ void expandModList(const QModelIndex &index);
+
+ /**
+ * @brief resize columns in mod list and plugin list to content
+ */
+ void resizeLists(bool modListCustom, bool pluginListCustom);
+
+ /**
+ * @brief allow columns in mod list and plugin list to be resized
+ */
+ void allowListResize();
+
+ void toolBar_customContextMenuRequested(const QPoint &point);
+ void removeFromToolbar();
+ void overwriteClosed(int);
+
+ void changeVersioningScheme();
+ void ignoreUpdate();
+ void unignoreUpdate();
+
+ void refreshSavesIfOpen();
+ void expandDataTreeItem(QTreeWidgetItem *item);
+ void about();
+ void delayedRemove();
+
+ void modlistSelectionChanged(const QModelIndex &current, const QModelIndex &previous);
+ void modListSortIndicatorChanged(int column, Qt::SortOrder order);
+ void modListSectionResized(int logicalIndex, int oldSize, int newSize);
+
+ void modlistSelectionsChanged(const QItemSelection &current);
+ void esplistSelectionsChanged(const QItemSelection &current);
+
+ void search_activated();
+ void searchClear_activated();
+
+ void updateModCount();
+ void updatePluginCount();
+
+private slots: // ui slots
+ // actions
+ void on_actionAdd_Profile_triggered();
+ void on_actionInstallMod_triggered();
+ void on_actionModify_Executables_triggered();
+ void on_actionNexus_triggered();
+ void on_actionNotifications_triggered();
+ void on_actionSettings_triggered();
+ void on_actionUpdate_triggered();
+ void on_actionEndorseMO_triggered();
+
+ void on_bsaList_customContextMenuRequested(const QPoint &pos);
+ void on_clearFiltersButton_clicked();
+ void on_btnRefreshData_clicked();
+ void on_btnRefreshDownloads_clicked();
+ void on_categoriesList_customContextMenuRequested(const QPoint &pos);
+ void on_conflictsCheckBox_toggled(bool checked);
+ void on_showArchiveDataCheckBox_toggled(bool checked);
+ void on_dataTree_customContextMenuRequested(const QPoint &pos);
+ void on_executablesListBox_currentIndexChanged(int index);
+ void on_modList_customContextMenuRequested(const QPoint &pos);
+ void on_modList_doubleClicked(const QModelIndex &index);
+ void on_listOptionsBtn_pressed();
+ void on_espList_doubleClicked(const QModelIndex &index);
+ void on_profileBox_currentIndexChanged(int index);
+ void on_savegameList_customContextMenuRequested(const QPoint &pos);
+ void on_startButton_clicked();
+ void on_tabWidget_currentChanged(int index);
+
+ void on_espList_customContextMenuRequested(const QPoint &pos);
+ void on_displayCategoriesBtn_toggled(bool checked);
+ void on_groupCombo_currentIndexChanged(int index);
+ void on_categoriesList_itemSelectionChanged();
+ void on_linkButton_pressed();
+ void on_showHiddenBox_toggled(bool checked);
+ void on_bsaList_itemChanged(QTreeWidgetItem *item, int column);
+ void on_bossButton_clicked();
+
+ void on_saveButton_clicked();
+ void on_restoreButton_clicked();
+ void on_restoreModsButton_clicked();
+ void on_saveModsButton_clicked();
+ void on_actionCopy_Log_to_Clipboard_triggered();
+ void on_categoriesAndBtn_toggled(bool checked);
+ void on_categoriesOrBtn_toggled(bool checked);
+ void on_managedArchiveLabel_linkHovered(const QString &link);
+};
+
+
+
+#endif // MAINWINDOW_H
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index dc1eb2cb..5da7b6a3 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -215,7 +215,7 @@ void NXMAccessManager::validateTimeout()
m_ApiKey.clear();
m_ValidateState = VALIDATE_NOT_VALID;
- emit validateFailed(tr("timeout"));
+ emit validateFailed(tr("There was a timeout during the request"));
}
diff --git a/src/organizer_en.ts b/src/organizer_en.ts
index 43c01310..bcdbd069 100644
--- a/src/organizer_en.ts
+++ b/src/organizer_en.ts
@@ -26,7 +26,7 @@
</message>
<message>
<location filename="aboutdialog.ui" line="160"/>
- <source>Current Maintainers</source>
+ <source>Lead Developers/ Maintainers</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -35,67 +35,92 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="206"/>
- <source>Major Contributors</source>
+ <location filename="aboutdialog.ui" line="201"/>
+ <source>Mo2 devs and Contributors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="227"/>
+ <location filename="aboutdialog.ui" line="216"/>
+ <source>Project579</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="aboutdialog.ui" line="221"/>
+ <source>przester</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="aboutdialog.ui" line="232"/>
<source>Translators</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="252"/>
+ <location filename="aboutdialog.ui" line="257"/>
<source>Cyb3r (Dutch)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="262"/>
+ <location filename="aboutdialog.ui" line="267"/>
<source>fruttyx (French)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="277"/>
+ <location filename="aboutdialog.ui" line="282"/>
<source>Yoplala (French)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="282"/>
+ <location filename="aboutdialog.ui" line="287"/>
<source>Faron (German)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="292"/>
+ <location filename="aboutdialog.ui" line="297"/>
<source>Mordan (Greek)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="305"/>
+ <location filename="aboutdialog.ui" line="310"/>
<source>Yoosk (Polish)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="310"/>
+ <location filename="aboutdialog.ui" line="315"/>
<source>Brgodfx (Portuguese)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="330"/>
+ <location filename="aboutdialog.ui" line="320"/>
+ <source>zDas (Portuguese)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="aboutdialog.ui" line="340"/>
<source>Jax (Swedish)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="335"/>
+ <location filename="aboutdialog.ui" line="345"/>
+ <source>yohru (Japanese)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="aboutdialog.ui" line="350"/>
<source>...and all other Transifex contributors!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="349"/>
+ <location filename="aboutdialog.ui" line="364"/>
<source>Other Supporters &amp;&amp; Contributors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="aboutdialog.ui" line="471"/>
+ <location filename="aboutdialog.ui" line="374"/>
+ <source>Tannin (Original Creator)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="aboutdialog.ui" line="491"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -279,12 +304,12 @@ p, li { white-space: pre-wrap; }
<context>
<name>DirectoryRefresher</name>
<message>
- <location filename="directoryrefresher.cpp" line="113"/>
+ <location filename="directoryrefresher.cpp" line="112"/>
<source>failed to parse bsa %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="directoryrefresher.cpp" line="179"/>
+ <location filename="directoryrefresher.cpp" line="178"/>
<source>failed to read mod (%1): %2</source>
<translation type="unfinished"></translation>
</message>
@@ -292,435 +317,251 @@ p, li { white-space: pre-wrap; }
<context>
<name>DownloadList</name>
<message>
- <location filename="downloadlist.cpp" line="64"/>
+ <location filename="downloadlist.cpp" line="71"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlist.cpp" line="65"/>
- <source>Filetime</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlist.cpp" line="66"/>
+ <location filename="downloadlist.cpp" line="72"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlist.cpp" line="67"/>
- <source>Done</source>
+ <location filename="downloadlist.cpp" line="73"/>
+ <source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlist.cpp" line="83"/>
- <source>Information missing, please select &quot;Query Info&quot; from the context menu to re-retrieve.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlist.cpp" line="90"/>
- <source>pending download</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DownloadListWidget</name>
- <message>
- <location filename="downloadlistwidget.ui" line="17"/>
- <location filename="downloadlistwidget.ui" line="61"/>
- <source>Placeholder</source>
+ <location filename="downloadlist.cpp" line="74"/>
+ <source>Filetime</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.ui" line="102"/>
- <location filename="downloadlistwidget.cpp" line="169"/>
- <location filename="downloadlistwidget.cpp" line="171"/>
- <source>Done - Double Click to install</source>
+ <location filename="downloadlist.cpp" line="89"/>
+ <source>&lt; game %1 mod %2 file %3 &gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="135"/>
- <location filename="downloadlistwidget.cpp" line="137"/>
- <source>Paused - Double Click to resume</source>
+ <location filename="downloadlist.cpp" line="90"/>
+ <source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="155"/>
- <location filename="downloadlistwidget.cpp" line="157"/>
- <source>Installed - Double Click to re-install</source>
+ <location filename="downloadlist.cpp" line="91"/>
+ <source>Pending</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="162"/>
- <location filename="downloadlistwidget.cpp" line="164"/>
- <source>Uninstalled - Double Click to re-install</source>
+ <location filename="downloadlist.cpp" line="101"/>
+ <source>Started</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>DownloadListWidgetCompact</name>
<message>
- <location filename="downloadlistwidgetcompact.ui" line="17"/>
- <location filename="downloadlistwidgetcompact.ui" line="56"/>
- <source>Placeholder</source>
+ <location filename="downloadlist.cpp" line="102"/>
+ <source>Canceling</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.ui" line="129"/>
- <source>Done</source>
+ <location filename="downloadlist.cpp" line="103"/>
+ <source>Pausing</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>DownloadListWidgetCompactDelegate</name>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="109"/>
- <source>&lt; game %1 mod %2 file %3 &gt;</source>
+ <location filename="downloadlist.cpp" line="104"/>
+ <source>Canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="114"/>
- <source>Pending</source>
+ <location filename="downloadlist.cpp" line="105"/>
+ <source>Paused</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="141"/>
- <source>Paused</source>
+ <location filename="downloadlist.cpp" line="106"/>
+ <source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="143"/>
+ <location filename="downloadlist.cpp" line="107"/>
<source>Fetching Info 1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="145"/>
+ <location filename="downloadlist.cpp" line="108"/>
<source>Fetching Info 2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="150"/>
- <source>Installed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidgetcompact.cpp" line="152"/>
- <source>Uninstalled</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidgetcompact.cpp" line="154"/>
- <source>Done</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidgetcompact.cpp" line="233"/>
- <location filename="downloadlistwidgetcompact.cpp" line="288"/>
- <location filename="downloadlistwidgetcompact.cpp" line="297"/>
- <location filename="downloadlistwidgetcompact.cpp" line="306"/>
- <location filename="downloadlistwidgetcompact.cpp" line="315"/>
- <location filename="downloadlistwidgetcompact.cpp" line="324"/>
- <location filename="downloadlistwidgetcompact.cpp" line="333"/>
- <source>Are you sure?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidgetcompact.cpp" line="234"/>
- <source>This will permanently delete the selected download.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidgetcompact.cpp" line="289"/>
- <source>This will remove all finished downloads from this list and from disk.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidgetcompact.cpp" line="298"/>
- <source>This will remove all installed downloads from this list and from disk.</source>
+ <location filename="downloadlist.cpp" line="109"/>
+ <source>Downloaded</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="307"/>
- <source>This will remove all uninstalled downloads from this list and from disk.</source>
+ <location filename="downloadlist.cpp" line="110"/>
+ <source>Installed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="316"/>
- <source>This will permanently remove all finished downloads from this list (but NOT from disk).</source>
+ <location filename="downloadlist.cpp" line="111"/>
+ <source>Uninstalled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="325"/>
- <source>This will permanently remove all installed downloads from this list (but NOT from disk).</source>
+ <location filename="downloadlist.cpp" line="129"/>
+ <source>Pending download</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="334"/>
- <source>This will permanently remove all uninstalled downloads from this list (but NOT from disk).</source>
+ <location filename="downloadlist.cpp" line="133"/>
+ <source>Information missing, please select &quot;Query Info&quot; from the context menu to re-retrieve.</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>DownloadListWidget</name>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="363"/>
+ <location filename="downloadlistwidget.cpp" line="201"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="365"/>
+ <location filename="downloadlistwidget.cpp" line="203"/>
<source>Query Info</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="367"/>
+ <location filename="downloadlistwidget.cpp" line="205"/>
<source>Visit on Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="369"/>
+ <location filename="downloadlistwidget.cpp" line="206"/>
<source>Open File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="370"/>
- <location filename="downloadlistwidgetcompact.cpp" line="381"/>
- <location filename="downloadlistwidgetcompact.cpp" line="385"/>
+ <location filename="downloadlistwidget.cpp" line="207"/>
+ <location filename="downloadlistwidget.cpp" line="219"/>
+ <location filename="downloadlistwidget.cpp" line="224"/>
<source>Show in Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="372"/>
+ <location filename="downloadlistwidget.cpp" line="211"/>
+ <location filename="downloadlistwidget.cpp" line="222"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="374"/>
+ <location filename="downloadlistwidget.cpp" line="213"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="376"/>
+ <location filename="downloadlistwidget.cpp" line="215"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="379"/>
+ <location filename="downloadlistwidget.cpp" line="217"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="380"/>
+ <location filename="downloadlistwidget.cpp" line="218"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="383"/>
- <source>Remove</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidgetcompact.cpp" line="384"/>
+ <location filename="downloadlistwidget.cpp" line="223"/>
<source>Resume</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="389"/>
+ <location filename="downloadlistwidget.cpp" line="229"/>
<source>Delete Installed...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="390"/>
+ <location filename="downloadlistwidget.cpp" line="230"/>
<source>Delete Uninstalled...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="391"/>
+ <location filename="downloadlistwidget.cpp" line="231"/>
<source>Delete All...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="394"/>
+ <location filename="downloadlistwidget.cpp" line="235"/>
<source>Hide Installed...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="395"/>
+ <location filename="downloadlistwidget.cpp" line="236"/>
<source>Hide Uninstalled...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="396"/>
+ <location filename="downloadlistwidget.cpp" line="237"/>
<source>Hide All...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidgetcompact.cpp" line="400"/>
+ <location filename="downloadlistwidget.cpp" line="239"/>
<source>Un-Hide All...</source>
<translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>DownloadListWidgetDelegate</name>
- <message>
- <location filename="downloadlistwidget.cpp" line="112"/>
- <source>&lt; game %1 mod %2 file %3 &gt;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="115"/>
- <source>Pending</source>
- <translation type="unfinished"></translation>
- </message>
<message>
- <location filename="downloadlistwidget.cpp" line="142"/>
- <source>Fetching Info 1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="145"/>
- <source>Fetching Info 2</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="248"/>
- <location filename="downloadlistwidget.cpp" line="302"/>
- <location filename="downloadlistwidget.cpp" line="311"/>
- <location filename="downloadlistwidget.cpp" line="320"/>
+ <location filename="downloadlistwidget.cpp" line="257"/>
+ <location filename="downloadlistwidget.cpp" line="312"/>
+ <location filename="downloadlistwidget.cpp" line="321"/>
+ <location filename="downloadlistwidget.cpp" line="330"/>
<source>Delete Files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="249"/>
+ <location filename="downloadlistwidget.cpp" line="258"/>
<source>This will permanently delete the selected download.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="303"/>
+ <location filename="downloadlistwidget.cpp" line="313"/>
<source>This will remove all finished downloads from this list and from disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="312"/>
+ <location filename="downloadlistwidget.cpp" line="322"/>
<source>This will remove all installed downloads from this list and from disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="321"/>
+ <location filename="downloadlistwidget.cpp" line="331"/>
<source>This will remove all uninstalled downloads from this list and from disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="329"/>
- <location filename="downloadlistwidget.cpp" line="338"/>
- <location filename="downloadlistwidget.cpp" line="347"/>
+ <location filename="downloadlistwidget.cpp" line="339"/>
+ <location filename="downloadlistwidget.cpp" line="348"/>
+ <location filename="downloadlistwidget.cpp" line="357"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="330"/>
+ <location filename="downloadlistwidget.cpp" line="340"/>
<source>This will remove all finished downloads from this list (but NOT from disk).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="339"/>
+ <location filename="downloadlistwidget.cpp" line="349"/>
<source>This will remove all installed downloads from this list (but NOT from disk).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadlistwidget.cpp" line="348"/>
+ <location filename="downloadlistwidget.cpp" line="358"/>
<source>This will remove all uninstalled downloads from this list (but NOT from disk).</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="downloadlistwidget.cpp" line="376"/>
- <source>Install</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="378"/>
- <source>Query Info</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="380"/>
- <source>Visit on Nexus</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="383"/>
- <source>Open File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="384"/>
- <location filename="downloadlistwidget.cpp" line="397"/>
- <location filename="downloadlistwidget.cpp" line="401"/>
- <source>Show in Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="388"/>
- <location filename="downloadlistwidget.cpp" line="399"/>
- <source>Delete</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="390"/>
- <source>Un-Hide</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="392"/>
- <source>Hide</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="395"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="396"/>
- <source>Pause</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="400"/>
- <source>Resume</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="406"/>
- <source>Delete Installed...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="407"/>
- <source>Delete Uninstalled...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="408"/>
- <source>Delete All...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="412"/>
- <source>Hide Installed...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="413"/>
- <source>Hide Uninstalled...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="414"/>
- <source>Hide All...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="downloadlistwidget.cpp" line="418"/>
- <source>Un-Hide All...</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>DownloadManager</name>
@@ -746,7 +587,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="downloadmanager.cpp" line="502"/>
- <source>A file with the same name has already been downloaded. Do you want to download it again? The new file will receive a different name.</source>
+ <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>
@@ -777,7 +618,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="downloadmanager.cpp" line="588"/>
- <location filename="downloadmanager.cpp" line="725"/>
+ <location filename="downloadmanager.cpp" line="721"/>
<source>remove: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
@@ -797,234 +638,234 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="747"/>
+ <location filename="downloadmanager.cpp" line="743"/>
<source>cancel: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="760"/>
+ <location filename="downloadmanager.cpp" line="756"/>
<source>pause: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="780"/>
+ <location filename="downloadmanager.cpp" line="776"/>
<source>resume: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="791"/>
+ <location filename="downloadmanager.cpp" line="787"/>
<source>resume (int): invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="815"/>
+ <location filename="downloadmanager.cpp" line="811"/>
<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="856"/>
+ <location filename="downloadmanager.cpp" line="852"/>
<source>query: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="878"/>
+ <location filename="downloadmanager.cpp" line="874"/>
<source>Please enter the nexus mod id</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="878"/>
+ <location filename="downloadmanager.cpp" line="874"/>
<source>Mod ID:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="888"/>
+ <location filename="downloadmanager.cpp" line="884"/>
<source>Please select the source game code for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="907"/>
+ <location filename="downloadmanager.cpp" line="903"/>
<source>VisitNexus: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="928"/>
+ <location filename="downloadmanager.cpp" line="924"/>
<source>Nexus ID for this Mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="935"/>
+ <location filename="downloadmanager.cpp" line="931"/>
<source>OpenFile: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="952"/>
+ <location filename="downloadmanager.cpp" line="948"/>
<source>OpenFileInDownloadsFolder: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="988"/>
+ <location filename="downloadmanager.cpp" line="984"/>
<source>get pending: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="997"/>
+ <location filename="downloadmanager.cpp" line="993"/>
<source>get path: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1006"/>
+ <location filename="downloadmanager.cpp" line="1002"/>
<source>Main</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1007"/>
+ <location filename="downloadmanager.cpp" line="1003"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1008"/>
+ <location filename="downloadmanager.cpp" line="1004"/>
<source>Optional</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1009"/>
+ <location filename="downloadmanager.cpp" line="1005"/>
<source>Old</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1010"/>
+ <location filename="downloadmanager.cpp" line="1006"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1011"/>
+ <location filename="downloadmanager.cpp" line="1007"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1018"/>
+ <location filename="downloadmanager.cpp" line="1014"/>
<source>display name: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1038"/>
+ <location filename="downloadmanager.cpp" line="1034"/>
<source>file name: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1047"/>
+ <location filename="downloadmanager.cpp" line="1043"/>
<source>file time: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1061"/>
+ <location filename="downloadmanager.cpp" line="1057"/>
<source>file size: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1071"/>
+ <location filename="downloadmanager.cpp" line="1067"/>
<source>progress: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1081"/>
+ <location filename="downloadmanager.cpp" line="1077"/>
<source>state: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1091"/>
+ <location filename="downloadmanager.cpp" line="1087"/>
<source>infocomplete: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1106"/>
- <location filename="downloadmanager.cpp" line="1114"/>
+ <location filename="downloadmanager.cpp" line="1102"/>
+ <location filename="downloadmanager.cpp" line="1110"/>
<source>mod id: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1122"/>
+ <location filename="downloadmanager.cpp" line="1118"/>
<source>ishidden: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1131"/>
+ <location filename="downloadmanager.cpp" line="1127"/>
<source>file info: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1141"/>
+ <location filename="downloadmanager.cpp" line="1137"/>
<source>mark installed: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1186"/>
+ <location filename="downloadmanager.cpp" line="1182"/>
<source>mark uninstalled: invalid download index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1359"/>
+ <location filename="downloadmanager.cpp" line="1355"/>
<source>Memory allocation error (in processing progress event).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1369"/>
+ <location filename="downloadmanager.cpp" line="1365"/>
<source>Memory allocation error (in processing downloaded data).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1495"/>
+ <location filename="downloadmanager.cpp" line="1491"/>
<source>Information updated</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1497"/>
- <location filename="downloadmanager.cpp" line="1511"/>
+ <location filename="downloadmanager.cpp" line="1493"/>
+ <location filename="downloadmanager.cpp" line="1507"/>
<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="1499"/>
+ <location filename="downloadmanager.cpp" line="1495"/>
<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="1617"/>
+ <location filename="downloadmanager.cpp" line="1613"/>
<source>No download server available. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1660"/>
+ <location filename="downloadmanager.cpp" line="1656"/>
<source>Failed to request file info from nexus: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1687"/>
+ <location filename="downloadmanager.cpp" line="1683"/>
<source>Warning: Content type is: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1692"/>
+ <location filename="downloadmanager.cpp" line="1688"/>
<source>Download header content length: %1 downloaded file size: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1694"/>
+ <location filename="downloadmanager.cpp" line="1690"/>
<source>Download failed: %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1716"/>
+ <location filename="downloadmanager.cpp" line="1712"/>
<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="1799"/>
+ <location filename="downloadmanager.cpp" line="1795"/>
<source>failed to re-open %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="downloadmanager.cpp" line="1839"/>
+ <location filename="downloadmanager.cpp" line="1836"/>
<source>Unable to write download to drive (return %1).
Check the drive&apos;s available storage.
@@ -1143,92 +984,107 @@ Right now the only case I know of where this needs to be overwritten is for the
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="197"/>
+ <location filename="editexecutablesdialog.ui" line="199"/>
+ <source>If this is enabled, the configured libraries will be automatically loaded when this executable is launched.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="editexecutablesdialog.ui" line="202"/>
+ <source>Force Load Libraries (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="editexecutablesdialog.ui" line="225"/>
+ <source>Configure Libraries</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="editexecutablesdialog.ui" line="234"/>
<source>Use Application&apos;s Icon for shortcuts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="204"/>
+ <location filename="editexecutablesdialog.ui" line="241"/>
<source>(*) This setting is profile-specific</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="213"/>
- <location filename="editexecutablesdialog.ui" line="216"/>
+ <location filename="editexecutablesdialog.ui" line="250"/>
+ <location filename="editexecutablesdialog.ui" line="253"/>
<source>Add an executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="219"/>
- <location filename="editexecutablesdialog.cpp" line="217"/>
+ <location filename="editexecutablesdialog.ui" line="256"/>
+ <location filename="editexecutablesdialog.cpp" line="243"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="230"/>
- <location filename="editexecutablesdialog.ui" line="233"/>
+ <location filename="editexecutablesdialog.ui" line="267"/>
+ <location filename="editexecutablesdialog.ui" line="270"/>
<source>Remove the selected executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="236"/>
+ <location filename="editexecutablesdialog.ui" line="273"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.ui" line="264"/>
+ <location filename="editexecutablesdialog.ui" line="301"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="146"/>
+ <location filename="editexecutablesdialog.cpp" line="170"/>
<source>Select a binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="147"/>
+ <location filename="editexecutablesdialog.cpp" line="171"/>
<source>Executable (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="172"/>
+ <location filename="editexecutablesdialog.cpp" line="196"/>
<source>Java (32-bit) required</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="173"/>
+ <location filename="editexecutablesdialog.cpp" line="197"/>
<source>MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe from that installation as the binary.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="189"/>
+ <location filename="editexecutablesdialog.cpp" line="213"/>
<source>Select a directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="196"/>
+ <location filename="editexecutablesdialog.cpp" line="220"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="196"/>
+ <location filename="editexecutablesdialog.cpp" line="220"/>
<source>Really remove &quot;%1&quot; from executables?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="221"/>
+ <location filename="editexecutablesdialog.cpp" line="247"/>
<source>Modify</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="267"/>
- <location filename="editexecutablesdialog.cpp" line="287"/>
+ <location filename="editexecutablesdialog.cpp" line="309"/>
+ <location filename="editexecutablesdialog.cpp" line="329"/>
<source>Save Changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="editexecutablesdialog.cpp" line="268"/>
- <location filename="editexecutablesdialog.cpp" line="288"/>
+ <location filename="editexecutablesdialog.cpp" line="310"/>
+ <location filename="editexecutablesdialog.cpp" line="330"/>
<source>You made changes to the current executable, do you want to save them?</source>
<translation type="unfinished"></translation>
</message>
@@ -1281,6 +1137,85 @@ Right now the only case I know of where this needs to be overwritten is for the
</message>
</context>
<context>
+ <name>ForcedLoadDialog</name>
+ <message>
+ <location filename="forcedloaddialog.ui" line="14"/>
+ <source>Forced Load Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="45"/>
+ <location filename="forcedloaddialog.ui" line="48"/>
+ <source>Adds a row to the table.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="51"/>
+ <source>Add Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="58"/>
+ <location filename="forcedloaddialog.ui" line="61"/>
+ <source>Deletes the selected row from the table.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialog.ui" line="64"/>
+ <source>Delete Row</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ForcedLoadDialogWidget</name>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="23"/>
+ <location filename="forcedloaddialogwidget.ui" line="26"/>
+ <source>If checked, the specified library will be force loaded for the specified process.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="36"/>
+ <location filename="forcedloaddialogwidget.ui" line="39"/>
+ <source>The name of the process that should be forced to load a library.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="42"/>
+ <source>Process name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="67"/>
+ <location filename="forcedloaddialogwidget.ui" line="70"/>
+ <source>Browse for a process.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="73"/>
+ <location filename="forcedloaddialogwidget.ui" line="105"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="80"/>
+ <location filename="forcedloaddialogwidget.ui" line="83"/>
+ <source>The path to the library to be loaded. This may be a path relative to the managed game&apos;s directory or may be an absolute path to somewhere else.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="86"/>
+ <source>Library to load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="forcedloaddialogwidget.ui" line="99"/>
+ <location filename="forcedloaddialogwidget.ui" line="102"/>
+ <source>Browse for a library.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>InstallDialog</name>
<message>
<location filename="installdialog.ui" line="20"/>
@@ -1386,63 +1321,76 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="694"/>
+ <location filename="installationmanager.cpp" line="710"/>
<source>File format &quot;%1&quot; not supported</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="857"/>
+ <location filename="installationmanager.cpp" line="872"/>
<source>None of the available installer plugins were able to handle that archive.
This is likely due to a corrupted or incompatible download or unrecognized archive format.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="868"/>
+ <location filename="installationmanager.cpp" line="883"/>
<source>no error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="871"/>
+ <location filename="installationmanager.cpp" line="886"/>
<source>7z.dll not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="874"/>
+ <location filename="installationmanager.cpp" line="889"/>
<source>7z.dll isn&apos;t valid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="877"/>
+ <location filename="installationmanager.cpp" line="892"/>
<source>archive not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="880"/>
+ <location filename="installationmanager.cpp" line="895"/>
<source>failed to open archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="883"/>
+ <location filename="installationmanager.cpp" line="898"/>
<source>unsupported archive type</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="886"/>
+ <location filename="installationmanager.cpp" line="901"/>
<source>internal library error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="889"/>
+ <location filename="installationmanager.cpp" line="904"/>
<source>archive invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="installationmanager.cpp" line="893"/>
+ <location filename="installationmanager.cpp" line="908"/>
<source>unknown archive error</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>ListDialog</name>
+ <message>
+ <location filename="listdialog.ui" line="14"/>
+ <source>Select an item...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="listdialog.ui" line="42"/>
+ <source>Filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>LockedDialog</name>
<message>
<location filename="lockeddialog.ui" line="14"/>
@@ -1499,17 +1447,17 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/textviewer.cpp" line="130"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="142"/>
<source>failed to write to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/textviewer.cpp" line="161"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="178"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../uibase/src/textviewer.cpp" line="186"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="203"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
@@ -1534,47 +1482,47 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
<name>MainWindow</name>
<message>
<location filename="mainwindow.ui" line="46"/>
- <location filename="mainwindow.ui" line="590"/>
+ <location filename="mainwindow.ui" line="625"/>
<source>Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="115"/>
+ <location filename="mainwindow.ui" line="118"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="134"/>
+ <location filename="mainwindow.ui" line="137"/>
<source>If checked, only mods that match all selected categories are displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="137"/>
+ <location filename="mainwindow.ui" line="140"/>
<source>And</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="147"/>
+ <location filename="mainwindow.ui" line="150"/>
<source>If checked, all mods that match at least one of the selected categories are displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="150"/>
+ <location filename="mainwindow.ui" line="153"/>
<source>Or</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="189"/>
+ <location filename="mainwindow.ui" line="192"/>
<source>Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="199"/>
+ <location filename="mainwindow.ui" line="202"/>
<source>Pick a module collection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="202"/>
+ <location filename="mainwindow.ui" line="205"/>
<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; }
@@ -1584,76 +1532,84 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="233"/>
+ <location filename="mainwindow.ui" line="236"/>
<source>Open list options...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="236"/>
+ <location filename="mainwindow.ui" line="239"/>
<source>Refresh list. This is usually not necessary unless you modified data outside the program.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="256"/>
+ <location filename="mainwindow.ui" line="259"/>
<source>Show Open Folders menu...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="270"/>
- <location filename="mainwindow.ui" line="856"/>
+ <location filename="mainwindow.ui" line="273"/>
+ <location filename="mainwindow.ui" line="891"/>
<source>Restore Backup...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="284"/>
- <location filename="mainwindow.ui" line="876"/>
+ <location filename="mainwindow.ui" line="287"/>
+ <location filename="mainwindow.ui" line="911"/>
+ <location filename="mainwindow.cpp" line="4515"/>
<source>Create Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="400"/>
+ <location filename="mainwindow.ui" line="301"/>
+ <location filename="mainwindow.ui" line="925"/>
+ <source>Active:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="314"/>
+ <source>This provides statistics about the mod list. The total number of active mod is normally displayed. Other statistics may be accessed with the tooltip of this counter.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="432"/>
<source>List of available mods.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="403"/>
+ <location filename="mainwindow.ui" line="435"/>
<source>This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag &amp; drop mods to change their &quot;installation&quot; orders.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="488"/>
+ <location filename="mainwindow.ui" line="523"/>
+ <location filename="mainwindow.ui" line="644"/>
+ <location filename="mainwindow.ui" line="1063"/>
+ <location filename="mainwindow.ui" line="1404"/>
<source>Filter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="545"/>
+ <location filename="mainwindow.ui" line="580"/>
<source>Clear all Filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="585"/>
+ <location filename="mainwindow.ui" line="620"/>
<source>No groups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="595"/>
+ <location filename="mainwindow.ui" line="630"/>
<source>Nexus IDs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="609"/>
- <location filename="mainwindow.ui" line="999"/>
- <location filename="mainwindow.ui" line="1316"/>
- <source>Namefilter</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.ui" line="644"/>
+ <location filename="mainwindow.ui" line="679"/>
<source>Pick a program to run.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="647"/>
+ <location filename="mainwindow.ui" line="682"/>
<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; }
@@ -1663,12 +1619,12 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="695"/>
+ <location filename="mainwindow.ui" line="730"/>
<source>Run program</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="698"/>
+ <location filename="mainwindow.ui" line="733"/>
<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; }
@@ -1677,17 +1633,17 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="708"/>
+ <location filename="mainwindow.ui" line="743"/>
<source>Run</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="749"/>
+ <location filename="mainwindow.ui" line="784"/>
<source>Create a shortcut in your start menu or on the desktop to the specified program</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="752"/>
+ <location filename="mainwindow.ui" line="787"/>
<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; }
@@ -1696,27 +1652,32 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="759"/>
+ <location filename="mainwindow.ui" line="794"/>
<source>Shortcut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="809"/>
+ <location filename="mainwindow.ui" line="844"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="832"/>
+ <location filename="mainwindow.ui" line="867"/>
<source>Sort</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="mainwindow.ui" line="938"/>
+ <source>This provides statistics about the plugin list. The total number of active plugins is normally displayed. Other statistics may be accessed with the tooltip of this counter.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1002"/>
<source>List of available esp/esm files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="941"/>
+ <location filename="mainwindow.ui" line="1005"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -1725,27 +1686,27 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1012"/>
+ <location filename="mainwindow.ui" line="1076"/>
<source>Archives</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1032"/>
+ <location filename="mainwindow.ui" line="1096"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;BSAs / BA2s are bundles of game assets (textures, scripts, etc.). By default, the engine loads these bundles in a separate step from loose files. &lt;p&gt;Their load order is specified by the priority of the corresponding plugin (right pane, plugins tab).&lt;/p&gt;&lt;p&gt;If there is a matching plugin, the game will load them no matter what.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1035"/>
+ <location filename="mainwindow.ui" line="1099"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Currently detected archives. (&lt;a href=&quot;#&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;What is an archive?&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1050"/>
+ <location filename="mainwindow.ui" line="1114"/>
<source>List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1053"/>
+ <location filename="mainwindow.ui" line="1117"/>
<source>BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they &quot;compete&quot; with loose files in your data directory over which is loaded.
By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored!
@@ -1753,219 +1714,236 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1082"/>
+ <location filename="mainwindow.ui" line="1151"/>
<source>Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1100"/>
+ <location filename="mainwindow.ui" line="1169"/>
<source>refresh data-directory overview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1103"/>
+ <location filename="mainwindow.ui" line="1172"/>
<source>Refresh the overview. This may take a moment.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1106"/>
- <location filename="mainwindow.cpp" line="3556"/>
- <location filename="mainwindow.cpp" line="4375"/>
+ <location filename="mainwindow.ui" line="1175"/>
+ <location filename="mainwindow.ui" line="1318"/>
+ <location filename="mainwindow.cpp" line="4389"/>
+ <location filename="mainwindow.cpp" line="5324"/>
<source>Refresh</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1122"/>
+ <location filename="mainwindow.ui" line="1191"/>
<source>This is an overview of your data directory as visible to the game (and tools). </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1132"/>
+ <location filename="mainwindow.ui" line="1204"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1137"/>
+ <location filename="mainwindow.ui" line="1209"/>
<source>Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1147"/>
- <location filename="mainwindow.ui" line="1150"/>
- <source>Filter the above list so that only conflicts are displayed.</source>
+ <location filename="mainwindow.ui" line="1221"/>
+ <location filename="mainwindow.ui" line="1224"/>
+ <source>Filters the above list so that only conflicts are displayed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1153"/>
+ <location filename="mainwindow.ui" line="1227"/>
<source>Show only conflicts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1161"/>
+ <location filename="mainwindow.ui" line="1234"/>
+ <location filename="mainwindow.ui" line="1240"/>
+ <source>Filters the above list so that files from archives are not shown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1243"/>
+ <source>Show files from Archives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1253"/>
<source>Saves</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1185"/>
+ <location filename="mainwindow.ui" line="1277"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&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 savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren&apos;t active now.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This is a list of 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="1205"/>
+ <location filename="mainwindow.ui" line="1297"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1240"/>
+ <location filename="mainwindow.ui" line="1315"/>
+ <source>Refresh downloads view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.ui" line="1346"/>
<source>This is a list of mods you downloaded from Nexus. Double click one to install it. You can also drag an archive into here.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1296"/>
+ <location filename="mainwindow.ui" line="1384"/>
<source>Show Hidden</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1358"/>
+ <location filename="mainwindow.ui" line="1449"/>
<source>Tool Bar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1401"/>
+ <location filename="mainwindow.ui" line="1492"/>
<source>Install Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1404"/>
+ <location filename="mainwindow.ui" line="1495"/>
<source>Install &amp;Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1407"/>
+ <location filename="mainwindow.ui" line="1498"/>
<source>Install a new mod from an archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1410"/>
+ <location filename="mainwindow.ui" line="1501"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1419"/>
+ <location filename="mainwindow.ui" line="1510"/>
<source>Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1422"/>
+ <location filename="mainwindow.ui" line="1513"/>
<source>&amp;Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1425"/>
+ <location filename="mainwindow.ui" line="1516"/>
<source>Configure Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1428"/>
+ <location filename="mainwindow.ui" line="1519"/>
<source>Ctrl+P</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1437"/>
+ <location filename="mainwindow.ui" line="1528"/>
<source>Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1440"/>
+ <location filename="mainwindow.ui" line="1531"/>
<source>&amp;Executables</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1443"/>
+ <location filename="mainwindow.ui" line="1534"/>
<source>Configure the executables that can be started through Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1446"/>
+ <location filename="mainwindow.ui" line="1537"/>
<source>Ctrl+E</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1455"/>
- <location filename="mainwindow.ui" line="1461"/>
+ <location filename="mainwindow.ui" line="1546"/>
+ <location filename="mainwindow.ui" line="1552"/>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1458"/>
+ <location filename="mainwindow.ui" line="1549"/>
<source>&amp;Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1464"/>
+ <location filename="mainwindow.ui" line="1555"/>
<source>Ctrl+I</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1473"/>
+ <location filename="mainwindow.ui" line="1564"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1476"/>
+ <location filename="mainwindow.ui" line="1567"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1479"/>
+ <location filename="mainwindow.ui" line="1570"/>
<source>Configure settings and workarounds</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1482"/>
+ <location filename="mainwindow.ui" line="1573"/>
<source>Ctrl+S</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1491"/>
+ <location filename="mainwindow.ui" line="1582"/>
<source>Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1494"/>
+ <location filename="mainwindow.ui" line="1585"/>
<source>Search nexus network for more mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1497"/>
+ <location filename="mainwindow.ui" line="1588"/>
<source>Ctrl+N</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1509"/>
- <location filename="mainwindow.cpp" line="4316"/>
+ <location filename="mainwindow.ui" line="1600"/>
+ <location filename="mainwindow.cpp" line="5255"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1512"/>
+ <location filename="mainwindow.ui" line="1603"/>
<source>Mod Organizer is up-to-date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1524"/>
- <location filename="mainwindow.cpp" line="636"/>
+ <location filename="mainwindow.ui" line="1615"/>
+ <location filename="mainwindow.cpp" line="674"/>
<source>No Problems</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1527"/>
+ <location filename="mainwindow.ui" line="1618"/>
<source>This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them.
!Work in progress!
@@ -1973,747 +1951,917 @@ Right now this has very limited functionality</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1539"/>
- <location filename="mainwindow.ui" line="1542"/>
+ <location filename="mainwindow.ui" line="1630"/>
+ <location filename="mainwindow.ui" line="1633"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1545"/>
+ <location filename="mainwindow.ui" line="1636"/>
<source>Ctrl+H</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1554"/>
+ <location filename="mainwindow.ui" line="1645"/>
<source>Endorse MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1557"/>
- <location filename="mainwindow.cpp" line="4398"/>
+ <location filename="mainwindow.ui" line="1648"/>
+ <location filename="mainwindow.cpp" line="5347"/>
<source>Endorse Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1562"/>
+ <location filename="mainwindow.ui" line="1653"/>
<source>Copy Log to Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1571"/>
+ <location filename="mainwindow.ui" line="1662"/>
<source>Change Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.ui" line="1574"/>
+ <location filename="mainwindow.ui" line="1665"/>
<source>Open the Instance selection dialog to manage a different Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="322"/>
+ <location filename="mainwindow.cpp" line="334"/>
<source>Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="323"/>
+ <location filename="mainwindow.cpp" line="335"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="324"/>
+ <location filename="mainwindow.cpp" line="336"/>
<source>Start Menu</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="348"/>
+ <location filename="mainwindow.cpp" line="359"/>
<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="624"/>
+ <location filename="mainwindow.cpp" line="494"/>
+ <source>Crash on exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="495"/>
+ <source>MO crashed while exiting. Some settings may not be saved.
+
+Error: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="662"/>
<source>Problems</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="625"/>
+ <location filename="mainwindow.cpp" line="663"/>
<source>There are potential problems with your setup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="637"/>
+ <location filename="mainwindow.cpp" line="675"/>
<source>Everything seems to be in order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="699"/>
+ <location filename="mainwindow.cpp" line="737"/>
+ <location filename="mainwindow.cpp" line="4525"/>
+ <location filename="mainwindow.cpp" line="4529"/>
+ <source>Endorse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="741"/>
+ <source>Won&apos;t Endorse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="756"/>
<source>Help on UI</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="703"/>
- <source>Documentation Wiki</source>
+ <location filename="mainwindow.cpp" line="760"/>
+ <source>Documentation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="707"/>
+ <location filename="mainwindow.cpp" line="764"/>
+ <source>Chat on Discord</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="768"/>
<source>Report Issue</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="711"/>
+ <location filename="mainwindow.cpp" line="772"/>
<source>Tutorials</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="750"/>
+ <location filename="mainwindow.cpp" line="811"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="751"/>
+ <location filename="mainwindow.cpp" line="812"/>
<source>About Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="803"/>
+ <location filename="mainwindow.cpp" line="871"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="804"/>
+ <location filename="mainwindow.cpp" line="872"/>
<source>Please enter a name for the new profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="812"/>
+ <location filename="mainwindow.cpp" line="880"/>
<source>failed to create profile: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="856"/>
+ <location filename="mainwindow.cpp" line="924"/>
<source>Show tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="857"/>
+ <location filename="mainwindow.cpp" line="925"/>
<source>You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the &quot;Help&quot;-menu.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="893"/>
+ <location filename="mainwindow.cpp" line="961"/>
<source>Downloads in progress</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="894"/>
+ <location filename="mainwindow.cpp" line="962"/>
<source>There are still downloads in progress, do you really want to quit?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1011"/>
+ <location filename="mainwindow.cpp" line="1079"/>
<source>Plugin &quot;%1&quot; failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1013"/>
+ <location filename="mainwindow.cpp" line="1081"/>
<source>Plugin &quot;%1&quot; failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1049"/>
+ <location filename="mainwindow.cpp" line="1159"/>
<source>Browse Mod Page</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1184"/>
+ <location filename="mainwindow.cpp" line="1366"/>
<source>Also in: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1195"/>
+ <location filename="mainwindow.cpp" line="1377"/>
<source>No conflict</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1307"/>
+ <location filename="mainwindow.cpp" line="1462"/>
<source>&lt;Edit...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1575"/>
+ <location filename="mainwindow.cpp" line="1740"/>
<source>This bsa is enabled in the ini file so it may be required!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1637"/>
+ <location filename="mainwindow.cpp" line="1802"/>
<source>Activating Network Proxy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1695"/>
- <source>Notice: Your current MO version (%1) is lower than the previous version (%2).&lt;br&gt;The GUI may not downgrade gracefully, so you may experience oddities.&lt;br&gt;However, there should be no serious issues.</source>
+ <location filename="mainwindow.cpp" line="1863"/>
+ <source>Notice: Your current MO version (%1) is lower than the previously used one (%2). The GUI may not downgrade gracefully, so you may experience oddities. However, there should be no serious issues.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1784"/>
+ <location filename="mainwindow.cpp" line="1969"/>
<source>Choose Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1785"/>
+ <location filename="mainwindow.cpp" line="1970"/>
<source>Mod Archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1947"/>
+ <location filename="mainwindow.cpp" line="2157"/>
<source>Start Tutorial?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1948"/>
+ <location filename="mainwindow.cpp" line="2158"/>
<source>You&apos;re about to start a tutorial. For technical reasons it&apos;s not possible to end the tutorial early. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2102"/>
+ <location filename="mainwindow.cpp" line="2331"/>
<source>failed to spawn notepad.exe: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2142"/>
+ <location filename="mainwindow.cpp" line="2371"/>
<source>failed to change origin name: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2166"/>
+ <location filename="mainwindow.cpp" line="2395"/>
<source>failed to move &quot;%1&quot; from mod &quot;%2&quot; to &quot;%3&quot;: %4</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2190"/>
+ <location filename="mainwindow.cpp" line="2419"/>
<source>&lt;Contains %1&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2225"/>
+ <location filename="mainwindow.cpp" line="2454"/>
<source>&lt;Checked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2226"/>
+ <location filename="mainwindow.cpp" line="2455"/>
<source>&lt;Unchecked&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2227"/>
+ <location filename="mainwindow.cpp" line="2456"/>
<source>&lt;Update&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2228"/>
+ <location filename="mainwindow.cpp" line="2457"/>
+ <source>&lt;Mod Backup&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="2458"/>
<source>&lt;Managed by MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2229"/>
+ <location filename="mainwindow.cpp" line="2459"/>
<source>&lt;Managed outside MO&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2230"/>
+ <location filename="mainwindow.cpp" line="2460"/>
<source>&lt;No category&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2231"/>
+ <location filename="mainwindow.cpp" line="2461"/>
<source>&lt;Conflicted&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2232"/>
+ <location filename="mainwindow.cpp" line="2462"/>
<source>&lt;Not Endorsed&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2278"/>
+ <location filename="mainwindow.cpp" line="2508"/>
<source>failed to rename mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2291"/>
+ <location filename="mainwindow.cpp" line="2521"/>
<source>Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2292"/>
+ <location filename="mainwindow.cpp" line="2522"/>
<source>This will replace the existing mod &quot;%1&quot;. Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2295"/>
+ <location filename="mainwindow.cpp" line="2525"/>
<source>failed to remove mod &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2299"/>
- <location filename="mainwindow.cpp" line="4175"/>
- <location filename="mainwindow.cpp" line="4199"/>
+ <location filename="mainwindow.cpp" line="2529"/>
+ <location filename="mainwindow.cpp" line="5081"/>
+ <location filename="mainwindow.cpp" line="5105"/>
<source>failed to rename &quot;%1&quot; to &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2363"/>
- <location filename="mainwindow.cpp" line="3279"/>
- <location filename="mainwindow.cpp" line="3287"/>
- <location filename="mainwindow.cpp" line="3759"/>
+ <location filename="mainwindow.cpp" line="2606"/>
+ <location filename="mainwindow.cpp" line="4087"/>
+ <location filename="mainwindow.cpp" line="4095"/>
+ <location filename="mainwindow.cpp" line="4638"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2364"/>
+ <location filename="mainwindow.cpp" line="2607"/>
<source>Remove the following mods?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2377"/>
+ <location filename="mainwindow.cpp" line="2622"/>
<source>failed to remove mod: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2409"/>
- <location filename="mainwindow.cpp" line="2412"/>
+ <location filename="mainwindow.cpp" line="2654"/>
+ <location filename="mainwindow.cpp" line="2657"/>
+ <location filename="mainwindow.cpp" line="2667"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2409"/>
+ <location filename="mainwindow.cpp" line="2654"/>
<source>Installation file no longer exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2413"/>
+ <location filename="mainwindow.cpp" line="2658"/>
<source>Mods installed with old versions of MO can&apos;t be reinstalled in this way.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2430"/>
+ <location filename="mainwindow.cpp" line="2668"/>
+ <source>Failed to create backup.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="2685"/>
<source>You need to be logged in with Nexus to resume a download</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2446"/>
- <location filename="mainwindow.cpp" line="2473"/>
+ <location filename="mainwindow.cpp" line="2701"/>
+ <location filename="mainwindow.cpp" line="2727"/>
+ <location filename="mainwindow.cpp" line="2761"/>
+ <location filename="mainwindow.cpp" line="2786"/>
<source>You need to be logged in with Nexus to endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2521"/>
+ <location filename="mainwindow.cpp" line="2712"/>
+ <location filename="mainwindow.cpp" line="2720"/>
+ <source>Endorsing multiple mods will take a while. Please wait...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="2772"/>
+ <location filename="mainwindow.cpp" line="2779"/>
+ <source>Unendorsing multiple mods will take a while. Please wait...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="2847"/>
<source>Failed to display overwrite dialog: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2699"/>
+ <location filename="mainwindow.cpp" line="3034"/>
+ <source>Opening Nexus Links</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3035"/>
+ <source>You are trying to open %1 links to Nexus Mods. Are you sure you want to do this?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3064"/>
<source>Nexus ID for this Mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2709"/>
+ <location filename="mainwindow.cpp" line="3076"/>
+ <source>Opening Web Pages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3077"/>
+ <source>You are trying to open %1 Web Pages. Are you sure you want to do this?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3106"/>
<source>Web page for this mod is unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2787"/>
- <location filename="mainwindow.cpp" line="2816"/>
- <location filename="mainwindow.cpp" line="3586"/>
+ <location filename="mainwindow.cpp" line="3289"/>
+ <source>&lt;table cellspacing=&quot;5&quot;&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;All&lt;/th&gt;&lt;th&gt;Visible&lt;/th&gt;&lt;tr&gt;&lt;td&gt;Enabled mods:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%1 / %2&lt;/td&gt;&lt;td align=right&gt;%3 / %4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unmanaged/DLCs:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%5&lt;/td&gt;&lt;td align=right&gt;%6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mod backups:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%7&lt;/td&gt;&lt;td align=right&gt;%8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Separators:&amp;emsp;&lt;/td&gt;&lt;td align=right&gt;%9&lt;/td&gt;&lt;td align=right&gt;%10&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3344"/>
+ <source>&lt;table cellspacing=&quot;6&quot;&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Active &lt;/th&gt;&lt;th&gt;Total&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;All plugins:&lt;/td&gt;&lt;td align=right&gt;%1 &lt;/td&gt;&lt;td align=right&gt;%2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESMs:&lt;/td&gt;&lt;td align=right&gt;%3 &lt;/td&gt;&lt;td align=right&gt;%4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESPs:&lt;/td&gt;&lt;td align=right&gt;%7 &lt;/td&gt;&lt;td align=right&gt;%8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESMs+ESPs:&lt;/td&gt;&lt;td align=right&gt;%9 &lt;/td&gt;&lt;td align=right&gt;%10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESLs:&lt;/td&gt;&lt;td align=right&gt;%5 &lt;/td&gt;&lt;td align=right&gt;%6&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3376"/>
+ <location filename="mainwindow.cpp" line="3514"/>
+ <location filename="mainwindow.cpp" line="4451"/>
<source>Create Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2788"/>
+ <location filename="mainwindow.cpp" line="3377"/>
<source>This will create an empty mod.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2797"/>
- <location filename="mainwindow.cpp" line="2826"/>
+ <location filename="mainwindow.cpp" line="3386"/>
+ <location filename="mainwindow.cpp" line="3524"/>
<source>A mod with this name already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2817"/>
+ <location filename="mainwindow.cpp" line="3414"/>
+ <source>Create Separator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3415"/>
+ <source>This will create a new separator.
+Please enter a name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3422"/>
+ <source>A separator with this name already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3515"/>
<source>This will move all files from overwrite into a new, regular mod.
Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2858"/>
- <location filename="mainwindow.cpp" line="4715"/>
+ <location filename="mainwindow.cpp" line="3596"/>
+ <source>Move successful.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="3617"/>
+ <location filename="mainwindow.cpp" line="5682"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="2859"/>
+ <location filename="mainwindow.cpp" line="3618"/>
<source>About to recursively delete:
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3173"/>
+ <location filename="mainwindow.cpp" line="3981"/>
<source>Not logged in, endorsement information will be wrong</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3181"/>
+ <location filename="mainwindow.cpp" line="3989"/>
<source>Continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3182"/>
+ <location filename="mainwindow.cpp" line="3990"/>
<source>The versioning scheme decides which version is considered newer than another.
This function will guess the versioning scheme under the assumption that the installed version is outdated.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3202"/>
- <location filename="mainwindow.cpp" line="4284"/>
+ <location filename="mainwindow.cpp" line="4010"/>
+ <location filename="mainwindow.cpp" line="5223"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3203"/>
+ <location filename="mainwindow.cpp" line="4011"/>
<source>I don&apos;t know a versioning scheme where %1 is newer than %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3279"/>
+ <location filename="mainwindow.cpp" line="4087"/>
<source>Really enable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3287"/>
+ <location filename="mainwindow.cpp" line="4095"/>
<source>Really disable all visible mods?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3352"/>
+ <location filename="mainwindow.cpp" line="4175"/>
<source>Export to csv</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3355"/>
+ <location filename="mainwindow.cpp" line="4178"/>
<source>CSV (Comma Separated Values) is a format that can be imported in programs like Excel to create a spreadsheet.
You can also use online editors and converters instead.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3358"/>
+ <location filename="mainwindow.cpp" line="4181"/>
<source>Select what mods you want export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3359"/>
+ <location filename="mainwindow.cpp" line="4182"/>
<source>All installed mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3360"/>
+ <location filename="mainwindow.cpp" line="4183"/>
<source>Only active (checked) mods from your current profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3361"/>
+ <location filename="mainwindow.cpp" line="4184"/>
<source>All currently visible mods in the mod list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3382"/>
+ <location filename="mainwindow.cpp" line="4205"/>
<source>Choose what Columns to export:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3385"/>
+ <location filename="mainwindow.cpp" line="4208"/>
<source>Mod_Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3387"/>
+ <location filename="mainwindow.cpp" line="4210"/>
<source>Mod_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3389"/>
+ <location filename="mainwindow.cpp" line="4212"/>
+ <source>Notes_column</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4213"/>
<source>Mod_Status</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3390"/>
+ <location filename="mainwindow.cpp" line="4214"/>
<source>Primary_Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3391"/>
+ <location filename="mainwindow.cpp" line="4215"/>
<source>Nexus_ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3392"/>
+ <location filename="mainwindow.cpp" line="4216"/>
<source>Mod_Nexus_URL</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3393"/>
+ <location filename="mainwindow.cpp" line="4217"/>
<source>Mod_Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3394"/>
+ <location filename="mainwindow.cpp" line="4218"/>
<source>Install_Date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3395"/>
+ <location filename="mainwindow.cpp" line="4219"/>
<source>Download_File_Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3497"/>
+ <location filename="mainwindow.cpp" line="4326"/>
<source>export failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3516"/>
+ <location filename="mainwindow.cpp" line="4345"/>
<source>Open Game folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3518"/>
+ <location filename="mainwindow.cpp" line="4347"/>
<source>Open MyGames folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3522"/>
+ <location filename="mainwindow.cpp" line="4349"/>
+ <source>Open INIs folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4353"/>
<source>Open Instance folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3524"/>
+ <location filename="mainwindow.cpp" line="4355"/>
<source>Open Mods folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3526"/>
+ <location filename="mainwindow.cpp" line="4357"/>
<source>Open Profile folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3528"/>
+ <location filename="mainwindow.cpp" line="4359"/>
<source>Open Downloads folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3532"/>
+ <location filename="mainwindow.cpp" line="4363"/>
<source>Open MO2 Install folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3534"/>
+ <location filename="mainwindow.cpp" line="4365"/>
<source>Open MO2 Plugins folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3536"/>
+ <location filename="mainwindow.cpp" line="4367"/>
<source>Open MO2 Logs folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3545"/>
+ <location filename="mainwindow.cpp" line="4376"/>
<source>Install Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3547"/>
+ <location filename="mainwindow.cpp" line="4378"/>
<source>Create empty mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3551"/>
+ <location filename="mainwindow.cpp" line="4380"/>
+ <source>Create Separator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4384"/>
<source>Enable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3552"/>
+ <location filename="mainwindow.cpp" line="4385"/>
<source>Disable all visible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3554"/>
+ <location filename="mainwindow.cpp" line="4387"/>
<source>Check all for update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3558"/>
+ <location filename="mainwindow.cpp" line="4391"/>
<source>Export to csv...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3579"/>
+ <location filename="mainwindow.cpp" line="4403"/>
+ <location filename="mainwindow.cpp" line="4419"/>
+ <source>Send to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4404"/>
+ <location filename="mainwindow.cpp" line="4420"/>
+ <source>Top</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4405"/>
+ <location filename="mainwindow.cpp" line="4421"/>
+ <source>Bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4406"/>
+ <location filename="mainwindow.cpp" line="4422"/>
+ <source>Priority...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4407"/>
+ <source>Separator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4443"/>
<source>All Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3585"/>
+ <location filename="mainwindow.cpp" line="4450"/>
<source>Sync to Mods...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3587"/>
+ <location filename="mainwindow.cpp" line="4452"/>
+ <source>Move content to Mod...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4453"/>
<source>Clear Overwrite...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3589"/>
- <location filename="mainwindow.cpp" line="3675"/>
+ <location filename="mainwindow.cpp" line="4455"/>
+ <location filename="mainwindow.cpp" line="4556"/>
<source>Open in Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3591"/>
+ <location filename="mainwindow.cpp" line="4457"/>
<source>Restore Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3592"/>
+ <location filename="mainwindow.cpp" line="4458"/>
<source>Remove Backup...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3596"/>
+ <location filename="mainwindow.cpp" line="4461"/>
+ <location filename="mainwindow.cpp" line="4480"/>
<source>Change Categories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3609"/>
+ <location filename="mainwindow.cpp" line="4465"/>
+ <location filename="mainwindow.cpp" line="4485"/>
<source>Primary Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3615"/>
+ <location filename="mainwindow.cpp" line="4469"/>
+ <source>Rename Separator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4470"/>
+ <source>Remove Separator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4473"/>
+ <source>Select Color...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4475"/>
+ <source>Reset Color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4492"/>
<source>Change versioning scheme</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3619"/>
+ <location filename="mainwindow.cpp" line="4496"/>
<source>Un-ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3621"/>
+ <location filename="mainwindow.cpp" line="4500"/>
<source>Ignore update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3627"/>
- <location filename="mainwindow.cpp" line="4819"/>
+ <location filename="mainwindow.cpp" line="4505"/>
+ <location filename="mainwindow.cpp" line="5793"/>
<source>Enable selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3628"/>
- <location filename="mainwindow.cpp" line="4820"/>
+ <location filename="mainwindow.cpp" line="4506"/>
+ <location filename="mainwindow.cpp" line="5794"/>
<source>Disable selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3632"/>
+ <location filename="mainwindow.cpp" line="4512"/>
<source>Rename Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3633"/>
+ <location filename="mainwindow.cpp" line="4513"/>
<source>Reinstall Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3634"/>
+ <location filename="mainwindow.cpp" line="4514"/>
<source>Remove Mod...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3641"/>
+ <location filename="mainwindow.cpp" line="4522"/>
<source>Un-Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3644"/>
- <location filename="mainwindow.cpp" line="3648"/>
- <source>Endorse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="mainwindow.cpp" line="3645"/>
+ <location filename="mainwindow.cpp" line="4526"/>
<source>Won&apos;t endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3651"/>
+ <location filename="mainwindow.cpp" line="4532"/>
<source>Endorsement state unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3662"/>
+ <location filename="mainwindow.cpp" line="4543"/>
<source>Ignore missing data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3666"/>
+ <location filename="mainwindow.cpp" line="4547"/>
<source>Mark as converted/working</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3670"/>
+ <location filename="mainwindow.cpp" line="4551"/>
<source>Visit on Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3672"/>
+ <location filename="mainwindow.cpp" line="4553"/>
<source>Visit web page</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3679"/>
+ <location filename="mainwindow.cpp" line="4560"/>
<source>Information...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3686"/>
- <location filename="mainwindow.cpp" line="4853"/>
+ <location filename="mainwindow.cpp" line="4567"/>
+ <location filename="mainwindow.cpp" line="5841"/>
<source>Exception: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3688"/>
- <location filename="mainwindow.cpp" line="4855"/>
+ <location filename="mainwindow.cpp" line="4569"/>
+ <location filename="mainwindow.cpp" line="5843"/>
<source>Unknown exception</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3719"/>
+ <location filename="mainwindow.cpp" line="4598"/>
<source>&lt;All&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3721"/>
+ <location filename="mainwindow.cpp" line="4600"/>
<source>&lt;Multiple&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3756"/>
+ <location filename="mainwindow.cpp" line="4635"/>
<source>%1 more</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="3760"/>
+ <location filename="mainwindow.cpp" line="4639"/>
<source>Are you sure you want to remove the following %n save(s)?&lt;br&gt;&lt;ul&gt;%1&lt;/ul&gt;&lt;br&gt;Removed saves will be sent to the Recycle Bin.</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2721,12 +2869,12 @@ You can also use online editors and converters instead.</source>
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3805"/>
+ <location filename="mainwindow.cpp" line="4684"/>
<source>Enable Mods...</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location filename="mainwindow.cpp" line="3820"/>
+ <location filename="mainwindow.cpp" line="4699"/>
<source>Delete %n save(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2734,322 +2882,371 @@ You can also use online editors and converters instead.</source>
</translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3862"/>
+ <location filename="mainwindow.cpp" line="4741"/>
<source>failed to remove %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3884"/>
+ <location filename="mainwindow.cpp" line="4763"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="3926"/>
+ <location filename="mainwindow.cpp" line="4793"/>
+ <source>Restarting MO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4794"/>
+ <source>Changing the managed game directory requires restarting MO.
+Any pending downloads will be paused.
+
+Click OK to restart MO now.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="4814"/>
<source>Can&apos;t change download directory while downloads are in progress!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4047"/>
+ <location filename="mainwindow.cpp" line="4953"/>
<source>failed to write to file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4053"/>
+ <location filename="mainwindow.cpp" line="4959"/>
<source>%1 written</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4094"/>
+ <location filename="mainwindow.cpp" line="5000"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4094"/>
+ <location filename="mainwindow.cpp" line="5000"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4120"/>
+ <location filename="mainwindow.cpp" line="5026"/>
<source>Enter Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4121"/>
+ <location filename="mainwindow.cpp" line="5027"/>
<source>Please enter a name for the executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4135"/>
+ <location filename="mainwindow.cpp" line="5041"/>
<source>Not an executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4135"/>
+ <location filename="mainwindow.cpp" line="5041"/>
<source>This is not a recognized executable.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4160"/>
- <location filename="mainwindow.cpp" line="4185"/>
+ <location filename="mainwindow.cpp" line="5066"/>
+ <location filename="mainwindow.cpp" line="5091"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4160"/>
+ <location filename="mainwindow.cpp" line="5066"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4163"/>
- <location filename="mainwindow.cpp" line="4188"/>
+ <location filename="mainwindow.cpp" line="5069"/>
+ <location filename="mainwindow.cpp" line="5094"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4163"/>
- <location filename="mainwindow.cpp" line="4188"/>
+ <location filename="mainwindow.cpp" line="5069"/>
+ <location filename="mainwindow.cpp" line="5094"/>
<source>Failed to remove &quot;%1&quot;. Maybe you lack the required file permissions?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4185"/>
+ <location filename="mainwindow.cpp" line="5091"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4257"/>
+ <location filename="mainwindow.cpp" line="5135"/>
+ <location filename="mainwindow.cpp" line="6455"/>
+ <source>Set Priority</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="5135"/>
+ <source>Set the priority of the selected plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="5190"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4270"/>
+ <location filename="mainwindow.cpp" line="5203"/>
<source>failed to generate preview for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4284"/>
+ <location filename="mainwindow.cpp" line="5223"/>
<source>Sorry, can&apos;t preview anything. This function currently does not support extracting from bsas.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4318"/>
+ <location filename="mainwindow.cpp" line="5257"/>
<source>Update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4355"/>
+ <location filename="mainwindow.cpp" line="5304"/>
<source>Open/Execute</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4356"/>
+ <location filename="mainwindow.cpp" line="5305"/>
<source>Add as Executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4360"/>
+ <location filename="mainwindow.cpp" line="5309"/>
<source>Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4366"/>
+ <location filename="mainwindow.cpp" line="5315"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4368"/>
+ <location filename="mainwindow.cpp" line="5317"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4374"/>
+ <location filename="mainwindow.cpp" line="5323"/>
<source>Write To File...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4399"/>
+ <location filename="mainwindow.cpp" line="5348"/>
<source>Do you want to endorse Mod Organizer on %1 now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4524"/>
+ <location filename="mainwindow.cpp" line="5488"/>
<source>Thank you!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4524"/>
+ <location filename="mainwindow.cpp" line="5488"/>
<source>Thank you for your endorsement!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4559"/>
+ <location filename="mainwindow.cpp" line="5490"/>
+ <source>Okay.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="5490"/>
+ <source>This mod will not be endorsed and will no longer ask you to endorse.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="5526"/>
<source>Request to Nexus failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4574"/>
- <location filename="mainwindow.cpp" line="4636"/>
+ <location filename="mainwindow.cpp" line="5541"/>
+ <location filename="mainwindow.cpp" line="5603"/>
<source>failed to read %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4586"/>
- <location filename="mainwindow.cpp" line="5043"/>
+ <location filename="mainwindow.cpp" line="5553"/>
+ <location filename="mainwindow.cpp" line="6031"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4586"/>
+ <location filename="mainwindow.cpp" line="5553"/>
<source>failed to extract %1 (errorcode %2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4618"/>
+ <location filename="mainwindow.cpp" line="5585"/>
<source>Extract BSA</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4647"/>
+ <location filename="mainwindow.cpp" line="5614"/>
<source>This archive contains invalid hashes. Some files may be broken.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4693"/>
+ <location filename="mainwindow.cpp" line="5660"/>
<source>Extract...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4716"/>
+ <location filename="mainwindow.cpp" line="5683"/>
<source>This will restart MO, continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4756"/>
+ <location filename="mainwindow.cpp" line="5730"/>
<source>Edit Categories...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4757"/>
+ <location filename="mainwindow.cpp" line="5731"/>
<source>Deselect filter</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4808"/>
+ <location filename="mainwindow.cpp" line="5782"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4824"/>
+ <location filename="mainwindow.cpp" line="5798"/>
<source>Enable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4825"/>
+ <location filename="mainwindow.cpp" line="5799"/>
<source>Disable all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4844"/>
+ <location filename="mainwindow.cpp" line="5820"/>
<source>Unlock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4847"/>
+ <location filename="mainwindow.cpp" line="5823"/>
<source>Lock load order</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4989"/>
+ <location filename="mainwindow.cpp" line="5827"/>
+ <source>Open Origin in Explorer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="5834"/>
+ <source>Open Origin Info...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="mainwindow.cpp" line="5977"/>
<source>depends on missing &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="4993"/>
+ <location filename="mainwindow.cpp" line="5981"/>
<source>incompatible with &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5019"/>
+ <location filename="mainwindow.cpp" line="6007"/>
<source>Please wait while LOOT is running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5116"/>
+ <location filename="mainwindow.cpp" line="6104"/>
<source>loot failed. Exit code was: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5138"/>
+ <location filename="mainwindow.cpp" line="6126"/>
<source>failed to start loot</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5141"/>
+ <location filename="mainwindow.cpp" line="6129"/>
<source>failed to run loot: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5145"/>
+ <location filename="mainwindow.cpp" line="6133"/>
<source>Errors occured</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5192"/>
+ <location filename="mainwindow.cpp" line="6180"/>
<source>Backup of load order created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5202"/>
+ <location filename="mainwindow.cpp" line="6190"/>
<source>Choose backup to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5215"/>
+ <location filename="mainwindow.cpp" line="6203"/>
<source>No Backups</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5215"/>
+ <location filename="mainwindow.cpp" line="6203"/>
<source>There are no backups to restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5236"/>
- <location filename="mainwindow.cpp" line="5258"/>
+ <location filename="mainwindow.cpp" line="6224"/>
+ <location filename="mainwindow.cpp" line="6246"/>
<source>Restore failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5237"/>
- <location filename="mainwindow.cpp" line="5259"/>
+ <location filename="mainwindow.cpp" line="6225"/>
+ <location filename="mainwindow.cpp" line="6247"/>
<source>Failed to restore the backup. Errorcode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5248"/>
+ <location filename="mainwindow.cpp" line="6236"/>
<source>Backup of modlist created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5354"/>
+ <location filename="mainwindow.cpp" line="6342"/>
<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="5356"/>
+ <location filename="mainwindow.cpp" line="6344"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5357"/>
+ <location filename="mainwindow.cpp" line="6345"/>
<source>Rename new file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="5358"/>
+ <location filename="mainwindow.cpp" line="6346"/>
<source>Ignore file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="mainwindow.cpp" line="6455"/>
+ <source>Set the priority of the selected mods</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MessageDialog</name>
@@ -3063,72 +3260,82 @@ You can also use online editors and converters instead.</source>
<context>
<name>ModInfo</name>
<message>
- <location filename="modinfo.cpp" line="95"/>
+ <location filename="modinfo.cpp" line="99"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="96"/>
+ <location filename="modinfo.cpp" line="100"/>
<source>Textures</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="97"/>
+ <location filename="modinfo.cpp" line="101"/>
<source>Meshes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="98"/>
+ <location filename="modinfo.cpp" line="102"/>
<source>Bethesda Archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="99"/>
+ <location filename="modinfo.cpp" line="103"/>
<source>UI Changes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="100"/>
+ <location filename="modinfo.cpp" line="104"/>
<source>Sound Effects</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="101"/>
+ <location filename="modinfo.cpp" line="105"/>
<source>Scripts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="102"/>
+ <location filename="modinfo.cpp" line="106"/>
<source>Script Extender</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="103"/>
+ <location filename="modinfo.cpp" line="107"/>
+ <source>Script Extender Files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modinfo.cpp" line="108"/>
<source>SkyProc Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="104"/>
+ <location filename="modinfo.cpp" line="109"/>
<source>MCM Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="105"/>
+ <location filename="modinfo.cpp" line="110"/>
<source>INI files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="106"/>
+ <location filename="modinfo.cpp" line="111"/>
+ <source>ModGroup files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modinfo.cpp" line="113"/>
<source>invalid content type %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="129"/>
+ <location filename="modinfo.cpp" line="136"/>
<source>invalid mod index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfo.cpp" line="159"/>
+ <location filename="modinfo.cpp" line="166"/>
<source>remove: invalid mod index %1</source>
<translation type="unfinished"></translation>
</message>
@@ -3398,37 +3605,56 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="729"/>
+ <location filename="modinfodialog.ui" line="741"/>
<source>about:blank</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="755"/>
+ <location filename="modinfodialog.ui" line="767"/>
<source>Endorse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="769"/>
+ <location filename="modinfodialog.ui" line="782"/>
+ <source>Web page URL (only used if invalid NexusID) :</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modinfodialog.ui" line="795"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="779"/>
+ <location filename="modinfodialog.ui" line="801"/>
+ <location filename="modinfodialog.ui" line="804"/>
+ <location filename="modinfodialog.ui" line="807"/>
+ <source>Enter comments about the mod here. These are displayed in the notes column of the mod list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modinfodialog.ui" line="814"/>
+ <location filename="modinfodialog.ui" line="817"/>
+ <location filename="modinfodialog.ui" line="823"/>
+ <source>Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modinfodialog.ui" line="831"/>
<source>Filetree</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="793"/>
+ <location filename="modinfodialog.ui" line="845"/>
<source>Open Mod in Explorer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="818"/>
+ <location filename="modinfodialog.ui" line="870"/>
<source>A directory view of this mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="821"/>
+ <location filename="modinfodialog.ui" line="873"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -3438,288 +3664,288 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="848"/>
+ <location filename="modinfodialog.ui" line="900"/>
<source>Previous</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="855"/>
+ <location filename="modinfodialog.ui" line="907"/>
<source>Next</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.ui" line="875"/>
+ <location filename="modinfodialog.ui" line="927"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="211"/>
+ <location filename="modinfodialog.cpp" line="234"/>
<source>&amp;Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="212"/>
+ <location filename="modinfodialog.cpp" line="235"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="213"/>
+ <location filename="modinfodialog.cpp" line="236"/>
<source>&amp;Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="214"/>
+ <location filename="modinfodialog.cpp" line="237"/>
<source>&amp;Unhide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="215"/>
+ <location filename="modinfodialog.cpp" line="238"/>
<source>&amp;Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="216"/>
+ <location filename="modinfodialog.cpp" line="239"/>
<source>&amp;New Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="481"/>
- <location filename="modinfodialog.cpp" line="496"/>
+ <location filename="modinfodialog.cpp" line="504"/>
+ <location filename="modinfodialog.cpp" line="519"/>
<source>Save changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="481"/>
- <location filename="modinfodialog.cpp" line="496"/>
+ <location filename="modinfodialog.cpp" line="504"/>
+ <location filename="modinfodialog.cpp" line="519"/>
<source>Save changes to &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="686"/>
+ <location filename="modinfodialog.cpp" line="710"/>
<source>File Exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="686"/>
+ <location filename="modinfodialog.cpp" line="710"/>
<source>A file with that name exists, please enter a new one</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="703"/>
+ <location filename="modinfodialog.cpp" line="727"/>
<source>failed to move file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="728"/>
+ <location filename="modinfodialog.cpp" line="752"/>
<source>failed to create directory &quot;optional&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="772"/>
- <location filename="modinfodialog.cpp" line="1496"/>
+ <location filename="modinfodialog.cpp" line="796"/>
+ <location filename="modinfodialog.cpp" line="1525"/>
<source>Info requested, please wait</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="826"/>
+ <location filename="modinfodialog.cpp" line="850"/>
<source>Main</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="827"/>
+ <location filename="modinfodialog.cpp" line="851"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="828"/>
+ <location filename="modinfodialog.cpp" line="852"/>
<source>Optional</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="829"/>
+ <location filename="modinfodialog.cpp" line="853"/>
<source>Old</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="830"/>
+ <location filename="modinfodialog.cpp" line="854"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="831"/>
+ <location filename="modinfodialog.cpp" line="855"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="842"/>
+ <location filename="modinfodialog.cpp" line="866"/>
<source>Current Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="846"/>
+ <location filename="modinfodialog.cpp" line="870"/>
<source>No update available</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="889"/>
+ <location filename="modinfodialog.cpp" line="913"/>
<source>(description incomplete, please visit nexus)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="904"/>
+ <location filename="modinfodialog.cpp" line="928"/>
<source>&lt;a href=&quot;%1&quot;&gt;Visit on Nexus&lt;/a&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="997"/>
+ <location filename="modinfodialog.cpp" line="1026"/>
<source>Failed to delete %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1013"/>
- <location filename="modinfodialog.cpp" line="1019"/>
- <location filename="modinfodialog.cpp" line="1038"/>
- <location filename="modinfodialog.cpp" line="1043"/>
+ <location filename="modinfodialog.cpp" line="1042"/>
+ <location filename="modinfodialog.cpp" line="1048"/>
+ <location filename="modinfodialog.cpp" line="1067"/>
+ <location filename="modinfodialog.cpp" line="1072"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1013"/>
- <location filename="modinfodialog.cpp" line="1038"/>
+ <location filename="modinfodialog.cpp" line="1042"/>
+ <location filename="modinfodialog.cpp" line="1067"/>
<source>Are sure you want to delete &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1019"/>
- <location filename="modinfodialog.cpp" line="1043"/>
+ <location filename="modinfodialog.cpp" line="1048"/>
+ <location filename="modinfodialog.cpp" line="1072"/>
<source>Are sure you want to delete the selected files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1117"/>
- <location filename="modinfodialog.cpp" line="1123"/>
+ <location filename="modinfodialog.cpp" line="1146"/>
+ <location filename="modinfodialog.cpp" line="1152"/>
<source>New Folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1129"/>
+ <location filename="modinfodialog.cpp" line="1158"/>
<source>Failed to create &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1233"/>
- <location filename="modinfodialog.cpp" line="1257"/>
+ <location filename="modinfodialog.cpp" line="1262"/>
+ <location filename="modinfodialog.cpp" line="1286"/>
<source>Replace file?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1233"/>
+ <location filename="modinfodialog.cpp" line="1262"/>
<source>There already is a hidden version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1236"/>
- <location filename="modinfodialog.cpp" line="1260"/>
+ <location filename="modinfodialog.cpp" line="1265"/>
+ <location filename="modinfodialog.cpp" line="1289"/>
<source>File operation failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1236"/>
- <location filename="modinfodialog.cpp" line="1260"/>
+ <location filename="modinfodialog.cpp" line="1265"/>
+ <location filename="modinfodialog.cpp" line="1289"/>
<source>Failed to remove &quot;%1&quot;. Maybe you lack the required file permissions?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1247"/>
- <location filename="modinfodialog.cpp" line="1270"/>
+ <location filename="modinfodialog.cpp" line="1276"/>
+ <location filename="modinfodialog.cpp" line="1299"/>
<source>failed to rename %1 to %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1257"/>
+ <location filename="modinfodialog.cpp" line="1286"/>
<source>There already is a visible version of this file. Replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1333"/>
+ <location filename="modinfodialog.cpp" line="1362"/>
<source>Select binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1333"/>
+ <location filename="modinfodialog.cpp" line="1362"/>
<source>Binary</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1405"/>
+ <location filename="modinfodialog.cpp" line="1434"/>
<source>file not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1418"/>
+ <location filename="modinfodialog.cpp" line="1447"/>
<source>failed to generate preview for %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1434"/>
+ <location filename="modinfodialog.cpp" line="1463"/>
<source>Sorry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1434"/>
+ <location filename="modinfodialog.cpp" line="1463"/>
<source>Sorry, can&apos;t preview anything. This function currently does not support extracting from bsas.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1448"/>
+ <location filename="modinfodialog.cpp" line="1477"/>
<source>Un-Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1450"/>
+ <location filename="modinfodialog.cpp" line="1479"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1453"/>
- <location filename="modinfodialog.cpp" line="1473"/>
+ <location filename="modinfodialog.cpp" line="1482"/>
+ <location filename="modinfodialog.cpp" line="1502"/>
<source>Open/Execute</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1457"/>
- <location filename="modinfodialog.cpp" line="1477"/>
+ <location filename="modinfodialog.cpp" line="1486"/>
+ <location filename="modinfodialog.cpp" line="1506"/>
<source>Preview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1525"/>
+ <location filename="modinfodialog.cpp" line="1554"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1525"/>
+ <location filename="modinfodialog.cpp" line="1554"/>
<source>Please enter a name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1529"/>
- <location filename="modinfodialog.cpp" line="1532"/>
+ <location filename="modinfodialog.cpp" line="1558"/>
+ <location filename="modinfodialog.cpp" line="1561"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1529"/>
+ <location filename="modinfodialog.cpp" line="1558"/>
<source>Invalid name. Must be a valid file name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1532"/>
+ <location filename="modinfodialog.cpp" line="1561"/>
<source>A tweak by that name exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinfodialog.cpp" line="1546"/>
+ <location filename="modinfodialog.cpp" line="1575"/>
<source>Create Tweak</source>
<translation type="unfinished"></translation>
</message>
@@ -3758,300 +3984,328 @@ p, li { white-space: pre-wrap; }
<context>
<name>ModInfoRegular</name>
<message>
- <location filename="modinforegular.cpp" line="171"/>
- <location filename="modinforegular.cpp" line="174"/>
+ <location filename="modinforegular.cpp" line="184"/>
+ <location filename="modinforegular.cpp" line="187"/>
<source>failed to write %1/meta.ini: error %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinforegular.cpp" line="522"/>
+ <location filename="modinforegular.cpp" line="577"/>
<source>%1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modinforegular.cpp" line="526"/>
+ <location filename="modinforegular.cpp" line="581"/>
<source>Categories: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
+ <name>ModInfoSeparator</name>
+ <message>
+ <location filename="modinfoseparator.cpp" line="24"/>
+ <source>This is a Separator</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>ModList</name>
<message>
- <location filename="modlist.cpp" line="66"/>
+ <location filename="modlist.cpp" line="68"/>
<source>Game Plugins (ESP/ESM/ESL)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="67"/>
+ <location filename="modlist.cpp" line="69"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="68"/>
+ <location filename="modlist.cpp" line="70"/>
<source>Meshes</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="69"/>
+ <location filename="modlist.cpp" line="71"/>
<source>Bethesda Archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="70"/>
+ <location filename="modlist.cpp" line="72"/>
<source>Scripts (Papyrus)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="71"/>
+ <location filename="modlist.cpp" line="73"/>
<source>Script Extender Plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="72"/>
+ <location filename="modlist.cpp" line="74"/>
<source>SkyProc Patcher</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="73"/>
+ <location filename="modlist.cpp" line="75"/>
<source>Sound or Music</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="74"/>
+ <location filename="modlist.cpp" line="76"/>
<source>Textures</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="75"/>
+ <location filename="modlist.cpp" line="77"/>
<source>MCM Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="76"/>
+ <location filename="modlist.cpp" line="78"/>
<source>INI files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="137"/>
+ <location filename="modlist.cpp" line="79"/>
+ <source>ModGroup files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="140"/>
<source>This entry contains files that have been created inside the virtual data tree (i.e. by the construction kit)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="146"/>
+ <location filename="modlist.cpp" line="149"/>
<source>Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="147"/>
+ <location filename="modlist.cpp" line="150"/>
+ <source>Separator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="151"/>
<source>No valid game data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="148"/>
+ <location filename="modlist.cpp" line="152"/>
<source>Not endorsed yet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="150"/>
+ <location filename="modlist.cpp" line="161"/>
<source>Overwrites loose files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="151"/>
+ <location filename="modlist.cpp" line="162"/>
<source>Overwritten loose files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="152"/>
+ <location filename="modlist.cpp" line="163"/>
<source>Loose files Overwrites &amp; Overwritten</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="153"/>
+ <location filename="modlist.cpp" line="164"/>
<source>Redundant</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="154"/>
+ <location filename="modlist.cpp" line="165"/>
<source>Overwrites an archive with loose files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="155"/>
+ <location filename="modlist.cpp" line="166"/>
<source>Archive is overwritten by loose files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="156"/>
+ <location filename="modlist.cpp" line="167"/>
<source>Overwrites another archive file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="157"/>
+ <location filename="modlist.cpp" line="168"/>
<source>Overwritten by another archive file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="158"/>
+ <location filename="modlist.cpp" line="169"/>
<source>Archive files overwrites &amp; overwritten</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="159"/>
- <source>Alternate game source</source>
+ <location filename="modlist.cpp" line="170"/>
+ <source>&lt;br&gt;This mod is for a different game, make sure it&apos;s compatible or it could cause crashes.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="245"/>
+ <location filename="modlist.cpp" line="263"/>
<source>Non-MO</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="275"/>
+ <location filename="modlist.cpp" line="295"/>
<source>invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="417"/>
+ <location filename="modlist.cpp" line="452"/>
<source>installed version: &quot;%1&quot;, newest version: &quot;%2&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="419"/>
+ <location filename="modlist.cpp" line="454"/>
<source>The newest version on Nexus seems to be older than the one you have installed. This could either mean the version you have has been withdrawn (i.e. due to a bug) or the author uses a non-standard versioning scheme and that newest version is actually newer. Either way you may want to &quot;upgrade&quot;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="427"/>
+ <location filename="modlist.cpp" line="462"/>
<source>Categories: &lt;br&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="456"/>
+ <location filename="modlist.cpp" line="493"/>
<source>Invalid name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="461"/>
+ <location filename="modlist.cpp" line="498"/>
<source>Name is already in use by another mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="972"/>
+ <location filename="modlist.cpp" line="1058"/>
<source>drag&amp;drop failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1051"/>
+ <location filename="modlist.cpp" line="1137"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1052"/>
+ <location filename="modlist.cpp" line="1138"/>
<source>Are you sure you want to remove &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1117"/>
+ <location filename="modlist.cpp" line="1205"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1118"/>
+ <location filename="modlist.cpp" line="1206"/>
<source>Content</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1119"/>
+ <location filename="modlist.cpp" line="1207"/>
<source>Mod Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1120"/>
+ <location filename="modlist.cpp" line="1208"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1121"/>
+ <location filename="modlist.cpp" line="1209"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1122"/>
+ <location filename="modlist.cpp" line="1210"/>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1123"/>
+ <location filename="modlist.cpp" line="1211"/>
<source>Source Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1124"/>
+ <location filename="modlist.cpp" line="1212"/>
<source>Nexus ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1125"/>
+ <location filename="modlist.cpp" line="1213"/>
<source>Installation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1126"/>
- <location filename="modlist.cpp" line="1159"/>
+ <location filename="modlist.cpp" line="1214"/>
+ <source>Notes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="modlist.cpp" line="1215"/>
+ <location filename="modlist.cpp" line="1251"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1134"/>
+ <location filename="modlist.cpp" line="1223"/>
<source>Name of your mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1135"/>
+ <location filename="modlist.cpp" line="1224"/>
<source>Version of the mod (if available)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1136"/>
+ <location filename="modlist.cpp" line="1225"/>
<source>Installation priority of your mod. The higher, the more &quot;important&quot; it is and thus overwrites files from mods with lower priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1138"/>
+ <location filename="modlist.cpp" line="1227"/>
<source>Category of the mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1139"/>
+ <location filename="modlist.cpp" line="1228"/>
<source>The source game which was the origin of this mod.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1140"/>
+ <location filename="modlist.cpp" line="1229"/>
<source>Id of the mod as used on Nexus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1141"/>
+ <location filename="modlist.cpp" line="1230"/>
<source>Emblemes to highlight things that might require attention.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1142"/>
- <source>Depicts the content of the mod:&lt;br&gt;&lt;table cellspacing=7&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/plugin&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Game plugins (esp/esm/esl)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/interface&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Interface&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/mesh&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Meshes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/bsa&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;BSA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/texture&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Textures&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/sound&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Sounds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/music&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Music&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/string&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/script&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Scripts (Papyrus)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skse&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Script Extender plugins&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skyproc&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;SkyProc Patcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/menu&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Mod Configuration Menu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/inifile&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;INI files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
+ <location filename="modlist.cpp" line="1231"/>
+ <source>Depicts the content of the mod:&lt;br&gt;&lt;table cellspacing=7&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/plugin&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Game plugins (esp/esm/esl)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/interface&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Interface&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/mesh&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Meshes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/bsa&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;BSA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/texture&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Textures&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/sound&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Sounds&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/music&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Music&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/string&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Strings&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/script&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Scripts (Papyrus)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skse&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Script Extender plugins&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/skyproc&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;SkyProc Patcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/menu&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;Mod Configuration Menu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/inifile&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;INI files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;:/MO/gui/content/modgroup&quot; width=32/&gt;&lt;/td&gt;&lt;td&gt;ModGroup files&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="modlist.cpp" line="1158"/>
+ <location filename="modlist.cpp" line="1249"/>
<source>Time this mod was installed</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="modlist.cpp" line="1250"/>
+ <source>User notes about the mod</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>ModListSortProxy</name>
<message>
- <location filename="modlistsortproxy.cpp" line="398"/>
+ <location filename="modlistsortproxy.cpp" line="506"/>
<source>Drag&amp;Drop is only supported when sorting by priority</source>
<translation type="unfinished"></translation>
</message>
@@ -4085,22 +4339,22 @@ p, li { white-space: pre-wrap; }
<context>
<name>NXMAccessManager</name>
<message>
- <location filename="nxmaccessmanager.cpp" line="133"/>
+ <location filename="nxmaccessmanager.cpp" line="128"/>
<source>Validating Nexus Connection</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="151"/>
+ <location filename="nxmaccessmanager.cpp" line="146"/>
<source>Verifying Nexus login</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="223"/>
+ <location filename="nxmaccessmanager.cpp" line="218"/>
<source>timeout</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nxmaccessmanager.cpp" line="242"/>
+ <location filename="nxmaccessmanager.cpp" line="237"/>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
@@ -4116,17 +4370,17 @@ p, li { white-space: pre-wrap; }
<context>
<name>NexusInterface</name>
<message>
- <location filename="nexusinterface.cpp" line="210"/>
+ <location filename="nexusinterface.cpp" line="211"/>
<source>Failed to guess mod id for &quot;%1&quot;, please pick the correct one</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nexusinterface.cpp" line="542"/>
+ <location filename="nexusinterface.cpp" line="554"/>
<source>empty response</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="nexusinterface.cpp" line="571"/>
+ <location filename="nexusinterface.cpp" line="583"/>
<source>invalid response</source>
<translation type="unfinished"></translation>
</message>
@@ -4165,170 +4419,183 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="671"/>
- <location filename="organizercore.cpp" line="682"/>
+ <location filename="organizercore.cpp" line="677"/>
+ <location filename="organizercore.cpp" line="688"/>
<source>Download started</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="685"/>
+ <location filename="organizercore.cpp" line="691"/>
<source>Download failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="951"/>
- <location filename="organizercore.cpp" line="1009"/>
+ <location filename="organizercore.cpp" line="968"/>
+ <location filename="organizercore.cpp" line="1026"/>
<source>Installation successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="959"/>
- <location filename="organizercore.cpp" line="1019"/>
+ <location filename="organizercore.cpp" line="976"/>
+ <location filename="organizercore.cpp" line="1036"/>
<source>Configure Mod</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="960"/>
- <location filename="organizercore.cpp" line="1020"/>
+ <location filename="organizercore.cpp" line="977"/>
+ <location filename="organizercore.cpp" line="1037"/>
<source>This mod contains ini tweaks. Do you want to configure them now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="972"/>
- <location filename="organizercore.cpp" line="1030"/>
+ <location filename="organizercore.cpp" line="989"/>
+ <location filename="organizercore.cpp" line="1047"/>
<source>mod &quot;%1&quot; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="975"/>
- <location filename="organizercore.cpp" line="1037"/>
+ <location filename="organizercore.cpp" line="992"/>
+ <location filename="organizercore.cpp" line="1054"/>
<source>Installation cancelled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="976"/>
- <location filename="organizercore.cpp" line="1038"/>
+ <location filename="organizercore.cpp" line="993"/>
+ <location filename="organizercore.cpp" line="1055"/>
<source>The mod was not installed completely.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1240"/>
+ <location filename="organizercore.cpp" line="1269"/>
<source>Executable &quot;%1&quot; not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1267"/>
+ <location filename="organizercore.cpp" line="1297"/>
<source>Start Steam?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1268"/>
+ <location filename="organizercore.cpp" line="1298"/>
<source>Steam is required to be running already to correctly start the game. Should MO try to start steam now?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1294"/>
+ <location filename="organizercore.cpp" line="1329"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1302"/>
+ <location filename="organizercore.cpp" line="1337"/>
<source>Windows Event Log Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1303"/>
+ <location filename="organizercore.cpp" line="1338"/>
<source>The Windows Event Log service is disabled and/or not running. This prevents USVFS from running properly. Your mods may not be working in the executable that you are launching. Note that you may have to restart MO and/or your PC after the service is fixed.
Continue launching %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1391"/>
+ <location filename="organizercore.cpp" line="1350"/>
+ <source>Blacklisted Executable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="organizercore.cpp" line="1351"/>
+ <source>The executable you are attempted to launch is blacklisted in the virtual file system. This will likely prevent the executable, and any executables that are launched by this one, from seeing any mods. This could extend to INI files, save games and any other virtualized files.
+
+Continue launching %1?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="organizercore.cpp" line="1446"/>
<source>No profile set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1677"/>
+ <location filename="organizercore.cpp" line="1742"/>
<source>Failed to refresh list of esps: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1761"/>
+ <location filename="organizercore.cpp" line="1851"/>
<source>Multiple esps/esls activated, please check that they don&apos;t conflict.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1836"/>
+ <location filename="organizercore.cpp" line="1939"/>
<source>Download?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1837"/>
+ <location filename="organizercore.cpp" line="1940"/>
<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="1971"/>
+ <location filename="organizercore.cpp" line="2075"/>
+ <location filename="organizercore.cpp" line="2124"/>
<source>failed to update mod list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="1978"/>
- <location filename="organizercore.cpp" line="1995"/>
+ <location filename="organizercore.cpp" line="2131"/>
+ <location filename="organizercore.cpp" line="2148"/>
<source>login successful</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2002"/>
+ <location filename="organizercore.cpp" line="2155"/>
<source>Login failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2003"/>
+ <location filename="organizercore.cpp" line="2156"/>
<source>Login failed, try again?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2012"/>
+ <location filename="organizercore.cpp" line="2165"/>
<source>login failed: %1. Download will not be associated with an account</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2020"/>
+ <location filename="organizercore.cpp" line="2173"/>
<source>login failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2030"/>
+ <location filename="organizercore.cpp" line="2183"/>
<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="2083"/>
+ <location filename="organizercore.cpp" line="2236"/>
<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="2086"/>
- <location filename="organizercore.cpp" line="2102"/>
+ <location filename="organizercore.cpp" line="2239"/>
+ <location filename="organizercore.cpp" line="2255"/>
<source>Description missing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2095"/>
+ <location filename="organizercore.cpp" line="2248"/>
<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="2129"/>
+ <location filename="organizercore.cpp" line="2282"/>
<source>failed to save load order: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="organizercore.cpp" line="2201"/>
+ <location filename="organizercore.cpp" line="2354"/>
<source>The designated write target &quot;%1&quot; is not enabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4434,135 +4701,135 @@ Continue?</source>
<context>
<name>PluginList</name>
<message>
- <location filename="pluginlist.cpp" line="102"/>
+ <location filename="pluginlist.cpp" line="104"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="103"/>
+ <location filename="pluginlist.cpp" line="105"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="104"/>
+ <location filename="pluginlist.cpp" line="106"/>
<source>Mod Index</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="105"/>
+ <location filename="pluginlist.cpp" line="107"/>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="106"/>
- <location filename="pluginlist.cpp" line="118"/>
+ <location filename="pluginlist.cpp" line="108"/>
+ <location filename="pluginlist.cpp" line="120"/>
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="114"/>
+ <location filename="pluginlist.cpp" line="116"/>
<source>Name of your mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="115"/>
+ <location filename="pluginlist.cpp" line="117"/>
<source>Load priority of your mod. The higher, the more &quot;important&quot; it is and thus overwrites data from plugins with lower priority.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="117"/>
+ <location filename="pluginlist.cpp" line="119"/>
<source>The modindex determines the formids of objects originating from this mods.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="215"/>
+ <location filename="pluginlist.cpp" line="228"/>
<source>failed to update esp info for file %1 (source id: %2), error: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="288"/>
+ <location filename="pluginlist.cpp" line="301"/>
<source>esp not found: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="336"/>
- <location filename="pluginlist.cpp" line="348"/>
+ <location filename="pluginlist.cpp" line="349"/>
+ <location filename="pluginlist.cpp" line="361"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="336"/>
+ <location filename="pluginlist.cpp" line="349"/>
<source>Really enable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="348"/>
+ <location filename="pluginlist.cpp" line="361"/>
<source>Really disable all plugins?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="438"/>
+ <location filename="pluginlist.cpp" line="466"/>
<source>The file containing locked plugin indices is broken</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="934"/>
- <location filename="pluginlist.cpp" line="938"/>
+ <location filename="pluginlist.cpp" line="963"/>
+ <location filename="pluginlist.cpp" line="967"/>
<source>&lt;b&gt;Origin&lt;/b&gt;: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="935"/>
+ <location filename="pluginlist.cpp" line="964"/>
<source>&lt;br&gt;&lt;b&gt;&lt;i&gt;This plugin can&apos;t be disabled (enforced by the game).&lt;/i&gt;&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="940"/>
+ <location filename="pluginlist.cpp" line="969"/>
<source>Author</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="943"/>
+ <location filename="pluginlist.cpp" line="972"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="946"/>
+ <location filename="pluginlist.cpp" line="975"/>
<source>Missing Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="953"/>
+ <location filename="pluginlist.cpp" line="982"/>
<source>Enabled Masters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="956"/>
+ <location filename="pluginlist.cpp" line="985"/>
<source>Loads Archives</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="957"/>
+ <location filename="pluginlist.cpp" line="986"/>
<source>There are Archives connected to this plugin. Their assets will be added to your game, overwriting in case of conflicts following the plugin order. Loose files will always overwrite assets from Archives. (This flag only checks for Archives from the same mod as the plugin)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="962"/>
+ <location filename="pluginlist.cpp" line="991"/>
<source>Loads INI settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="963"/>
+ <location filename="pluginlist.cpp" line="992"/>
<source>There is an ini file connected to this plugin. Its settings will be added to your game settings, overwriting in case of conflicts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="967"/>
+ <location filename="pluginlist.cpp" line="996"/>
<source>This ESP is flagged as an ESL. It will adhere to the ESP load order but the records will be loaded in ESL space.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="1142"/>
+ <location filename="pluginlist.cpp" line="1171"/>
<source>failed to restore load order for %1</source>
<translation type="unfinished"></translation>
</message>
@@ -4570,7 +4837,7 @@ Continue?</source>
<context>
<name>PluginListSortProxy</name>
<message>
- <location filename="pluginlistsortproxy.cpp" line="120"/>
+ <location filename="pluginlistsortproxy.cpp" line="119"/>
<source>Drag&amp;Drop is only supported when sorting by priority or mod index</source>
<translation type="unfinished"></translation>
</message>
@@ -4634,57 +4901,82 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="211"/>
+ <location filename="profile.cpp" line="259"/>
<source>failed to write mod list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="222"/>
+ <location filename="profile.cpp" line="270"/>
<source>failed to update tweaked ini file, wrong settings may be used: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="242"/>
+ <location filename="profile.cpp" line="290"/>
<source>failed to create tweaked ini: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="267"/>
+ <location filename="profile.cpp" line="315"/>
<source>failed to open %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="326"/>
+ <location filename="profile.cpp" line="374"/>
<source>&quot;%1&quot; is missing or inaccessible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="371"/>
- <location filename="profile.cpp" line="410"/>
- <location filename="profile.cpp" line="512"/>
- <location filename="profile.cpp" line="531"/>
- <location filename="profile.cpp" line="541"/>
+ <location filename="profile.cpp" line="419"/>
+ <location filename="profile.cpp" line="458"/>
+ <location filename="profile.cpp" line="555"/>
+ <location filename="profile.cpp" line="576"/>
+ <location filename="profile.cpp" line="586"/>
+ <location filename="profile.cpp" line="605"/>
+ <location filename="profile.cpp" line="615"/>
<source>invalid index %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="493"/>
+ <location filename="profile.cpp" line="536"/>
<source>Overwrite directory couldn&apos;t be parsed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="502"/>
+ <location filename="profile.cpp" line="547"/>
<source>invalid priority %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="725"/>
- <source>Delete savegames?</source>
+ <location filename="profile.cpp" line="786"/>
+ <source>Delete profile-specific save games?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="profile.cpp" line="787"/>
+ <source>Do you want to delete the profile-specific save games? (If you select &quot;No&quot;, the save games will show up again if you re-enable profile-specific save games)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="profile.cpp" line="817"/>
+ <source>Missing profile-specific game INI files!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="profile.cpp" line="818"/>
+ <source>Some of your profile-specific game INI files were missing. They will now be copied from the vanilla game folder. You might want double-check your settings.
+
+Missing files:
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="profile.cpp" line="834"/>
+ <source>Delete profile-specific game INI files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profile.cpp" line="726"/>
- <source>Do you want to delete local savegames? (If you select &quot;No&quot;, the save games will show up again if you re-enable local savegames)</source>
+ <location filename="profile.cpp" line="835"/>
+ <source>Do you want to delete the profile-specific game INI files? (If you select &quot;No&quot;, the INI files will be used again if you re-enable profile-specific game INI files.)</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4702,17 +4994,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="profileinputdialog.ui" line="30"/>
- <source>If checked, the new profile will use the default game settings.</source>
+ <source>If checked, the new profile will use the default game INI settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profileinputdialog.ui" line="33"/>
- <source>If checked, the new profile will use the default game settings instead of the &quot;global&quot; settings. Global settings are the settings you configure when running the game launcher directly, without MO.</source>
+ <source>If checked, the new profile will use the default game INI settings instead of the &quot;global&quot; settings. Global settings are the settings you configure when running the game launcher directly, without MO.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profileinputdialog.ui" line="36"/>
- <source>Default Game Settings</source>
+ <source>Default Game INI Settings</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4741,27 +5033,41 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="profilesdialog.ui" line="38"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked, save games are stored locally to this profile and will not appear when starting with a different profile.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="profilesdialog.ui" line="41"/>
- <source>If checked, savegames are local to this profile and will not appear when starting with a different profile.</source>
+ <source>If checked, save games are local to this profile and will not appear when starting with a different profile.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profilesdialog.ui" line="44"/>
- <source>Local Savegames</source>
+ <source>Use profile-specific Save Games</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="profilesdialog.ui" line="51"/>
- <source>Local Game Settings</source>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked MO2 will use his own profile-specific game INI files, so that the &amp;quot;Global&amp;quot; ones in MyGames can be left vanilla. This different set of INI files is then offered to the game instead of the default one.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="profilesdialog.ui" line="54"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked, MO2 will use a local set of game INI files (configuration and settings files), different from the default ones found in MyGames. This way changes to the INI settings will only affect this profile and the Global INI files can remain vanilla. MO2 will then show the profile INI files to the game instead of the Global ones.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="profilesdialog.ui" line="57"/>
+ <source>Use profile-specific Game INI Files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="61"/>
+ <location filename="profilesdialog.ui" line="67"/>
<source>This ensures data files from mods are actually used. You want to enable this unless you use a different tool for Archive Invalidation.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="64"/>
+ <location filename="profilesdialog.ui" line="70"/>
<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; }
@@ -4773,65 +5079,65 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="74"/>
+ <location filename="profilesdialog.ui" line="80"/>
<source>Automatic Archive Invalidation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="85"/>
- <location filename="profilesdialog.ui" line="88"/>
+ <location filename="profilesdialog.ui" line="91"/>
+ <location filename="profilesdialog.ui" line="94"/>
<source>Create a new profile from scratch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="91"/>
+ <location filename="profilesdialog.ui" line="97"/>
<source>Create</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="101"/>
+ <location filename="profilesdialog.ui" line="107"/>
<source>Clone the selected profile</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="104"/>
+ <location filename="profilesdialog.ui" line="110"/>
<source>This creates a new profile with the same settings and active mods as the selected one.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="107"/>
+ <location filename="profilesdialog.ui" line="113"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="117"/>
- <location filename="profilesdialog.ui" line="120"/>
+ <location filename="profilesdialog.ui" line="123"/>
+ <location filename="profilesdialog.ui" line="126"/>
<source>Delete the selected Profile. This can not be un-done!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="123"/>
+ <location filename="profilesdialog.ui" line="129"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="133"/>
+ <location filename="profilesdialog.ui" line="139"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="143"/>
- <location filename="profilesdialog.ui" line="146"/>
+ <location filename="profilesdialog.ui" line="149"/>
+ <location filename="profilesdialog.ui" line="152"/>
<source>Transfer save games to the selected profile.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="149"/>
+ <location filename="profilesdialog.ui" line="155"/>
<source>Transfer Saves</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="profilesdialog.ui" line="172"/>
+ <location filename="profilesdialog.ui" line="178"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -4888,7 +5194,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="profilesdialog.cpp" line="194"/>
- <source>Are you sure you want to remove this profile (including local savegames if any)?</source>
+ <source>Are you sure you want to remove this profile (including profile-specific save games, if any)?</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -4923,12 +5229,31 @@ p, li { white-space: pre-wrap; }
</message>
</context>
<context>
+ <name>QApplication</name>
+ <message>
+ <location filename="../../uibase/src/registry.cpp" line="36"/>
+ <source>INI file is read-only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../uibase/src/registry.cpp" line="37"/>
+ <location filename="../../uibase/src/textviewer.cpp" line="133"/>
+ <source>Mod Organizer is attempting to write to &quot;%1&quot; which is currently set to read-only. Clear the read-only flag to allow the write?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../uibase/src/textviewer.cpp" line="132"/>
+ <source>File is read-only</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>QObject</name>
<message>
<location filename="../../uibase/src/report.cpp" line="34"/>
<location filename="../../uibase/src/report.cpp" line="37"/>
<location filename="main.cpp" line="98"/>
- <location filename="organizercore.cpp" line="709"/>
+ <location filename="organizercore.cpp" line="715"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@@ -5028,12 +5353,13 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="helper.cpp" line="55"/>
+ <location filename="helper.cpp" line="56"/>
+ <location filename="helper.cpp" line="65"/>
<source>helper failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="helper.cpp" line="71"/>
+ <location filename="helper.cpp" line="81"/>
<source>failed to determine account name</source>
<translation type="unfinished"></translation>
</message>
@@ -5049,135 +5375,137 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="81"/>
+ <location filename="instancemanager.cpp" line="82"/>
<source>Deleting folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="82"/>
+ <location filename="instancemanager.cpp" line="83"/>
<source>I&apos;m about to delete the following folder: &quot;%1&quot;. Proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="103"/>
+ <location filename="instancemanager.cpp" line="104"/>
<source>Choose Instance to Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="104"/>
+ <location filename="instancemanager.cpp" line="105"/>
<source>Be Carefull! Deleting an Instance will remove all your files for that Instance (mods, downloads, profiles, configuration, ...). Custom paths outside of the instance folder for downloads, mods, etc. will be left untoched.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="117"/>
+ <location filename="instancemanager.cpp" line="118"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="118"/>
+ <location filename="instancemanager.cpp" line="119"/>
<source>Are you really sure you want to delete the Instance &quot;%1&quot; with all its files?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="122"/>
+ <location filename="instancemanager.cpp" line="123"/>
<source>Failed to delete Instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="123"/>
+ <location filename="instancemanager.cpp" line="124"/>
<source>Could not delete Instance &quot;%1&quot;.
If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="138"/>
+ <location filename="instancemanager.cpp" line="139"/>
<source>Enter a Name for the new Instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="139"/>
- <source>Enter a new name or select one from the suggested list:</source>
+ <location filename="instancemanager.cpp" line="140"/>
+ <source>Enter a new name or select one from the suggested list:
+(This is just a name for the Instance and can be whatever you wish,
+ the actual game selection will happen on the next screen regardless of chosen name)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="148"/>
- <location filename="instancemanager.cpp" line="219"/>
+ <location filename="instancemanager.cpp" line="151"/>
+ <location filename="instancemanager.cpp" line="222"/>
<source>Canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="154"/>
+ <location filename="instancemanager.cpp" line="157"/>
<source>Invalid instance name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="155"/>
+ <location filename="instancemanager.cpp" line="158"/>
<source>The instance name &quot;%1&quot; is invalid. Use the name &quot;%2&quot; instead?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="170"/>
+ <location filename="instancemanager.cpp" line="173"/>
<source>The instance &quot;%1&quot; already exists.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="171"/>
+ <location filename="instancemanager.cpp" line="174"/>
<source>Please choose a different instance name, like: &quot;%1 1&quot; .</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="190"/>
+ <location filename="instancemanager.cpp" line="193"/>
<source>Choose Instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="191"/>
+ <location filename="instancemanager.cpp" line="194"/>
<source>Each Instance is a full set of MO data files (mods, downloads, profiles, configuration, ...). You can use multiple instances for different games. Instances are stored in Appdata and can be accessed by all MO installations. If your MO folder is writable, you can also store a single instance locally (called a Portable install, and all the MO data files will be inside the installation folder).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="203"/>
+ <location filename="instancemanager.cpp" line="206"/>
<source>New</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="204"/>
+ <location filename="instancemanager.cpp" line="207"/>
<source>Create a new instance.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="208"/>
+ <location filename="instancemanager.cpp" line="211"/>
<source>Portable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="209"/>
+ <location filename="instancemanager.cpp" line="212"/>
<source>Use MO folder for data.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="213"/>
+ <location filename="instancemanager.cpp" line="216"/>
<source>Manage Instances</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="214"/>
+ <location filename="instancemanager.cpp" line="217"/>
<source>Delete an Instance.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="265"/>
- <location filename="profile.cpp" line="66"/>
+ <location filename="instancemanager.cpp" line="268"/>
+ <location filename="profile.cpp" line="69"/>
<source>failed to create %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="268"/>
+ <location filename="instancemanager.cpp" line="271"/>
<source>Data directory created</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="instancemanager.cpp" line="269"/>
+ <location filename="instancemanager.cpp" line="272"/>
<source>New data directory created at %1. If you don&apos;t want to store a lot of data there, reconfigure the storage directories via settings.</source>
<translation type="unfinished"></translation>
</message>
@@ -5247,7 +5575,7 @@ If the folder was still in use, restart MO and try again.</source>
</message>
<message>
<location filename="main.cpp" line="99"/>
- <location filename="organizercore.cpp" line="710"/>
+ <location filename="organizercore.cpp" line="716"/>
<source>Failed to create &quot;%1&quot;. Your user account probably lacks permission.</source>
<translation type="unfinished"></translation>
</message>
@@ -5269,7 +5597,7 @@ If the folder was still in use, restart MO and try again.</source>
</message>
<message>
<location filename="main.cpp" line="385"/>
- <source>No game identified in &quot;%1&quot;. The directory is required to contain the game binary and its launcher.</source>
+ <source>No game identified in &quot;%1&quot;. The directory is required to contain the game binary.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -5288,34 +5616,34 @@ If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="682"/>
- <location filename="settings.cpp" line="968"/>
+ <location filename="main.cpp" line="685"/>
+ <location filename="settings.cpp" line="1135"/>
<source>Mod Organizer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="683"/>
+ <location filename="main.cpp" line="686"/>
<source>An instance of Mod Organizer is already running</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="main.cpp" line="698"/>
+ <location filename="main.cpp" line="701"/>
<source>Failed to set up instance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="869"/>
+ <location filename="mainwindow.cpp" line="937"/>
<source>Please use &quot;Help&quot; from the toolbar to get usage instructions to all elements</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1271"/>
- <location filename="mainwindow.cpp" line="4004"/>
+ <location filename="mainwindow.cpp" line="1426"/>
+ <location filename="mainwindow.cpp" line="4911"/>
<source>&lt;Manage...&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="mainwindow.cpp" line="1283"/>
+ <location filename="mainwindow.cpp" line="1438"/>
<source>failed to parse profile %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -5351,12 +5679,12 @@ If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="514"/>
+ <location filename="pluginlist.cpp" line="542"/>
<source>failed to access %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="pluginlist.cpp" line="528"/>
+ <location filename="pluginlist.cpp" line="556"/>
<source>failed to set file time %1</source>
<translation type="unfinished"></translation>
</message>
@@ -5366,37 +5694,39 @@ If the folder was still in use, restart MO and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="975"/>
+ <location filename="settings.cpp" line="1142"/>
<source>Script Extender</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="982"/>
+ <location filename="settings.cpp" line="1149"/>
<source>Proxy DLL</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="143"/>
+ <location filename="spawn.cpp" line="147"/>
<source>failed to spawn &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="150"/>
+ <location filename="spawn.cpp" line="152"/>
<source>Elevation required</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="151"/>
+ <location filename="spawn.cpp" line="153"/>
<source>This process requires elevation to run.
This is a potential security risk so I highly advice you to investigate if
&quot;%1&quot;
can be installed to work without elevation.
-Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe to make changes to the system)</source>
+Restart Mod Organizer as an elevated process?
+You will be asked if you want to allow helper.exe to make changes to the system. You will need to relaunch the process above manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="spawn.cpp" line="166"/>
+ <location filename="spawn.cpp" line="164"/>
+ <location filename="spawn.cpp" line="178"/>
<source>failed to spawn &quot;%1&quot;: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -5562,12 +5892,12 @@ Select Show Details option to see the full change-log.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="337"/>
+ <location filename="selfupdater.cpp" line="339"/>
<source>Failed to start %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="selfupdater.cpp" line="347"/>
+ <location filename="selfupdater.cpp" line="348"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
@@ -5575,31 +5905,48 @@ Select Show Details option to see the full change-log.</source>
<context>
<name>Settings</name>
<message>
- <location filename="settings.cpp" line="143"/>
+ <location filename="settings.cpp" line="146"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="144"/>
+ <location filename="settings.cpp" line="147"/>
<source>Sorry, failed to start the helper application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="430"/>
- <location filename="settings.cpp" line="449"/>
+ <location filename="settings.cpp" line="513"/>
+ <location filename="settings.cpp" line="532"/>
<source>attempt to store setting for unknown plugin &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="759"/>
+ <location filename="settings.cpp" line="679"/>
+ <location filename="settings.cpp" line="914"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settings.cpp" line="760"/>
+ <location filename="settings.cpp" line="680"/>
+ <source>Failed to retrieve a Nexus API key! Please try again.A browser window should open asking you to authorize.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settings.cpp" line="915"/>
<source>Failed to create &quot;%1&quot;, you may not have the necessary permission. path remains unchanged.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="settings.cpp" line="1188"/>
+ <source>Restart Mod Organizer?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settings.cpp" line="1189"/>
+ <source>In order to reset the window geometries, MO must be restarted.
+Restart it now?</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SettingsDialog</name>
@@ -5673,136 +6020,188 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
</message>
<message>
<location filename="settingsdialog.ui" line="99"/>
- <source>If checked, the download interface will be more compact.</source>
+ <source>Colors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="102"/>
- <source>Compact Download Interface</source>
+ <location filename="settingsdialog.ui" line="105"/>
+ <location filename="settingsdialog.ui" line="108"/>
+ <source>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="109"/>
- <source>If checked, the download list will display meta information instead of file names.</source>
+ <location filename="settingsdialog.ui" line="111"/>
+ <source>Show mod list separator colors on the scrollbar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="112"/>
- <source>Download Meta Information</source>
+ <location filename="settingsdialog.ui" line="121"/>
+ <source>Plugin is Contained in selected Mod</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="128"/>
+ <source>Is overwritten (loose files)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="135"/>
+ <source>Is overwriting (loose files)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="142"/>
+ <source>Reset Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="149"/>
+ <source>Mod Contains selected Plugin</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="125"/>
+ <location filename="settingsdialog.ui" line="156"/>
+ <source>Is overwritten (archive files)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="163"/>
+ <source>Is overwriting (archive files)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="173"/>
+ <location filename="settingsdialog.ui" line="176"/>
+ <source>Modify the categories available to arrange your mods.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="179"/>
+ <source>Configure Mod Categories</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="192"/>
<source>Reset stored information from dialogs.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="128"/>
+ <location filename="settingsdialog.ui" line="195"/>
<source>This will make all dialogs show up again where you checked the &quot;Remember selection&quot;-box.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="131"/>
+ <location filename="settingsdialog.ui" line="198"/>
<source>Reset Dialogs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="151"/>
- <location filename="settingsdialog.ui" line="154"/>
- <source>Modify the categories available to arrange your mods.</source>
+ <location filename="settingsdialog.ui" line="205"/>
+ <source>If checked, the download interface will be more compact.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="157"/>
- <source>Configure Mod Categories</source>
+ <location filename="settingsdialog.ui" line="208"/>
+ <source>Compact Download Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="228"/>
+ <source>If checked, the download list will display meta information instead of file names.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="168"/>
+ <location filename="settingsdialog.ui" line="231"/>
+ <source>Download Meta Information</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="242"/>
<source>Paths</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="176"/>
- <location filename="settingsdialog.ui" line="193"/>
- <location filename="settingsdialog.ui" line="290"/>
+ <location filename="settingsdialog.ui" line="250"/>
+ <location filename="settingsdialog.ui" line="267"/>
+ <location filename="settingsdialog.ui" line="364"/>
+ <location filename="settingsdialog.ui" line="422"/>
<source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="203"/>
+ <location filename="settingsdialog.ui" line="277"/>
<source>Caches</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="210"/>
+ <location filename="settingsdialog.ui" line="284"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="217"/>
- <location filename="settingsdialog.ui" line="220"/>
+ <location filename="settingsdialog.ui" line="291"/>
+ <location filename="settingsdialog.ui" line="294"/>
<source>Directory where downloads are stored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="237"/>
+ <location filename="settingsdialog.ui" line="311"/>
<source>Downloads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="257"/>
+ <location filename="settingsdialog.ui" line="331"/>
<source>Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="280"/>
+ <location filename="settingsdialog.ui" line="354"/>
<source>Directory where mods are stored.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="283"/>
+ <location filename="settingsdialog.ui" line="357"/>
<source>Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don&apos;t exist in the new location (with the same name).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="307"/>
+ <location filename="settingsdialog.ui" line="381"/>
<source>Mods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="327"/>
+ <location filename="settingsdialog.ui" line="401"/>
<source>Managed Game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="334"/>
+ <location filename="settingsdialog.ui" line="408"/>
<source>Base Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="341"/>
+ <location filename="settingsdialog.ui" line="415"/>
<source>Use %BASE_DIR% to refer to the Base Directory.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="363"/>
+ <location filename="settingsdialog.ui" line="444"/>
<source>Important: All directories have to be writeable!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="371"/>
- <location filename="settingsdialog.ui" line="387"/>
+ <location filename="settingsdialog.ui" line="452"/>
+ <location filename="settingsdialog.ui" line="468"/>
<source>Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="377"/>
+ <location filename="settingsdialog.ui" line="458"/>
<source>Allows automatic log-in when the Nexus-Page for the game is clicked.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="380"/>
+ <location filename="settingsdialog.ui" line="461"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@@ -5811,137 +6210,142 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="395"/>
+ <location filename="settingsdialog.ui" line="476"/>
<source>Connect to Nexus</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="406"/>
+ <location filename="settingsdialog.ui" line="487"/>
<source>Remove cache and cookies. Forces a new login.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="409"/>
+ <location filename="settingsdialog.ui" line="490"/>
<source>Clear Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="438"/>
+ <location filename="settingsdialog.ui" line="521"/>
<source>Disable automatic internet features</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="441"/>
+ <location filename="settingsdialog.ui" line="524"/>
<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="444"/>
+ <location filename="settingsdialog.ui" line="527"/>
<source>Offline Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="451"/>
+ <location filename="settingsdialog.ui" line="534"/>
<source>Use a proxy for network connections.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="454"/>
+ <location filename="settingsdialog.ui" line="537"/>
<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="457"/>
+ <location filename="settingsdialog.ui" line="540"/>
<source>Use HTTP Proxy (Uses System Settings)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="466"/>
+ <location filename="settingsdialog.ui" line="547"/>
+ <source>Endorsement Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="561"/>
<source>Associate with &quot;Download with manager&quot; links</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="495"/>
+ <location filename="settingsdialog.ui" line="590"/>
<source>Known Servers (updated on download)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="516"/>
+ <location filename="settingsdialog.ui" line="611"/>
<source>Preferred Servers (Drag &amp; Drop)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="551"/>
+ <location filename="settingsdialog.ui" line="646"/>
<source>Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="557"/>
+ <location filename="settingsdialog.ui" line="652"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="567"/>
+ <location filename="settingsdialog.ui" line="662"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="597"/>
+ <location filename="settingsdialog.ui" line="692"/>
<source>If you save your steam user ID and password here, they will be used when logging into steam. Note, however, your password will be stored unencrypted, so make sure your computer is secure.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="624"/>
+ <location filename="settingsdialog.ui" line="719"/>
<source>Plugins</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="646"/>
+ <location filename="settingsdialog.ui" line="744"/>
<source>Author:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="660"/>
+ <location filename="settingsdialog.ui" line="758"/>
<source>Version:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="674"/>
+ <location filename="settingsdialog.ui" line="772"/>
<source>Description:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="712"/>
+ <location filename="settingsdialog.ui" line="810"/>
<source>Key</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="717"/>
+ <location filename="settingsdialog.ui" line="815"/>
<source>Value</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="729"/>
+ <location filename="settingsdialog.ui" line="827"/>
<source>Blacklisted Plugins (use &lt;del&gt; to remove):</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="740"/>
+ <location filename="settingsdialog.ui" line="838"/>
<source>Workarounds</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="748"/>
+ <location filename="settingsdialog.ui" line="846"/>
<source>Steam App ID</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="768"/>
+ <location filename="settingsdialog.ui" line="866"/>
<source>The Steam AppID for your game</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="771"/>
+ <location filename="settingsdialog.ui" line="869"/>
<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; }
@@ -5957,17 +6361,17 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="802"/>
+ <location filename="settingsdialog.ui" line="900"/>
<source>Load Mechanism</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="822"/>
+ <location filename="settingsdialog.ui" line="920"/>
<source>Select loading mechanism. See help for details.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="825"/>
+ <location filename="settingsdialog.ui" line="923"/>
<source>Mod Organizer needs a dll to be injected into the game so all mods are visible to it.
There are several means to do this:
*Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it.
@@ -5978,17 +6382,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="842"/>
+ <location filename="settingsdialog.ui" line="940"/>
<source>NMM Version</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="862"/>
+ <location filename="settingsdialog.ui" line="960"/>
<source>The Version of Nexus Mod Manager to impersonate.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="865"/>
+ <location filename="settingsdialog.ui" line="963"/>
<source>Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in.
On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn&apos;t need an update. Therefore you can configure the version to identify as here.
Please note that MO does identify itself as MO to the webserver, it&apos;s not lying about what it is. It is merely adding a &quot;compatible&quot; NMM version to the user agent.
@@ -5997,127 +6401,178 @@ tl;dr-version: If Nexus-features don&apos;t work, insert the current version num
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="890"/>
+ <location filename="settingsdialog.ui" line="990"/>
<source>Enforces that inactive ESPs and ESMs are never loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="893"/>
+ <location filename="settingsdialog.ui" line="993"/>
<source>It seems that the Games occasionally load ESP or ESM files even if they haven&apos;t been activated as plugins.
I don&apos;t yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="897"/>
+ <location filename="settingsdialog.ui" line="997"/>
<source>Hide inactive ESPs/ESMs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="904"/>
+ <location filename="settingsdialog.ui" line="1004"/>
+ <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="1007"/>
+ <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="1013"/>
+ <source>Display mods installed outside MO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1023"/>
<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="907"/>
+ <location filename="settingsdialog.ui" line="1026"/>
<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="911"/>
+ <location filename="settingsdialog.ui" line="1030"/>
<source>Force-enable game files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="921"/>
- <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>
+ <location filename="settingsdialog.ui" line="1040"/>
+ <location filename="settingsdialog.ui" line="1043"/>
+ <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="924"/>
- <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="1046"/>
+ <source>Lock GUI when running executable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="930"/>
- <source>Display mods installed outside MO</source>
+ <location filename="settingsdialog.ui" line="1056"/>
+ <source>Enable parsing of Archives. Has negative effects on performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="940"/>
- <location filename="settingsdialog.ui" line="944"/>
+ <location filename="settingsdialog.ui" line="1059"/>
+ <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="1062"/>
+ <source>Enable parsing of Archives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1074"/>
+ <location filename="settingsdialog.ui" line="1078"/>
<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="948"/>
+ <location filename="settingsdialog.ui" line="1082"/>
<source>Back-date BSAs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="972"/>
- <source>These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here.</source>
+ <location filename="settingsdialog.ui" line="1093"/>
+ <source>Add executables to the blacklist to prevent them from
+accessing the virtual file system. This is useful to prevent
+unintended programs from being hooked. Hooking unintended
+programs may affect the execution of these programs or the
+programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="983"/>
- <source>Diagnostics</source>
+ <location filename="settingsdialog.ui" line="1100"/>
+ <source>Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="991"/>
- <source>Log Level</source>
+ <location filename="settingsdialog.ui" line="1103"/>
+ <source>Configure Executables Blacklist</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="998"/>
- <source>Decides the amount of data printed to &quot;ModOrganizer.log&quot;</source>
+ <location filename="settingsdialog.ui" line="1113"/>
+ <location filename="settingsdialog.ui" line="1116"/>
+ <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="1001"/>
- <source>
- Decides the amount of data printed to &quot;ModOrganizer.log&quot;.
- &quot;Debug&quot; produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the &quot;Info&quot; level for regluar use. On the &quot;Error&quot; level the log file usually remains empty.
- </source>
+ <location filename="settingsdialog.ui" line="1119"/>
+ <source>Reset Window Geometries</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1008"/>
- <source>Debug</source>
+ <location filename="settingsdialog.ui" line="1142"/>
+ <source>These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1013"/>
- <source>Info (recommended)</source>
+ <location filename="settingsdialog.ui" line="1153"/>
+ <source>Diagnostics</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1018"/>
- <source>Warning</source>
+ <location filename="settingsdialog.ui" line="1161"/>
+ <source>Max Dumps To Keep</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1023"/>
- <source>Error</source>
+ <location filename="settingsdialog.ui" line="1181"/>
+ <source>Maximum number of crash dumps to keep on disk. Use 0 for unlimited.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1184"/>
+ <source>
+ Maximum number of crash dumps to keep on disk. Use 0 for unlimited.
+ Set &quot;Crash Dumps&quot; above to None to disable crash dump collection.
+ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1196"/>
+ <source>Hint: right click link and copy link location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1199"/>
+ <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.ui" line="1048"/>
+ <location filename="settingsdialog.ui" line="1216"/>
<source>Crash Dumps</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1055"/>
+ <location filename="settingsdialog.ui" line="1223"/>
<source>Decides which type of crash dumps are collected when injected processes crash.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1058"/>
+ <location filename="settingsdialog.ui" line="1226"/>
<source>
Decides which type of crash dumps are collected when injected processes crash.
&quot;None&quot; Disables the generation of crash dumps by MO.
@@ -6128,105 +6583,131 @@ For the other games this is not a sufficient replacement for AI!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1068"/>
+ <location filename="settingsdialog.ui" line="1236"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1073"/>
+ <location filename="settingsdialog.ui" line="1241"/>
<source>Mini (recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1078"/>
+ <location filename="settingsdialog.ui" line="1246"/>
<source>Data</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1083"/>
+ <location filename="settingsdialog.ui" line="1251"/>
<source>Full</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1095"/>
- <source>Max Dumps To Keep</source>
+ <location filename="settingsdialog.ui" line="1279"/>
+ <source>Log Level</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1115"/>
- <source>Maximum number of crash dumps to keep on disk. Use 0 for unlimited.</source>
+ <location filename="settingsdialog.ui" line="1286"/>
+ <source>Decides the amount of data printed to &quot;ModOrganizer.log&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1118"/>
+ <location filename="settingsdialog.ui" line="1289"/>
<source>
- Maximum number of crash dumps to keep on disk. Use 0 for unlimited.
- Set &quot;Crash Dumps&quot; above to None to disable crash dump collection.
+ Decides the amount of data printed to &quot;ModOrganizer.log&quot;.
+ &quot;Debug&quot; produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the &quot;Info&quot; level for regluar use. On the &quot;Error&quot; level the log file usually remains empty.
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1130"/>
- <source>Hint: right click link and copy link location</source>
+ <location filename="settingsdialog.ui" line="1296"/>
+ <source>Debug</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.ui" line="1133"/>
- <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="1301"/>
+ <source>Info (recommended)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1306"/>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.ui" line="1311"/>
+ <source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="76"/>
+ <location filename="settingsdialog.cpp" line="109"/>
<source>Confirm</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="77"/>
+ <location filename="settingsdialog.cpp" line="110"/>
<source>Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="125"/>
+ <location filename="settingsdialog.cpp" line="154"/>
+ <source>Executables Blacklist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.cpp" line="155"/>
+ <source>Enter one executable per line to be blacklisted from the virtual file system.
+Mods and other virtualized files will not be visible to these executables and
+any executables launched by them.
+
+Example:
+ Chrome.exe
+ Firefox.exe</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.cpp" line="188"/>
<source>Select base directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="136"/>
+ <location filename="settingsdialog.cpp" line="199"/>
<source>Select download directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="147"/>
+ <location filename="settingsdialog.cpp" line="210"/>
<source>Select mod directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="158"/>
+ <location filename="settingsdialog.cpp" line="221"/>
<source>Select cache directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="169"/>
+ <location filename="settingsdialog.cpp" line="232"/>
<source>Select profiles directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="180"/>
+ <location filename="settingsdialog.cpp" line="243"/>
<source>Select overwrite directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="188"/>
+ <location filename="settingsdialog.cpp" line="253"/>
+ <source>Select game executable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="settingsdialog.cpp" line="332"/>
<source>Confirm?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="settingsdialog.cpp" line="189"/>
+ <location filename="settingsdialog.cpp" line="333"/>
<source>This will make all dialogs show up again where you checked the &quot;Remember selection&quot;-box. Continue?</source>
<translation type="unfinished"></translation>
</message>
@@ -6338,7 +6819,7 @@ For the other games this is not a sufficient replacement for AI!</source>
<name>TransferSavesDialog</name>
<message>
<location filename="transfersavesdialog.ui" line="14"/>
- <source>Transfer Savegames</source>
+ <source>Transfer Save Games</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -6430,7 +6911,7 @@ On Windows XP:
<context>
<name>UsvfsConnector</name>
<message>
- <location filename="usvfsconnector.cpp" line="157"/>
+ <location filename="usvfsconnector.cpp" line="163"/>
<source>Preparing vfs</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index dca855c7..bfe36b24 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -307,9 +307,9 @@ OrganizerCore::OrganizerCore(const QSettings &initSettings)
SLOT(removeOrigin(QString)));
connect(NexusInterface::instance(m_PluginContainer)->getAccessManager(),
- SIGNAL(loginSuccessful(bool)), this, SLOT(loginSuccessful(bool)));
+ SIGNAL(validateSuccessful(bool)), this, SLOT(loginSuccessful(bool)));
connect(NexusInterface::instance(m_PluginContainer)->getAccessManager(),
- SIGNAL(loginFailed(QString)), this, SLOT(loginFailed(QString)));
+ SIGNAL(validateFailed(QString)), this, SLOT(loginFailed(QString)));
// This seems awfully imperative
connect(this, SIGNAL(managedGameChanged(MOBase::IPluginGame const *)),
diff --git a/src/settings.cpp b/src/settings.cpp
index 7a1d6737..fdc767bf 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -674,6 +674,13 @@ void Settings::processApiKey(const QString &apiKey)
m_Settings.setValue("Settings/nexus_api_key", obfuscate(apiKey));
}
+void Settings::clearApiKey(QPushButton *nexusButton)
+{
+ m_Settings.remove("Settings/nexus_api_key");
+ nexusButton->setEnabled(true);
+ nexusButton->setText("Connect to Nexus");
+}
+
void Settings::checkApiKey(QPushButton *nexusButton)
{
if (m_Settings.value("Settings/nexus_api_key", "").toString().isEmpty()) {
@@ -692,6 +699,7 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
connect(&dialog, SIGNAL(resetDialogs()), this, SLOT(resetDialogs()));
connect(&dialog, SIGNAL(processApiKey(const QString &)), this, SLOT(processApiKey(const QString &)));
connect(&dialog, SIGNAL(closeApiConnection(QPushButton *)), this, SLOT(checkApiKey(QPushButton *)));
+ connect(&dialog, SIGNAL(revokeApiKey(QPushButton *)), this, SLOT(clearApiKey(QPushButton *)));
std::vector<std::unique_ptr<SettingsTab>> tabs;
diff --git a/src/settings.h b/src/settings.h
index 49e5a5b6..d692497e 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -536,6 +536,7 @@ private slots:
void resetDialogs();
void processApiKey(const QString &);
+ void clearApiKey(QPushButton *nexusButton);
void checkApiKey(QPushButton *nexusButton);
signals:
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 4843dea5..f63b1a10 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -62,6 +62,7 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, QWidget *parent
connect(m_nexusLogin, SIGNAL(connected()), this, SLOT(dispatchLogin()));
connect(m_nexusLogin, SIGNAL(textMessageReceived(const QString &)), this, SLOT(receiveApiKey(const QString &)));
connect(m_nexusLogin, SIGNAL(disconnected()), this, SLOT(completeApiConnection()));
+ m_loginTimer.callOnTimeout(this, &SettingsDialog::loginPing);
}
SettingsDialog::~SettingsDialog()
@@ -124,18 +125,18 @@ bool SettingsDialog::getResetGeometries()
return ui->resetGeometryBtn->isChecked();
}
-void SettingsDialog::on_loginCheckBox_toggled(bool checked)
-{
- QLineEdit *usernameEdit = findChild<QLineEdit*>("usernameEdit");
- QLineEdit *passwordEdit = findChild<QLineEdit*>("passwordEdit");
- if (checked) {
- passwordEdit->setEnabled(true);
- usernameEdit->setEnabled(true);
- } else {
- passwordEdit->setEnabled(false);
- usernameEdit->setEnabled(false);
- }
-}
+//void SettingsDialog::on_loginCheckBox_toggled(bool checked)
+//{
+// QLineEdit *usernameEdit = findChild<QLineEdit*>("usernameEdit");
+// QLineEdit *passwordEdit = findChild<QLineEdit*>("passwordEdit");
+// if (checked) {
+// passwordEdit->setEnabled(true);
+// usernameEdit->setEnabled(true);
+// } else {
+// passwordEdit->setEnabled(false);
+// usernameEdit->setEnabled(false);
+// }
+//}
void SettingsDialog::on_categoriesBtn_clicked()
{
@@ -337,7 +338,7 @@ void SettingsDialog::on_resetDialogsButton_clicked()
void SettingsDialog::on_nexusConnect_clicked()
{
- ui->nexusConnect->setText("Connecting the API...");
+ ui->nexusConnect->setText("Connecting the API. Please login within the browser and accept the request. This will time out after 5 minutes.");
ui->nexusConnect->setDisabled(true);
QUrl url = QUrl("wss://sso.nexusmods.com:8443");
m_nexusLogin->open(url);
@@ -354,6 +355,20 @@ void SettingsDialog::dispatchLogin()
QString finalMessage(loginDoc.toJson());
m_nexusLogin->sendTextMessage(finalMessage);
QDesktopServices::openUrl(QUrl(QString("https://www.nexusmods.com/sso?id=") + QString(boost::uuids::to_string(sessionId).c_str())));
+ m_loginTimer.start(30000);
+}
+
+void SettingsDialog::loginPing()
+{
+ if (m_nexusLogin->isValid()) {
+ m_nexusLogin->ping();
+ m_totalPings++;
+ }
+ if (m_totalPings >= 10) {
+ m_loginTimer.stop();
+ m_totalPings = 0;
+ m_nexusLogin->close(QWebSocketProtocol::CloseCodeGoingAway, "Timeout: No response received after five minutes. Cancelling request.");
+ }
}
void SettingsDialog::receiveApiKey(const QString &apiKey)
@@ -361,6 +376,8 @@ void SettingsDialog::receiveApiKey(const QString &apiKey)
emit processApiKey(apiKey);
m_nexusLogin->close();
ui->nexusConnect->setText("Nexus API Key Stored");
+ m_loginTimer.stop();
+ m_totalPings = 0;
}
void SettingsDialog::completeApiConnection()
@@ -435,6 +452,11 @@ void SettingsDialog::on_clearCacheButton_clicked()
NexusInterface::instance(m_PluginContainer)->clearCache();
}
+void SettingsDialog::on_revokeNexusAuthButton_clicked()
+{
+ emit revokeApiKey(ui->nexusConnect);
+}
+
void SettingsDialog::normalizePath(QLineEdit *lineEdit)
{
QString text = lineEdit->text();
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index 90b60c91..d0f6a36c 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -26,6 +26,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QDialog>
#include <QWebSocket>
#include <QListWidgetItem>
+#include <QTimer>
class PluginContainer;
@@ -63,6 +64,7 @@ signals:
void resetDialogs();
void processApiKey(const QString &);
void closeApiConnection(QPushButton *);
+ void revokeApiKey(QPushButton *);
private:
@@ -90,7 +92,7 @@ public:
private slots:
- void on_loginCheckBox_toggled(bool checked);
+ //void on_loginCheckBox_toggled(bool checked);
void on_categoriesBtn_clicked();
@@ -114,6 +116,8 @@ private slots:
void on_clearCacheButton_clicked();
+ void on_revokeNexusAuthButton_clicked();
+
void on_browseBaseDirBtn_clicked();
void on_browseOverwriteDirBtn_clicked();
@@ -152,6 +156,8 @@ private slots:
void dispatchLogin();
+ void loginPing();
+
void receiveApiKey(const QString &apiKey);
void completeApiConnection();
@@ -170,6 +176,8 @@ private:
QString m_ExecutableBlacklist;
QWebSocket *m_nexusLogin;
+ QTimer m_loginTimer;
+ int m_totalPings = 0;
};
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index d3628ab3..127c94c7 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -1,1405 +1,1432 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>SettingsDialog</class>
- <widget class="QDialog" name="SettingsDialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>586</width>
- <height>486</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Settings</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
- <widget class="QWidget" name="generalTab">
- <attribute name="title">
- <string>General</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Language</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="languageBox">
- <property name="toolTip">
- <string>The display language</string>
- </property>
- <property name="whatsThis">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;The display language. This will only displaye languages for which you have a translation installed.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_4">
- <item>
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>Style</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="styleBox">
- <property name="toolTip">
- <string>graphical style</string>
- </property>
- <property name="whatsThis">
- <string>graphical style of the MO user interface</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QCheckBox" name="usePrereleaseBox">
- <property name="toolTip">
- <string>Update to non-stable releases.</string>
- </property>
- <property name="whatsThis">
- <string>If this is enabled, the integrated update mechanism will notify of all releases, including pre-releases (alphas, betas).
-
-Please use this only if you're sufficiently tech-savvy to investigate issues, look for known problems in the issue tracker and create meaningful reports.
-
-If you use pre-releases, never contact me directly by e-mail or via private messages!</string>
- </property>
- <property name="text">
- <string>Install Pre-releases (Betas)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>User interface</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="2" column="0" colspan="2">
- <widget class="QGroupBox" name="ModlistGroupBox">
- <property name="title">
- <string>Colors</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_5">
- <item row="6" column="0">
- <widget class="QCheckBox" name="colorSeparatorsBox">
- <property name="toolTip">
- <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
- </property>
- <property name="whatsThis">
- <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
- </property>
- <property name="text">
- <string>Show mod list separator colors on the scrollbar</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QPushButton" name="containedBtn">
- <property name="text">
- <string>Plugin is Contained in selected Mod</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QPushButton" name="overwrittenBtn">
- <property name="text">
- <string>Is overwritten (loose files)</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QPushButton" name="overwritingBtn">
- <property name="text">
- <string>Is overwriting (loose files)</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0" colspan="2">
- <widget class="QPushButton" name="resetColorsBtn">
- <property name="text">
- <string>Reset Colors</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QPushButton" name="containsBtn">
- <property name="text">
- <string>Mod Contains selected Plugin</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QPushButton" name="overwrittenArchiveBtn">
- <property name="text">
- <string>Is overwritten (archive files)</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QPushButton" name="overwritingArchiveBtn">
- <property name="text">
- <string>Is overwriting (archive files)</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="6" column="0" colspan="2">
- <widget class="QPushButton" name="categoriesBtn">
- <property name="toolTip">
- <string>Modify the categories available to arrange your mods.</string>
- </property>
- <property name="whatsThis">
- <string>Modify the categories available to arrange your mods.</string>
- </property>
- <property name="text">
- <string>Configure Mod Categories</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0" colspan="2">
- <widget class="QPushButton" name="resetDialogsButton">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Reset stored information from dialogs.</string>
- </property>
- <property name="whatsThis">
- <string>This will make all dialogs show up again where you checked the &quot;Remember selection&quot;-box.</string>
- </property>
- <property name="text">
- <string>Reset Dialogs</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QCheckBox" name="compactBox">
- <property name="toolTip">
- <string>If checked, the download interface will be more compact.</string>
- </property>
- <property name="text">
- <string>Compact Download Interface</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0" colspan="2">
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="1">
- <widget class="QCheckBox" name="showMetaBox">
- <property name="toolTip">
- <string>If checked, the download list will display meta information instead of file names.</string>
- </property>
- <property name="text">
- <string>Download Meta Information</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="pathsTab">
- <attribute name="title">
- <string>Paths</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_10">
- <item>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="6" column="2">
- <widget class="QPushButton" name="browseOverwriteDirBtn">
- <property name="text">
- <string>...</string>
- </property>
- </widget>
- </item>
- <item row="3" column="2">
- <widget class="QPushButton" name="browseModDirBtn">
- <property name="text">
- <string notr="true">...</string>
- </property>
- </widget>
- </item>
- <item row="6" column="1">
- <widget class="QLineEdit" name="overwriteDirEdit"/>
- </item>
- <item row="0" column="2">
- <widget class="QPushButton" name="browseBaseDirBtn">
- <property name="text">
- <string>...</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="baseDirEdit"/>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Caches</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_24">
- <property name="text">
- <string>Overwrite</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLineEdit" name="downloadDirEdit">
- <property name="toolTip">
- <string>Directory where downloads are stored.</string>
- </property>
- <property name="whatsThis">
- <string>Directory where downloads are stored.</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QLineEdit" name="cacheDirEdit"/>
- </item>
- <item row="4" column="2">
- <widget class="QPushButton" name="browseCacheDirBtn">
- <property name="text">
- <string notr="true">...</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>Downloads</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="verticalSpacer_8">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="label_22">
- <property name="text">
- <string>Profiles</string>
- </property>
- </widget>
- </item>
- <item row="2" column="2">
- <widget class="QPushButton" name="browseDownloadDirBtn">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string notr="true">...</string>
- </property>
- </widget>
- </item>
- <item row="5" column="1">
- <widget class="QLineEdit" name="profilesDirEdit"/>
- </item>
- <item row="3" column="1">
- <widget class="QLineEdit" name="modDirEdit">
- <property name="toolTip">
- <string>Directory where mods are stored.</string>
- </property>
- <property name="whatsThis">
- <string>Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don't exist in the new location (with the same name).</string>
- </property>
- </widget>
- </item>
- <item row="5" column="2">
- <widget class="QPushButton" name="browseProfilesDirBtn">
- <property name="text">
- <string>...</string>
- </property>
- </widget>
- </item>
- <item row="11" column="1">
- <widget class="QLineEdit" name="managedGameDirEdit">
- <property name="acceptDrops">
- <bool>false</bool>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>Mods</string>
- </property>
- </widget>
- </item>
- <item row="10" column="1">
- <spacer name="verticalSpacer_7">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="11" column="0">
- <widget class="QLabel" name="label_29">
- <property name="text">
- <string>Managed Game</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_25">
- <property name="text">
- <string>Base Directory</string>
- </property>
- </widget>
- </item>
- <item row="9" column="0" colspan="3">
- <widget class="QLabel" name="label_26">
- <property name="text">
- <string>Use %BASE_DIR% to refer to the Base Directory.</string>
- </property>
- </widget>
- </item>
- <item row="11" column="2">
- <widget class="QPushButton" name="browseGameDirBtn">
- <property name="text">
- <string>...</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer_6">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="label_23">
- <property name="text">
- <string>Important: All directories have to be writeable!</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="nexusTab">
- <attribute name="title">
- <string>Nexus</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <widget class="QGroupBox" name="nexusBox">
- <property name="toolTip">
- <string>Allows automatic log-in when the Nexus-Page for the game is clicked.</string>
- </property>
- <property name="whatsThis">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Allows automatic log-in when the Nexus-Page for the game is clicked. Please note that the obfuscation with which the password is stored in modorganizer.ini is not very strong. If you're worried someone might steal your password, don't store it here.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="title">
- <string>Nexus</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_10">
- <item>
- <widget class="QPushButton" name="nexusConnect">
- <property name="text">
- <string>Connect to Nexus</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_11">
- <item>
- <widget class="QPushButton" name="clearCacheButton">
- <property name="toolTip">
- <string>Remove cache and cookies. Forces a new login.</string>
- </property>
- <property name="text">
- <string>Clear Cache</string>
- </property>
- <property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/MO/gui/edit_clear</normaloff>:/MO/gui/edit_clear</iconset>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout_8">
- <item row="0" column="0">
- <widget class="QCheckBox" name="offlineBox">
- <property name="statusTip">
- <string>Disable automatic internet features</string>
- </property>
- <property name="whatsThis">
- <string>Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser)</string>
- </property>
- <property name="text">
- <string>Offline Mode</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="proxyBox">
- <property name="statusTip">
- <string>Use a proxy for network connections.</string>
- </property>
- <property name="whatsThis">
- <string>Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy.</string>
- </property>
- <property name="text">
- <string>Use HTTP Proxy (Uses System Settings)</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QCheckBox" name="endorsementBox">
- <property name="text">
- <string>Endorsement Integration</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_7">
- <item>
- <widget class="QPushButton" name="associateButton">
- <property name="text">
- <string>Associate with &quot;Download with manager&quot; links</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_8" stretch="0,0">
- <property name="spacing">
- <number>4</number>
- </property>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_6">
- <item>
- <widget class="QLabel" name="label_16">
- <property name="text">
- <string>Known Servers (updated on download)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QListWidget" name="knownServersList">
- <property name="dragDropMode">
- <enum>QAbstractItemView::DragDrop</enum>
- </property>
- <property name="defaultDropAction">
- <enum>Qt::MoveAction</enum>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_8">
- <item>
- <widget class="QLabel" name="label_17">
- <property name="text">
- <string>Preferred Servers (Drag &amp; Drop)</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QListWidget" name="preferredServersList">
- <property name="dragDropMode">
- <enum>QAbstractItemView::DragDrop</enum>
- </property>
- <property name="defaultDropAction">
- <enum>Qt::MoveAction</enum>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="steamTab">
- <attribute name="title">
- <string>Steam</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_3">
- <item row="0" column="0">
- <widget class="QLabel" name="label_19">
- <property name="text">
- <string>Username</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLineEdit" name="steamUserEdit"/>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_20">
- <property name="text">
- <string>Password</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="steamPassEdit">
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <spacer name="verticalSpacer_5">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Minimum</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QLabel" name="label_21">
- <property name="text">
- <string>If you save your steam user ID and password here, they will be used when logging into steam. Note, however, your password will be stored unencrypted, so make sure your computer is secure.</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <spacer name="verticalSpacer_4">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Expanding</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>232</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="pluginsTab">
- <attribute name="title">
- <string>Plugins</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_9" stretch="0,0,0">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_9">
- <item>
- <widget class="QListWidget" name="pluginsList">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="sortingEnabled">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_7" stretch="0,1">
- <item>
- <layout class="QFormLayout" name="formLayout_2">
- <item row="0" column="0">
- <widget class="QLabel" name="label_13">
- <property name="text">
- <string>Author:</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="authorLabel">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_15">
- <property name="text">
- <string>Version:</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="versionLabel">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_14">
- <property name="text">
- <string>Description:</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="descriptionLabel">
- <property name="text">
- <string/>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QTreeWidget" name="pluginSettingsList">
- <property name="indentation">
- <number>0</number>
- </property>
- <property name="rootIsDecorated">
- <bool>false</bool>
- </property>
- <property name="itemsExpandable">
- <bool>false</bool>
- </property>
- <property name="expandsOnDoubleClick">
- <bool>false</bool>
- </property>
- <attribute name="headerVisible">
- <bool>false</bool>
- </attribute>
- <attribute name="headerDefaultSectionSize">
- <number>170</number>
- </attribute>
- <column>
- <property name="text">
- <string>Key</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Value</string>
- </property>
- </column>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QLabel" name="label_18">
- <property name="text">
- <string>Blacklisted Plugins (use &lt;del&gt; to remove):</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QListWidget" name="pluginBlacklist"/>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="workaroundTab">
- <attribute name="title">
- <string>Workarounds</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_5">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0,0">
- <item>
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Steam App ID</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLineEdit" name="appIDEdit">
- <property name="toolTip">
- <string>The Steam AppID for your game</string>
- </property>
- <property name="whatsThis">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;The Steam App ID is required to directly start some games. For Skyrim, if this is not set or wrong, the &amp;quot;Mod Organizer&amp;quot; load mechanism may not work properly.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;The preset for this is the App ID of the &amp;quot;regular&amp;quot; version so in most cases, you should be set.&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;If you think you have a different version (GotY or something), follow these steps to get to the id:&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;1. Navigate to the game library in steam&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;2. right-click on the game you need the id for and choose &lt;/span&gt;&lt;span style=&quot; font-size:8pt; font-weight:600;&quot;&gt;Create desktop shortcut&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;3. right-click on the newly created shortcut on your desktop and select &lt;/span&gt;&lt;span style=&quot; font-size:8pt; font-weight:600;&quot;&gt;Properties&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;4. in the URL-field you should see something like this: &lt;/span&gt;&lt;span style=&quot; font-size:8pt; font-style:italic;&quot;&gt;steam://rungameid/22380&lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;22380 is the id you're looking for.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1">
- <property name="spacing">
- <number>7</number>
- </property>
- <item>
- <widget class="QLabel" name="label">
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="text">
- <string>Load Mechanism</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QComboBox" name="mechanismBox">
- <property name="toolTip">
- <string>Select loading mechanism. See help for details.</string>
- </property>
- <property name="whatsThis">
- <string>Mod Organizer needs a dll to be injected into the game so all mods are visible to it.
-There are several means to do this:
-*Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it.
-*Script Extender* In this mode, MO is installed as a Script Extender (obse, fose, nvse, skse) plugin.
-*Proxy DLL* In this mode, MO replaces one of the game's dlls with one that loads MO (and the original dll of course). This will ONLY work with Steam games and it has only been tested with Skyrim. Please use this only if the other mechanisms don't work.
-
-If you use the Steam version of Oblivion the default will NOT work. In this case, please install obse and use &quot;Script Extender&quot; as the load mechanism. Also you can then not start Oblivion from MO. Instead, use MO only to set up your mods, then quit and start Oblivion through Steam.</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,0,0">
- <item>
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>NMM Version</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLineEdit" name="nmmVersionEdit">
- <property name="toolTip">
- <string>The Version of Nexus Mod Manager to impersonate.</string>
- </property>
- <property name="whatsThis">
- <string>Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in.
-On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here.
-Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a &quot;compatible&quot; NMM version to the user agent.
-
-tl;dr-version: If Nexus-features don't work, insert the current version number of NMM here and try again.</string>
- </property>
- <property name="inputMask">
- <string notr="true">009.009.009</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="placeholderText">
- <string/>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QGridLayout" name="gridLayout_6">
- <item row="1" column="0">
- <widget class="QCheckBox" name="hideUncheckedBox">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="toolTip">
- <string>Enforces that inactive ESPs and ESMs are never loaded.</string>
- </property>
- <property name="whatsThis">
- <string>It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins.
-I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded.</string>
- </property>
- <property name="text">
- <string>Hide inactive ESPs/ESMs</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QCheckBox" name="displayForeignBox">
- <property name="toolTip">
- <string>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.</string>
- </property>
- <property name="whatsThis">
- <string>By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods.
-However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly.
-
-If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps, esms, and esls) displayed in the right pane are completely unaffected by this feature.</string>
- </property>
- <property name="text">
- <string>Display mods installed outside MO</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QCheckBox" name="forceEnableBox">
- <property name="toolTip">
- <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)</string>
- </property>
- <property name="whatsThis">
- <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)
-Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled.</string>
- </property>
- <property name="text">
- <string>Force-enable game files</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="lockGUIBox">
- <property name="toolTip">
- <string>Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior.</string>
- </property>
- <property name="whatsThis">
- <string>Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior.</string>
- </property>
- <property name="text">
- <string>Lock GUI when running executable</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QCheckBox" name="enableArchiveParsingBox">
- <property name="toolTip">
- <string>Enable parsing of Archives. This is an Experimental Feature. Has negative effects on performance and known incorrectness.</string>
- </property>
- <property name="whatsThis">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, MO will parse archive files (BSA, BA2) to calculate conflicts between the contents of the archive files and other loose files. This process has a noticeable cost in performance.&lt;/p&gt;&lt;p&gt;This feature should not be confused with the archive management feature offered by MO1. MO2 will only show conflicts with archives and will NOT load them into the game or program.&lt;/p&gt;&lt;p&gt;If you disable this feature, MO will only display conflicts between loose files.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="text">
- <string>Enable parsing of Archives (Experimental Feature)</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="bsaDateBtn">
- <property name="toolTip">
- <string>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!</string>
- </property>
- <property name="whatsThis">
- <string>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!</string>
- </property>
- <property name="text">
- <string>Back-date BSAs</string>
- </property>
- <property name="icon">
- <iconset>
- <normaloff>:/MO/gui/resources/emblem-readonly.png</normaloff>:/MO/gui/resources/emblem-readonly.png</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="execBlacklistBtn">
- <property name="toolTip">
- <string>Add executables to the blacklist to prevent them from
-accessing the virtual file system. This is useful to prevent
-unintended programs from being hooked. Hooking unintended
-programs may affect the execution of these programs or the
-programs you are intentionally running.</string>
- </property>
- <property name="whatsThis">
- <string>Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running.</string>
- </property>
- <property name="text">
- <string>Configure Executables Blacklist</string>
- </property>
- <property name="autoDefault">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="resetGeometryBtn">
- <property name="toolTip">
- <string>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.</string>
- </property>
- <property name="whatsThis">
- <string>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.</string>
- </property>
- <property name="text">
- <string>Reset Window Geometries</string>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="label_6">
- <property name="text">
- <string>These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here.</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="diagnosticsTab">
- <attribute name="title">
- <string>Diagnostics</string>
- </attribute>
- <layout class="QGridLayout" name="gridLayout_4">
- <item row="2" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_13">
- <item>
- <widget class="QLabel" name="label_28">
- <property name="text">
- <string>Max Dumps To Keep</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_6">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>60</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QSpinBox" name="dumpsMaxEdit">
- <property name="toolTip">
- <string>Maximum number of crash dumps to keep on disk. Use 0 for unlimited.</string>
- </property>
- <property name="whatsThis">
- <string>
- Maximum number of crash dumps to keep on disk. Use 0 for unlimited.
- Set &quot;Crash Dumps&quot; above to None to disable crash dump collection.
- </string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="diagnosticsExplainedLabel">
- <property name="toolTip">
- <string>Hint: right click link and copy link location</string>
- </property>
- <property name="text">
- <string>
- 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.
- </string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_12">
- <item>
- <widget class="QLabel" name="label_27">
- <property name="text">
- <string>Crash Dumps</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="dumpsTypeBox">
- <property name="toolTip">
- <string>Decides which type of crash dumps are collected when injected processes crash.</string>
- </property>
- <property name="whatsThis">
- <string>
- Decides which type of crash dumps are collected when injected processes crash.
- &quot;None&quot; Disables the generation of crash dumps by MO.
- &quot;Mini&quot; Default level which generates small dumps (only stack traces).
- &quot;Data&quot; Much larger dumps with additional information which may be need (also data segments).
- &quot;Full&quot; Even larger dumps with a full memory dump of the process.
- </string>
- </property>
- <item>
- <property name="text">
- <string>None</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Mini (recommended)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Data</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Full</string>
- </property>
- </item>
- </widget>
- </item>
- </layout>
- </item>
- <item row="4" column="0">
- <spacer name="verticalSpacer_10">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Expanding</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>232</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="0" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_6">
- <item>
- <widget class="QLabel" name="label_12">
- <property name="text">
- <string>Log Level</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="logLevelBox">
- <property name="toolTip">
- <string>Decides the amount of data printed to &quot;ModOrganizer.log&quot;</string>
- </property>
- <property name="whatsThis">
- <string>
- Decides the amount of data printed to &quot;ModOrganizer.log&quot;.
- &quot;Debug&quot; produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the &quot;Info&quot; level for regluar use. On the &quot;Error&quot; level the log file usually remains empty.
- </string>
- </property>
- <item>
- <property name="text">
- <string>Debug</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Info (recommended)</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Warning</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Error</string>
- </property>
- </item>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>languageBox</tabstop>
- <tabstop>styleBox</tabstop>
- <tabstop>logLevelBox</tabstop>
- <tabstop>usePrereleaseBox</tabstop>
- <tabstop>compactBox</tabstop>
- <tabstop>categoriesBtn</tabstop>
- <tabstop>baseDirEdit</tabstop>
- <tabstop>browseBaseDirBtn</tabstop>
- <tabstop>downloadDirEdit</tabstop>
- <tabstop>browseDownloadDirBtn</tabstop>
- <tabstop>modDirEdit</tabstop>
- <tabstop>browseModDirBtn</tabstop>
- <tabstop>cacheDirEdit</tabstop>
- <tabstop>browseCacheDirBtn</tabstop>
- <tabstop>profilesDirEdit</tabstop>
- <tabstop>browseProfilesDirBtn</tabstop>
- <tabstop>overwriteDirEdit</tabstop>
- <tabstop>browseOverwriteDirBtn</tabstop>
- <tabstop>clearCacheButton</tabstop>
- <tabstop>associateButton</tabstop>
- <tabstop>knownServersList</tabstop>
- <tabstop>preferredServersList</tabstop>
- <tabstop>steamUserEdit</tabstop>
- <tabstop>steamPassEdit</tabstop>
- <tabstop>pluginsList</tabstop>
- <tabstop>pluginSettingsList</tabstop>
- <tabstop>pluginBlacklist</tabstop>
- <tabstop>appIDEdit</tabstop>
- <tabstop>mechanismBox</tabstop>
- <tabstop>nmmVersionEdit</tabstop>
- <tabstop>bsaDateBtn</tabstop>
- <tabstop>tabWidget</tabstop>
- </tabstops>
- <resources>
- <include location="resources.qrc"/>
- </resources>
- <connections>
- <connection>
- <sender>buttonBox</sender>
- <signal>accepted()</signal>
- <receiver>SettingsDialog</receiver>
- <slot>accept()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
- </hint>
- <hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>buttonBox</sender>
- <signal>rejected()</signal>
- <receiver>SettingsDialog</receiver>
- <slot>reject()</slot>
- <hints>
- <hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
- </hint>
- <hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
- </hint>
- </hints>
- </connection>
- </connections>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SettingsDialog</class>
+ <widget class="QDialog" name="SettingsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>586</width>
+ <height>486</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="generalTab">
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Language</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="languageBox">
+ <property name="toolTip">
+ <string>The display language</string>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;The display language. This will only displaye languages for which you have a translation installed.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Style</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="styleBox">
+ <property name="toolTip">
+ <string>graphical style</string>
+ </property>
+ <property name="whatsThis">
+ <string>graphical style of the MO user interface</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="usePrereleaseBox">
+ <property name="toolTip">
+ <string>Update to non-stable releases.</string>
+ </property>
+ <property name="whatsThis">
+ <string>If this is enabled, the integrated update mechanism will notify of all releases, including pre-releases (alphas, betas).
+
+Please use this only if you're sufficiently tech-savvy to investigate issues, look for known problems in the issue tracker and create meaningful reports.
+
+If you use pre-releases, never contact me directly by e-mail or via private messages!</string>
+ </property>
+ <property name="text">
+ <string>Install Pre-releases (Betas)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>User interface</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0" colspan="2">
+ <widget class="QGroupBox" name="ModlistGroupBox">
+ <property name="title">
+ <string>Colors</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <item row="6" column="0">
+ <widget class="QCheckBox" name="colorSeparatorsBox">
+ <property name="toolTip">
+ <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
+ </property>
+ <property name="whatsThis">
+ <string>When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section.</string>
+ </property>
+ <property name="text">
+ <string>Show mod list separator colors on the scrollbar</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QPushButton" name="containedBtn">
+ <property name="text">
+ <string>Plugin is Contained in selected Mod</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QPushButton" name="overwrittenBtn">
+ <property name="text">
+ <string>Is overwritten (loose files)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="overwritingBtn">
+ <property name="text">
+ <string>Is overwriting (loose files)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <widget class="QPushButton" name="resetColorsBtn">
+ <property name="text">
+ <string>Reset Colors</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QPushButton" name="containsBtn">
+ <property name="text">
+ <string>Mod Contains selected Plugin</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QPushButton" name="overwrittenArchiveBtn">
+ <property name="text">
+ <string>Is overwritten (archive files)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="overwritingArchiveBtn">
+ <property name="text">
+ <string>Is overwriting (archive files)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="6" column="0" colspan="2">
+ <widget class="QPushButton" name="categoriesBtn">
+ <property name="toolTip">
+ <string>Modify the categories available to arrange your mods.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Modify the categories available to arrange your mods.</string>
+ </property>
+ <property name="text">
+ <string>Configure Mod Categories</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <widget class="QPushButton" name="resetDialogsButton">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Reset stored information from dialogs.</string>
+ </property>
+ <property name="whatsThis">
+ <string>This will make all dialogs show up again where you checked the &quot;Remember selection&quot;-box.</string>
+ </property>
+ <property name="text">
+ <string>Reset Dialogs</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="compactBox">
+ <property name="toolTip">
+ <string>If checked, the download interface will be more compact.</string>
+ </property>
+ <property name="text">
+ <string>Compact Download Interface</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="showMetaBox">
+ <property name="toolTip">
+ <string>If checked, the download list will display meta information instead of file names.</string>
+ </property>
+ <property name="text">
+ <string>Download Meta Information</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="pathsTab">
+ <attribute name="title">
+ <string>Paths</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_10">
+ <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="6" column="2">
+ <widget class="QPushButton" name="browseOverwriteDirBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QPushButton" name="browseModDirBtn">
+ <property name="text">
+ <string notr="true">...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QLineEdit" name="overwriteDirEdit"/>
+ </item>
+ <item row="0" column="2">
+ <widget class="QPushButton" name="browseBaseDirBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="baseDirEdit"/>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Caches</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_24">
+ <property name="text">
+ <string>Overwrite</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="downloadDirEdit">
+ <property name="toolTip">
+ <string>Directory where downloads are stored.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Directory where downloads are stored.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLineEdit" name="cacheDirEdit"/>
+ </item>
+ <item row="4" column="2">
+ <widget class="QPushButton" name="browseCacheDirBtn">
+ <property name="text">
+ <string notr="true">...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Downloads</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer name="verticalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_22">
+ <property name="text">
+ <string>Profiles</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="browseDownloadDirBtn">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string notr="true">...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLineEdit" name="profilesDirEdit"/>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLineEdit" name="modDirEdit">
+ <property name="toolTip">
+ <string>Directory where mods are stored.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don't exist in the new location (with the same name).</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QPushButton" name="browseProfilesDirBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="1">
+ <widget class="QLineEdit" name="managedGameDirEdit">
+ <property name="acceptDrops">
+ <bool>false</bool>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Mods</string>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="1">
+ <spacer name="verticalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="11" column="0">
+ <widget class="QLabel" name="label_29">
+ <property name="text">
+ <string>Managed Game</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_25">
+ <property name="text">
+ <string>Base Directory</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0" colspan="3">
+ <widget class="QLabel" name="label_26">
+ <property name="text">
+ <string>Use %BASE_DIR% to refer to the Base Directory.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="2">
+ <widget class="QPushButton" name="browseGameDirBtn">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_23">
+ <property name="text">
+ <string>Important: All directories have to be writeable!</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="nexusTab">
+ <attribute name="title">
+ <string>Nexus</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QGroupBox" name="nexusBox">
+ <property name="toolTip">
+ <string>Allows automatic log-in when the Nexus-Page for the game is clicked.</string>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Allows automatic log-in when the Nexus-Page for the game is clicked. Please note that the obfuscation with which the password is stored in modorganizer.ini is not very strong. If you're worried someone might steal your password, don't store it here.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="title">
+ <string>Nexus</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_10">
+ <item>
+ <widget class="QPushButton" name="nexusConnect">
+ <property name="text">
+ <string>Connect to Nexus</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_11">
+ <item>
+ <spacer name="horizontalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="revokeNexusAuthButton">
+ <property name="toolTip">
+ <string>Clear the stored Nexus API key and force reauthorization.</string>
+ </property>
+ <property name="text">
+ <string>Revoke Nexus Authorization</string>
+ </property>
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/MO/gui/edit_clear</normaloff>:/MO/gui/edit_clear</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clearCacheButton">
+ <property name="toolTip">
+ <string>Remove cache and cookies.</string>
+ </property>
+ <property name="text">
+ <string>Clear Cache</string>
+ </property>
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/MO/gui/edit_clear</normaloff>:/MO/gui/edit_clear</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_8">
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="offlineBox">
+ <property name="statusTip">
+ <string>Disable automatic internet features</string>
+ </property>
+ <property name="whatsThis">
+ <string>Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser)</string>
+ </property>
+ <property name="text">
+ <string>Offline Mode</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="proxyBox">
+ <property name="statusTip">
+ <string>Use a proxy for network connections.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy.</string>
+ </property>
+ <property name="text">
+ <string>Use HTTP Proxy (Uses System Settings)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="endorsementBox">
+ <property name="text">
+ <string>Endorsement Integration</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <item>
+ <widget class="QPushButton" name="associateButton">
+ <property name="text">
+ <string>Associate with &quot;Download with manager&quot; links</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_8" stretch="0,0">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <item>
+ <widget class="QLabel" name="label_16">
+ <property name="text">
+ <string>Known Servers (updated on download)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="knownServersList">
+ <property name="dragDropMode">
+ <enum>QAbstractItemView::DragDrop</enum>
+ </property>
+ <property name="defaultDropAction">
+ <enum>Qt::MoveAction</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_8">
+ <item>
+ <widget class="QLabel" name="label_17">
+ <property name="text">
+ <string>Preferred Servers (Drag &amp; Drop)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="preferredServersList">
+ <property name="dragDropMode">
+ <enum>QAbstractItemView::DragDrop</enum>
+ </property>
+ <property name="defaultDropAction">
+ <enum>Qt::MoveAction</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="steamTab">
+ <attribute name="title">
+ <string>Steam</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_19">
+ <property name="text">
+ <string>Username</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="steamUserEdit"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_20">
+ <property name="text">
+ <string>Password</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="steamPassEdit">
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <spacer name="verticalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QLabel" name="label_21">
+ <property name="text">
+ <string>If you save your steam user ID and password here, they will be used when logging into steam. Note, however, your password will be stored unencrypted, so make sure your computer is secure.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>232</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="pluginsTab">
+ <attribute name="title">
+ <string>Plugins</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_9" stretch="0,0,0">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_9">
+ <item>
+ <widget class="QListWidget" name="pluginsList">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="sortingEnabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_7" stretch="0,1">
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_13">
+ <property name="text">
+ <string>Author:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="authorLabel">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_15">
+ <property name="text">
+ <string>Version:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="versionLabel">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>Description:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="descriptionLabel">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTreeWidget" name="pluginSettingsList">
+ <property name="indentation">
+ <number>0</number>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <property name="itemsExpandable">
+ <bool>false</bool>
+ </property>
+ <property name="expandsOnDoubleClick">
+ <bool>false</bool>
+ </property>
+ <attribute name="headerVisible">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="headerDefaultSectionSize">
+ <number>170</number>
+ </attribute>
+ <column>
+ <property name="text">
+ <string>Key</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Value</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_18">
+ <property name="text">
+ <string>Blacklisted Plugins (use &lt;del&gt; to remove):</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="pluginBlacklist"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="workaroundTab">
+ <attribute name="title">
+ <string>Workarounds</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0,0">
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Steam App ID</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="appIDEdit">
+ <property name="toolTip">
+ <string>The Steam AppID for your game</string>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;The Steam App ID is required to directly start some games. For Skyrim, if this is not set or wrong, the &amp;quot;Mod Organizer&amp;quot; load mechanism may not work properly.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;The preset for this is the App ID of the &amp;quot;regular&amp;quot; version so in most cases, you should be set.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;If you think you have a different version (GotY or something), follow these steps to get to the id:&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;1. Navigate to the game library in steam&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;2. right-click on the game you need the id for and choose &lt;/span&gt;&lt;span style=&quot; font-size:8pt; font-weight:600;&quot;&gt;Create desktop shortcut&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;3. right-click on the newly created shortcut on your desktop and select &lt;/span&gt;&lt;span style=&quot; font-size:8pt; font-weight:600;&quot;&gt;Properties&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;4. in the URL-field you should see something like this: &lt;/span&gt;&lt;span style=&quot; font-size:8pt; font-style:italic;&quot;&gt;steam://rungameid/22380&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;22380 is the id you're looking for.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1">
+ <property name="spacing">
+ <number>7</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Load Mechanism</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QComboBox" name="mechanismBox">
+ <property name="toolTip">
+ <string>Select loading mechanism. See help for details.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Mod Organizer needs a dll to be injected into the game so all mods are visible to it.
+There are several means to do this:
+*Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it.
+*Script Extender* In this mode, MO is installed as a Script Extender (obse, fose, nvse, skse) plugin.
+*Proxy DLL* In this mode, MO replaces one of the game's dlls with one that loads MO (and the original dll of course). This will ONLY work with Steam games and it has only been tested with Skyrim. Please use this only if the other mechanisms don't work.
+
+If you use the Steam version of Oblivion the default will NOT work. In this case, please install obse and use &quot;Script Extender&quot; as the load mechanism. Also you can then not start Oblivion from MO. Instead, use MO only to set up your mods, then quit and start Oblivion through Steam.</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,0,0">
+ <item>
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>NMM Version</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="nmmVersionEdit">
+ <property name="toolTip">
+ <string>The Version of Nexus Mod Manager to impersonate.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in.
+On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here.
+Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a &quot;compatible&quot; NMM version to the user agent.
+
+tl;dr-version: If Nexus-features don't work, insert the current version number of NMM here and try again.</string>
+ </property>
+ <property name="inputMask">
+ <string notr="true">009.009.009</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="placeholderText">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_6">
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="hideUncheckedBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip">
+ <string>Enforces that inactive ESPs and ESMs are never loaded.</string>
+ </property>
+ <property name="whatsThis">
+ <string>It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins.
+I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded.</string>
+ </property>
+ <property name="text">
+ <string>Hide inactive ESPs/ESMs</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="displayForeignBox">
+ <property name="toolTip">
+ <string>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.</string>
+ </property>
+ <property name="whatsThis">
+ <string>By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods.
+However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly.
+
+If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps, esms, and esls) displayed in the right pane are completely unaffected by this feature.</string>
+ </property>
+ <property name="text">
+ <string>Display mods installed outside MO</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="forceEnableBox">
+ <property name="toolTip">
+ <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)</string>
+ </property>
+ <property name="whatsThis">
+ <string>If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on)
+Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled.</string>
+ </property>
+ <property name="text">
+ <string>Force-enable game files</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="lockGUIBox">
+ <property name="toolTip">
+ <string>Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior.</string>
+ </property>
+ <property name="text">
+ <string>Lock GUI when running executable</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="enableArchiveParsingBox">
+ <property name="toolTip">
+ <string>Enable parsing of Archives. This is an Experimental Feature. Has negative effects on performance and known incorrectness.</string>
+ </property>
+ <property name="whatsThis">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, MO will parse archive files (BSA, BA2) to calculate conflicts between the contents of the archive files and other loose files. This process has a noticeable cost in performance.&lt;/p&gt;&lt;p&gt;This feature should not be confused with the archive management feature offered by MO1. MO2 will only show conflicts with archives and will NOT load them into the game or program.&lt;/p&gt;&lt;p&gt;If you disable this feature, MO will only display conflicts between loose files.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Enable parsing of Archives (Experimental Feature)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QPushButton" name="bsaDateBtn">
+ <property name="toolTip">
+ <string>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!</string>
+ </property>
+ <property name="whatsThis">
+ <string>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!</string>
+ </property>
+ <property name="text">
+ <string>Back-date BSAs</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/MO/gui/resources/emblem-readonly.png</normaloff>:/MO/gui/resources/emblem-readonly.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="execBlacklistBtn">
+ <property name="toolTip">
+ <string>Add executables to the blacklist to prevent them from
+accessing the virtual file system. This is useful to prevent
+unintended programs from being hooked. Hooking unintended
+programs may affect the execution of these programs or the
+programs you are intentionally running.</string>
+ </property>
+ <property name="whatsThis">
+ <string>Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running.</string>
+ </property>
+ <property name="text">
+ <string>Configure Executables Blacklist</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="resetGeometryBtn">
+ <property name="toolTip">
+ <string>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.</string>
+ </property>
+ <property name="whatsThis">
+ <string>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.</string>
+ </property>
+ <property name="text">
+ <string>Reset Window Geometries</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="diagnosticsTab">
+ <attribute name="title">
+ <string>Diagnostics</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="2" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout_13">
+ <item>
+ <widget class="QLabel" name="label_28">
+ <property name="text">
+ <string>Max Dumps To Keep</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="dumpsMaxEdit">
+ <property name="toolTip">
+ <string>Maximum number of crash dumps to keep on disk. Use 0 for unlimited.</string>
+ </property>
+ <property name="whatsThis">
+ <string>
+ Maximum number of crash dumps to keep on disk. Use 0 for unlimited.
+ Set &quot;Crash Dumps&quot; above to None to disable crash dump collection.
+ </string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="diagnosticsExplainedLabel">
+ <property name="toolTip">
+ <string>Hint: right click link and copy link location</string>
+ </property>
+ <property name="text">
+ <string>
+ 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.
+ </string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout_12">
+ <item>
+ <widget class="QLabel" name="label_27">
+ <property name="text">
+ <string>Crash Dumps</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="dumpsTypeBox">
+ <property name="toolTip">
+ <string>Decides which type of crash dumps are collected when injected processes crash.</string>
+ </property>
+ <property name="whatsThis">
+ <string>
+ Decides which type of crash dumps are collected when injected processes crash.
+ &quot;None&quot; Disables the generation of crash dumps by MO.
+ &quot;Mini&quot; Default level which generates small dumps (only stack traces).
+ &quot;Data&quot; Much larger dumps with additional information which may be need (also data segments).
+ &quot;Full&quot; Even larger dumps with a full memory dump of the process.
+ </string>
+ </property>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Mini (recommended)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Data</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Full</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="0">
+ <spacer name="verticalSpacer_10">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>232</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <item>
+ <widget class="QLabel" name="label_12">
+ <property name="text">
+ <string>Log Level</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="logLevelBox">
+ <property name="toolTip">
+ <string>Decides the amount of data printed to &quot;ModOrganizer.log&quot;</string>
+ </property>
+ <property name="whatsThis">
+ <string>
+ Decides the amount of data printed to &quot;ModOrganizer.log&quot;.
+ &quot;Debug&quot; produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the &quot;Info&quot; level for regluar use. On the &quot;Error&quot; level the log file usually remains empty.
+ </string>
+ </property>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Info (recommended)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Warning</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Error</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>languageBox</tabstop>
+ <tabstop>styleBox</tabstop>
+ <tabstop>logLevelBox</tabstop>
+ <tabstop>usePrereleaseBox</tabstop>
+ <tabstop>compactBox</tabstop>
+ <tabstop>categoriesBtn</tabstop>
+ <tabstop>baseDirEdit</tabstop>
+ <tabstop>browseBaseDirBtn</tabstop>
+ <tabstop>downloadDirEdit</tabstop>
+ <tabstop>browseDownloadDirBtn</tabstop>
+ <tabstop>modDirEdit</tabstop>
+ <tabstop>browseModDirBtn</tabstop>
+ <tabstop>cacheDirEdit</tabstop>
+ <tabstop>browseCacheDirBtn</tabstop>
+ <tabstop>profilesDirEdit</tabstop>
+ <tabstop>browseProfilesDirBtn</tabstop>
+ <tabstop>overwriteDirEdit</tabstop>
+ <tabstop>browseOverwriteDirBtn</tabstop>
+ <tabstop>clearCacheButton</tabstop>
+ <tabstop>associateButton</tabstop>
+ <tabstop>knownServersList</tabstop>
+ <tabstop>preferredServersList</tabstop>
+ <tabstop>steamUserEdit</tabstop>
+ <tabstop>steamPassEdit</tabstop>
+ <tabstop>pluginsList</tabstop>
+ <tabstop>pluginSettingsList</tabstop>
+ <tabstop>pluginBlacklist</tabstop>
+ <tabstop>appIDEdit</tabstop>
+ <tabstop>mechanismBox</tabstop>
+ <tabstop>nmmVersionEdit</tabstop>
+ <tabstop>bsaDateBtn</tabstop>
+ <tabstop>tabWidget</tabstop>
+ </tabstops>
+ <resources>
+ <include location="resources.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>SettingsDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>SettingsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>