diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/downloadmanager.cpp | 48 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 230 | ||||
| -rw-r--r-- | src/mainwindow.h | 1 | ||||
| -rw-r--r-- | src/modinfodialog.cpp | 219 | ||||
| -rw-r--r-- | src/modinfodialog.h | 19 | ||||
| -rw-r--r-- | src/motddialog.cpp | 6 | ||||
| -rw-r--r-- | src/organizer_en.ts | 962 | ||||
| -rw-r--r-- | src/organizercore.cpp | 208 | ||||
| -rw-r--r-- | src/organizercore.h | 15 | ||||
| -rw-r--r-- | src/overwriteinfodialog.cpp | 10 | ||||
| -rw-r--r-- | src/pluginlist.cpp | 2 | ||||
| -rw-r--r-- | src/problemsdialog.cpp | 3 | ||||
| -rw-r--r-- | src/selfupdater.cpp | 19 | ||||
| -rw-r--r-- | src/settings.cpp | 23 |
14 files changed, 896 insertions, 869 deletions
diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 78162f11..648b102a 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -549,10 +549,21 @@ void DownloadManager::addNXMDownload(const QString &url) NXMUrl nxmInfo(url); QStringList validGames; + MOBase::IPluginGame* foundGame = nullptr; validGames.append(m_ManagedGame->gameShortName()); validGames.append(m_ManagedGame->validShortNames()); + for (auto game : validGames) { + MOBase::IPluginGame* gamePlugin = m_OrganizerCore->getGame(game); + if ( + nxmInfo.game().compare(gamePlugin->gameShortName(), Qt::CaseInsensitive) == 0 || + nxmInfo.game().compare(gamePlugin->gameNexusName(), Qt::CaseInsensitive) == 0 + ) { + foundGame = gamePlugin; + break; + } + } qDebug("add nxm download: %s", qUtf8Printable(url)); - if (!validGames.contains(nxmInfo.game(), Qt::CaseInsensitive)) { + if (foundGame == nullptr) { qDebug("download requested for wrong game (game: %s, url: %s)", qUtf8Printable(m_ManagedGame->gameShortName()), qUtf8Printable(nxmInfo.game())); QMessageBox::information(nullptr, tr("Wrong Game"), tr("The download link is for a mod for \"%1\" but this instance of MO " "has been set up for \"%2\".").arg(nxmInfo.game()).arg(m_ManagedGame->gameShortName()), QMessageBox::Ok); @@ -560,7 +571,7 @@ void DownloadManager::addNXMDownload(const QString &url) } for (auto tuple : m_PendingDownloads) { - if (std::get<0>(tuple).compare(nxmInfo.game(), Qt::CaseInsensitive) == 0, std::get<1>(tuple) == nxmInfo.modId() && std::get<2>(tuple) == nxmInfo.fileId()) { + if (std::get<0>(tuple).compare(foundGame->gameShortName(), Qt::CaseInsensitive) == 0, std::get<1>(tuple) == nxmInfo.modId() && std::get<2>(tuple) == nxmInfo.fileId()) { QString debugStr("download requested is already queued (mod: %1, file: %2)"); QString infoStr(tr("There is already a download queued for this file.\n\nMod %1\nFile %2")); @@ -620,7 +631,7 @@ void DownloadManager::addNXMDownload(const QString &url) emit aboutToUpdate(); - m_PendingDownloads.append(std::make_tuple(nxmInfo.game(), nxmInfo.modId(), nxmInfo.fileId())); + m_PendingDownloads.append(std::make_tuple(foundGame->gameShortName(), nxmInfo.modId(), nxmInfo.fileId())); emit update(-1); emit downloadAdded(); @@ -631,7 +642,7 @@ void DownloadManager::addNXMDownload(const QString &url) info->nexusDownloadUser = nxmInfo.userId(); QObject *test = info; - m_RequestIDs.insert(m_NexusInterface->requestFileInfo(nxmInfo.game(), nxmInfo.modId(), nxmInfo.fileId(), this, qVariantFromValue(test), "")); + m_RequestIDs.insert(m_NexusInterface->requestFileInfo(foundGame->gameShortName(), nxmInfo.modId(), nxmInfo.fileId(), this, qVariantFromValue(test), "")); } @@ -1030,14 +1041,14 @@ void DownloadManager::openFile(int index) reportError(tr("OpenFile: invalid download index %1").arg(index)); return; } + QDir path = QDir(m_OutputDirectory); if (path.exists(getFileName(index))) { - - ::ShellExecuteW(nullptr, L"open", ToWString(QDir::toNativeSeparators(getFilePath(index))).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::OpenFile(getFilePath(index)); return; } - ::ShellExecuteW(nullptr, L"explore", ToWString(QDir::toNativeSeparators(m_OutputDirectory)).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OutputDirectory); return; } @@ -1047,23 +1058,22 @@ void DownloadManager::openInDownloadsFolder(int index) reportError(tr("OpenFileInDownloadsFolder: invalid download index %1").arg(index)); return; } - QString params = "/select,\""; - QDir path = QDir(m_OutputDirectory); - if (path.exists(getFileName(index))) { - params = params + QDir::toNativeSeparators(getFilePath(index)) + "\""; - ::ShellExecuteW(nullptr, nullptr, L"explorer", ToWString(params).c_str(), nullptr, SW_SHOWNORMAL); - return; - } - else if (path.exists(getFileName(index) + ".unfinished")) { - params = params + QDir::toNativeSeparators(getFilePath(index)+".unfinished") + "\""; + const auto path = getFilePath(index); - ::ShellExecuteW(nullptr, nullptr, L"explorer", ToWString(params).c_str(), nullptr, SW_SHOWNORMAL); + if (QFile::exists(path)) { + shell::ExploreFile(path); return; } + else { + const auto unfinished = path + ".unfinished"; + if (QFile::exists(unfinished)) { + shell::ExploreFile(unfinished); + return; + } + } - ::ShellExecuteW(nullptr, L"explore", ToWString(QDir::toNativeSeparators(m_OutputDirectory)).c_str(), nullptr, nullptr, SW_SHOWNORMAL); - return; + shell::ExploreFile(m_OutputDirectory); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1b95ea0b..0ef9bc80 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1025,6 +1025,15 @@ void MainWindow::setBrowserGeometry(const QByteArray &geometry) void MainWindow::displaySaveGameInfo(QListWidgetItem *newItem) { + // don't display the widget if the main window doesn't have focus + // + // this goes against the standard behaviour for tooltips, which are displayed + // on hover regardless of focus, but this widget is so large and busy that + // it's probably better this way + if (!isActiveWindow()){ + return; + } + QString const &save = newItem->data(Qt::UserRole).toString(); if (m_CurrentSaveView == nullptr) { IPluginGame const *game = m_OrganizerCore.managedGame(); @@ -1056,8 +1065,6 @@ void MainWindow::displaySaveGameInfo(QListWidgetItem *newItem) m_CurrentSaveView->show(); m_CurrentSaveView->setProperty("displayItem", qVariantFromValue(static_cast<void *>(newItem))); - - ui->savegameList->activateWindow(); } @@ -3241,12 +3248,12 @@ void MainWindow::openExplorer_clicked() if (selection->hasSelection() && selection->selectedRows().count() > 1) { for (QModelIndex idx : selection->selectedRows()) { ModInfo::Ptr info = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt()); - ::ShellExecuteW(nullptr, L"explore", ToWString(info->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(info->absolutePath()); } } else { ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); - ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(modInfo->absolutePath()); } } @@ -3261,18 +3268,14 @@ void MainWindow::openOriginExplorer_clicked() continue; } ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex); - std::vector<ModInfo::EFlag> flags = modInfo->getFlags(); - - ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(modInfo->absolutePath()); } } else { QModelIndex idx = selection->currentIndex(); QString fileName = idx.data().toString(); ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); - std::vector<ModInfo::EFlag> flags = modInfo->getFlags(); - - ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(modInfo->absolutePath()); } } @@ -3287,7 +3290,7 @@ void MainWindow::openExplorer_activated() std::vector<ModInfo::EFlag> flags = modInfo->getFlags(); if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { - ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(modInfo->absolutePath()); } } @@ -3308,7 +3311,7 @@ void MainWindow::openExplorer_activated() std::vector<ModInfo::EFlag> flags = modInfo->getFlags(); if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { - ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(modInfo->absolutePath()); } } } @@ -4275,64 +4278,61 @@ void MainWindow::disableVisibleMods() void MainWindow::openInstanceFolder() { QString dataPath = qApp->property("dataPath").toString(); - ::ShellExecuteW(nullptr, L"explore", ToWString(dataPath).c_str(), nullptr, nullptr, SW_SHOWNORMAL); - - //opens BaseDirectory instead - //::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getBaseDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(dataPath); } void MainWindow::openLogsFolder() { QString logsPath = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::logPath()); - ::ShellExecuteW(nullptr, L"explore", ToWString(logsPath).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(logsPath); } void MainWindow::openInstallFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(qApp->applicationDirPath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(qApp->applicationDirPath()); } void MainWindow::openPluginsFolder() { QString pluginsPath = QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::pluginPath()); - ::ShellExecuteW(nullptr, L"explore", ToWString(pluginsPath).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(pluginsPath); } void MainWindow::openProfileFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OrganizerCore.currentProfile()->absolutePath()); } void MainWindow::openIniFolder() { if (m_OrganizerCore.currentProfile()->localSettingsEnabled()) { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OrganizerCore.currentProfile()->absolutePath()); } else { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.managedGame()->documentsDirectory().absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OrganizerCore.managedGame()->documentsDirectory()); } } void MainWindow::openDownloadsFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getDownloadDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OrganizerCore.settings().getDownloadDirectory()); } void MainWindow::openModsFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getModDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OrganizerCore.settings().getModDirectory()); } void MainWindow::openGameFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.managedGame()->gameDirectory().absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OrganizerCore.managedGame()->gameDirectory()); } void MainWindow::openMyGamesFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.managedGame()->documentsDirectory().absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_OrganizerCore.managedGame()->documentsDirectory()); } @@ -5153,73 +5153,30 @@ void MainWindow::writeDataToFile() } } - -int MainWindow::getBinaryExecuteInfo(const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments) +void MainWindow::addAsExecutable() { - QString extension = targetInfo.suffix(); - if ((extension.compare("cmd", Qt::CaseInsensitive) == 0) || - (extension.compare("com", Qt::CaseInsensitive) == 0) || - (extension.compare("bat", Qt::CaseInsensitive) == 0)) { - binaryInfo = QFileInfo("C:\\Windows\\System32\\cmd.exe"); - arguments = QString("/C \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - return 1; - } else if (extension.compare("exe", Qt::CaseInsensitive) == 0) { - binaryInfo = targetInfo; - return 1; - } else if (extension.compare("jar", Qt::CaseInsensitive) == 0) { - // types that need to be injected into - std::wstring targetPathW = ToWString(targetInfo.absoluteFilePath()); - QString binaryPath; - - { // try to find java automatically - WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(targetPathW.c_str(), nullptr, buffer) > (HINSTANCE)32) { - DWORD binaryType = 0UL; - if (!::GetBinaryTypeW(buffer, &binaryType)) { - qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError()); - } else if (binaryType == SCS_32BIT_BINARY) { - binaryPath = ToQString(buffer); - } - } - } - if (binaryPath.isEmpty() && (extension == "jar")) { - // second attempt: look to the registry - QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); - if (javaReg.contains("CurrentVersion")) { - QString currentVersion = javaReg.value("CurrentVersion").toString(); - binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); - } - } - if (binaryPath.isEmpty()) { - binaryPath = QFileDialog::getOpenFileName(this, tr("Select binary"), QString(), tr("Binary") + " (*.exe)"); - } - if (binaryPath.isEmpty()) { - return 0; - } - binaryInfo = QFileInfo(binaryPath); - if (extension == "jar") { - arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } else { - arguments = QString("\"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } - return 1; - } else { - return 2; + if (m_ContextItem == nullptr) { + return; } -} + using FileExecutionTypes = OrganizerCore::FileExecutionTypes; -void MainWindow::addAsExecutable() -{ - if (m_ContextItem != nullptr) { - QFileInfo targetInfo(m_ContextItem->data(0, Qt::UserRole).toString()); - QFileInfo binaryInfo; - QString arguments; - switch (getBinaryExecuteInfo(targetInfo, binaryInfo, arguments)) { - case 1: { + QFileInfo targetInfo(m_ContextItem->data(0, Qt::UserRole).toString()); + QFileInfo binaryInfo; + QString arguments; + FileExecutionTypes type; + + if (!OrganizerCore::getFileExecutionContext(this, targetInfo, binaryInfo, arguments, type)) { + return; + } + + switch (type) + { + case FileExecutionTypes::Executable: { QString name = QInputDialog::getText(this, tr("Enter Name"), tr("Please enter a name for the executable"), QLineEdit::Normal, targetInfo.baseName()); + if (!name.isEmpty()) { //Note: If this already exists, you'll lose custom settings m_OrganizerCore.executablesList()->addExecutable(name, @@ -5230,14 +5187,15 @@ void MainWindow::addAsExecutable() Executable::CustomExecutable); refreshExecutablesList(); } - } break; - case 2: { + + break; + } + + case FileExecutionTypes::Other: // fall-through + default: { QMessageBox::information(this, tr("Not an executable"), tr("This is not a recognized executable.")); - } break; - default: { - // nop - } break; - } + break; + } } } @@ -5355,91 +5313,17 @@ void MainWindow::disableSelectedMods_clicked() void MainWindow::previewDataFile() { QString fileName = QDir::fromNativeSeparators(m_ContextItem->data(0, Qt::UserRole).toString()); - - // what we have is an absolute path to the file in its actual location (for the primary origin) - // what we want is the path relative to the virtual data directory - - // we need to look in the virtual directory for the file to make sure the info is up to date. - - // check if the file comes from the actual data folder instead of a mod - QDir gameDirectory = m_OrganizerCore.managedGame()->dataDirectory().absolutePath(); - QString relativePath = gameDirectory.relativeFilePath(fileName); - QDir dirRelativePath = gameDirectory.relativeFilePath(fileName); - // if the file is on a different drive the dirRelativePath will actually be an absolute path so we make sure that is not the case - if (!dirRelativePath.isAbsolute() && !relativePath.startsWith("..")) { - fileName = relativePath; - } - else { - // crude: we search for the next slash after the base mod directory to skip everything up to the data-relative directory - int offset = m_OrganizerCore.settings().getModDirectory().size() + 1; - offset = fileName.indexOf("/", offset); - fileName = fileName.mid(offset + 1); - } - - - - const FileEntry::Ptr file = m_OrganizerCore.directoryStructure()->searchFile(ToWString(fileName), nullptr); - - if (file.get() == nullptr) { - reportError(tr("file not found: %1").arg(qUtf8Printable(fileName))); - return; - } - - // set up preview dialog - PreviewDialog preview(fileName); - auto addFunc = [&] (int originId) { - FilesOrigin &origin = m_OrganizerCore.directoryStructure()->getOriginByID(originId); - QString filePath = QDir::fromNativeSeparators(ToQString(origin.getPath())) + "/" + fileName; - if (QFile::exists(filePath)) { - // it's very possible the file doesn't exist, because it's inside an archive. we don't support that - QWidget *wid = m_PluginContainer.previewGenerator().genPreview(filePath); - if (wid == nullptr) { - reportError(tr("failed to generate preview for %1").arg(filePath)); - } else { - preview.addVariant(ToQString(origin.getName()), wid); - } - } - }; - - addFunc(file->getOrigin()); - for (auto alt : file->getAlternatives()) { - addFunc(alt.first); - } - if (preview.numVariants() > 0) { - QSettings &settings = m_OrganizerCore.settings().directInterface(); - QString key = QString("geometry/%1").arg(preview.objectName()); - if (settings.contains(key)) { - preview.restoreGeometry(settings.value(key).toByteArray()); - } - preview.exec(); - settings.setValue(key, preview.saveGeometry()); - } else { - QMessageBox::information(this, tr("Sorry"), tr("Sorry, can't preview anything. This function currently does not support extracting from bsas.")); - } + m_OrganizerCore.previewFileWithAlternatives(this, fileName); } void MainWindow::openDataFile() { - if (m_ContextItem != nullptr) { - QFileInfo targetInfo(m_ContextItem->data(0, Qt::UserRole).toString()); - QFileInfo binaryInfo; - QString arguments; - switch (getBinaryExecuteInfo(targetInfo, binaryInfo, arguments)) { - case 1: { - m_OrganizerCore.spawnBinaryDirect( - binaryInfo, arguments, m_OrganizerCore.currentProfile()->name(), - targetInfo.absolutePath(), "", ""); - } break; - case 2: { - ::ShellExecuteW(nullptr, L"open", - ToWString(targetInfo.absoluteFilePath()).c_str(), - nullptr, nullptr, SW_SHOWNORMAL); - } break; - default: { - // nop - } break; - } + if (m_ContextItem == nullptr) { + return; } + + QFileInfo targetInfo(m_ContextItem->data(0, Qt::UserRole).toString()); + m_OrganizerCore.executeFileVirtualized(this, targetInfo); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 727dd165..b4ad0bdb 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -260,7 +260,6 @@ private: 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); diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 1304b27a..19a03ea7 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -322,8 +322,9 @@ bool ExpanderWidget::opened() const ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directory, bool unmanaged, OrganizerCore *organizerCore, PluginContainer *pluginContainer, QWidget *parent) : TutorableDialog("ModInfoDialog", parent), ui(new Ui::ModInfoDialog), m_ModInfo(modInfo), m_ThumbnailMapper(this), m_RequestStarted(false), - m_DeleteAction(nullptr), m_RenameAction(nullptr), m_OpenAction(nullptr), - m_Directory(directory), m_Origin(nullptr), + m_NewFolderAction(nullptr), m_OpenAction(nullptr), m_PreviewAction(nullptr), + m_RenameAction(nullptr), m_DeleteAction(nullptr), m_HideAction(nullptr), + m_UnhideAction(nullptr), m_Directory(directory), m_Origin(nullptr), m_OrganizerCore(organizerCore), m_PluginContainer(pluginContainer) { ui->setupUi(this); @@ -480,17 +481,20 @@ void ModInfoDialog::initFiletree(ModInfo::Ptr modInfo) ui->fileTree->setRootIndex(m_FileSystemModel->index(m_RootPath)); ui->fileTree->setColumnWidth(0, 300); - m_DeleteAction = new QAction(tr("&Delete"), ui->fileTree); + m_NewFolderAction = new QAction(tr("&New Folder"), ui->fileTree); + m_OpenAction = new QAction(tr("&Open"), ui->fileTree); + m_PreviewAction = new QAction(tr("&Preview"), ui->fileTree); m_RenameAction = new QAction(tr("&Rename"), ui->fileTree); + m_DeleteAction = new QAction(tr("&Delete"), ui->fileTree); m_HideAction = new QAction(tr("&Hide"), ui->fileTree); m_UnhideAction = new QAction(tr("&Unhide"), ui->fileTree); - m_OpenAction = new QAction(tr("&Open"), ui->fileTree); - m_NewFolderAction = new QAction(tr("&New Folder"), ui->fileTree); - QObject::connect(m_DeleteAction, SIGNAL(triggered()), this, SLOT(deleteTriggered())); - QObject::connect(m_RenameAction, SIGNAL(triggered()), this, SLOT(renameTriggered())); - QObject::connect(m_OpenAction, SIGNAL(triggered()), this, SLOT(openTriggered())); - QObject::connect(m_NewFolderAction, SIGNAL(triggered()), this, SLOT(createDirectoryTriggered())); - QObject::connect(m_HideAction, SIGNAL(triggered()), this, SLOT(hideTriggered())); + + connect(m_NewFolderAction, SIGNAL(triggered()), this, SLOT(createDirectoryTriggered())); + connect(m_OpenAction, SIGNAL(triggered()), this, SLOT(openTriggered())); + connect(m_PreviewAction, SIGNAL(triggered()), this, SLOT(previewTriggered())); + connect(m_RenameAction, SIGNAL(triggered()), this, SLOT(renameTriggered())); + connect(m_DeleteAction, SIGNAL(triggered()), this, SLOT(deleteTriggered())); + connect(m_HideAction, SIGNAL(triggered()), this, SLOT(hideTriggered())); connect(m_UnhideAction, SIGNAL(triggered()), this, SLOT(unhideTriggered())); } @@ -1071,10 +1075,9 @@ void ModInfoDialog::linkClicked(const QUrl &url) //Ideally we'd ask the mod for the game and the web service then pass the game //and URL to the web service if (NexusInterface::instance(m_PluginContainer)->isURLGameRelated(url)) { - emit linkActivated(url.toString()); } else { - ::ShellExecuteW(nullptr, L"open", ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::OpenLink(url); } } @@ -1242,12 +1245,11 @@ bool ModInfoDialog::recursiveDelete(const QModelIndex &index) void ModInfoDialog::on_openInExplorerButton_clicked() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_ModInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + shell::ExploreFile(m_ModInfo->absolutePath()); } void ModInfoDialog::deleteFile(const QModelIndex &index) { - bool res = m_FileSystemModel->isDir(index) ? recursiveDelete(index) : m_FileSystemModel->remove(index); if (!res) { @@ -1404,21 +1406,29 @@ void ModInfoDialog::changeFiletreeVisibility(bool hide) } -void ModInfoDialog::openFile(const QModelIndex &index) +void ModInfoDialog::openTriggered() { - QString fileName = m_FileSystemModel->filePath(index); + if (m_FileSelection.size() == 1) { + const auto index = m_FileSelection.at(0); + if (!index.isValid()) { + return; + } - HINSTANCE res = ::ShellExecuteW(nullptr, L"open", ToWString(fileName).c_str(), nullptr, nullptr, SW_SHOW); - if ((unsigned long long)res <= 32) { - qCritical("failed to invoke %s: %d", qUtf8Printable(fileName), res); + QString fileName = m_FileSystemModel->filePath(index); + shell::OpenFile(fileName); } } - -void ModInfoDialog::openTriggered() +void ModInfoDialog::previewTriggered() { - foreach(QModelIndex idx, m_FileSelection) { - openFile(idx); + if (m_FileSelection.size() == 1) { + const auto index = m_FileSelection.at(0); + if (!index.isValid()) { + return; + } + + QString fileName = m_FileSystemModel->filePath(index); + m_OrganizerCore->previewFile(this, m_ModInfo->name(), fileName); } } @@ -1462,6 +1472,7 @@ void ModInfoDialog::on_fileTree_customContextMenuRequested(const QPoint &pos) if (selectionModel->hasSelection()) { bool enableOpen = true; + bool enablePreview = true; bool enableRename = true; bool enableDelete = true; bool enableHide = true; @@ -1482,10 +1493,15 @@ void ModInfoDialog::on_fileTree_customContextMenuRequested(const QPoint &pos) if (!hasFiles) { enableOpen = false; + enablePreview = false; } const QString fileName = m_FileSystemModel->fileName(m_FileSelection.at(0)); + if (!canPreviewFile(false, fileName)) { + enablePreview = false; + } + if (!canHideFile(false, fileName)) { enableHide = false; } @@ -1497,6 +1513,7 @@ void ModInfoDialog::on_fileTree_customContextMenuRequested(const QPoint &pos) // this is a multiple selection, don't show open action so users don't open // a thousand files enableOpen = false; + enablePreview = false; enableRename = false; if (m_FileSelection.size() < max_scan_for_visibility) { @@ -1528,6 +1545,10 @@ void ModInfoDialog::on_fileTree_customContextMenuRequested(const QPoint &pos) menu.addAction(m_OpenAction); } + if (enablePreview) { + menu.addAction(m_PreviewAction); + } + if (enableRename) { menu.addAction(m_RenameAction); } @@ -1696,65 +1717,6 @@ void ModInfoDialog::unhideConflictFiles() changeConflictFilesVisibility(false); } -int ModInfoDialog::getBinaryExecuteInfo(const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments) -{ - QString extension = targetInfo.suffix(); - if ((extension.compare("cmd", Qt::CaseInsensitive) == 0) || - (extension.compare("com", Qt::CaseInsensitive) == 0) || - (extension.compare("bat", Qt::CaseInsensitive) == 0)) { - binaryInfo = QFileInfo("C:\\Windows\\System32\\cmd.exe"); - arguments = QString("/C \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - return 1; - } - else if (extension.compare("exe", Qt::CaseInsensitive) == 0) { - binaryInfo = targetInfo; - return 1; - } - else if (extension.compare("jar", Qt::CaseInsensitive) == 0) { - // types that need to be injected into - std::wstring targetPathW = ToWString(targetInfo.absoluteFilePath()); - QString binaryPath; - - { // try to find java automatically - WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(targetPathW.c_str(), nullptr, buffer) > (HINSTANCE)32) { - DWORD binaryType = 0UL; - if (!::GetBinaryTypeW(buffer, &binaryType)) { - qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError()); - } - else if (binaryType == SCS_32BIT_BINARY) { - binaryPath = ToQString(buffer); - } - } - } - if (binaryPath.isEmpty() && (extension == "jar")) { - // second attempt: look to the registry - QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); - if (javaReg.contains("CurrentVersion")) { - QString currentVersion = javaReg.value("CurrentVersion").toString(); - binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); - } - } - if (binaryPath.isEmpty()) { - binaryPath = QFileDialog::getOpenFileName(this, tr("Select binary"), QString(), tr("Binary") + " (*.exe)"); - } - if (binaryPath.isEmpty()) { - return 0; - } - binaryInfo = QFileInfo(binaryPath); - if (extension == "jar") { - arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } - else { - arguments = QString("\"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); - } - return 1; - } - else { - return 2; - } -} - void ModInfoDialog::previewOverwriteDataFile() { // the menu item is only shown for a single selection, but check just in case @@ -1812,23 +1774,7 @@ void ModInfoDialog::openDataFile(const QTreeWidgetItem* item) } QFileInfo targetInfo(item->data(0, Qt::UserRole).toString()); - QFileInfo binaryInfo; - QString arguments; - switch (getBinaryExecuteInfo(targetInfo, binaryInfo, arguments)) { - case 1: { - m_OrganizerCore->spawnBinaryDirect( - binaryInfo, arguments, m_OrganizerCore->currentProfile()->name(), - targetInfo.absolutePath(), "", ""); - } break; - case 2: { - ::ShellExecuteW(nullptr, L"open", - ToWString(targetInfo.absoluteFilePath()).c_str(), - nullptr, nullptr, SW_SHOWNORMAL); - } break; - default: { - // nop - } break; - } + m_OrganizerCore->executeFileVirtualized(this, targetInfo); } void ModInfoDialog::previewDataFile(const QTreeWidgetItem* item) @@ -1838,63 +1784,17 @@ void ModInfoDialog::previewDataFile(const QTreeWidgetItem* item) } QString fileName = QDir::fromNativeSeparators(item->data(0, Qt::UserRole).toString()); + m_OrganizerCore->previewFileWithAlternatives(this, fileName); +} - // what we have is an absolute path to the file in its actual location (for the primary origin) - // what we want is the path relative to the virtual data directory - - // we need to look in the virtual directory for the file to make sure the info is up to date. - - // check if the file comes from the actual data folder instead of a mod - QDir gameDirectory = m_OrganizerCore->managedGame()->dataDirectory().absolutePath(); - QString relativePath = gameDirectory.relativeFilePath(fileName); - QDir direRelativePath = gameDirectory.relativeFilePath(fileName); - // if the file is on a different drive the dirRelativePath will actually be an absolute path so we make sure that is not the case - if (!direRelativePath.isAbsolute() && !relativePath.startsWith("..")) { - fileName = relativePath; - } - else { - // crude: we search for the next slash after the base mod directory to skip everything up to the data-relative directory - int offset = m_OrganizerCore->settings().getModDirectory().size() + 1; - offset = fileName.indexOf("/", offset); - fileName = fileName.mid(offset + 1); - } - - - - const FileEntry::Ptr file = m_OrganizerCore->directoryStructure()->searchFile(ToWString(fileName), nullptr); - - if (file.get() == nullptr) { - reportError(tr("file not found: %1").arg(qUtf8Printable(fileName))); - return; - } - - // set up preview dialog - PreviewDialog preview(fileName); - auto addFunc = [&](int originId) { - FilesOrigin &origin = m_OrganizerCore->directoryStructure()->getOriginByID(originId); - QString filePath = QDir::fromNativeSeparators(ToQString(origin.getPath())) + "/" + fileName; - if (QFile::exists(filePath)) { - // it's very possible the file doesn't exist, because it's inside an archive. we don't support that - QWidget *wid = m_PluginContainer->previewGenerator().genPreview(filePath); - if (wid == nullptr) { - reportError(tr("failed to generate preview for %1").arg(filePath)); - } - else { - preview.addVariant(ToQString(origin.getName()), wid); - } - } - }; +bool ModInfoDialog::canPreviewFile(bool isArchive, const QString& filename) const +{ + if (isArchive) { + return false; + } - addFunc(file->getOrigin()); - for (auto alt : file->getAlternatives()) { - addFunc(alt.first); - } - if (preview.numVariants() > 0) { - preview.exec(); - } - else { - QMessageBox::information(this, tr("Sorry"), tr("Sorry, can't preview anything. This function currently does not support extracting from bsas.")); - } + const auto ext = QFileInfo(filename).suffix(); + return m_PluginContainer->previewGenerator().previewSupported(ext); } bool ModInfoDialog::canHideFile(bool isArchive, const QString& filename) const @@ -1939,12 +1839,9 @@ bool ModInfoDialog::canUnhideConflictItem(const QTreeWidgetItem* item) const bool ModInfoDialog::canPreviewConflictItem(const QTreeWidgetItem* item) const { - const QString fileName = item->data(0, Qt::UserRole).toString(); - if (!m_PluginContainer->previewGenerator().previewSupported(QFileInfo(fileName).suffix())) { - return false; - } - - return true; + return canPreviewFile( + item->data(1, Qt::UserRole + 2).toBool(), + item->data(0, Qt::UserRole).toString()); } void ModInfoDialog::on_overwriteTree_customContextMenuRequested(const QPoint &pos) @@ -2016,7 +1913,7 @@ void ModInfoDialog::on_overwriteTree_customContextMenuRequested(const QPoint &po // note that it is possible for hidden files to appear if they override other // hidden files from another mod if (enableUnhide) { - menu.addAction(tr("Un-Hide"), this, SLOT(unhideConflictFiles())); + menu.addAction(tr("Unhide"), this, SLOT(unhideConflictFiles())); } if (enableOpen) { diff --git a/src/modinfodialog.h b/src/modinfodialog.h index dc04deb3..c0730afa 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -313,7 +313,6 @@ private: QString getFileCategory(int categoryID);
bool recursiveDelete(const QModelIndex &index);
void deleteFile(const QModelIndex &index);
- void openFile(const QModelIndex &index);
void saveIniTweaks();
void saveCategories(QTreeWidgetItem *currentNode);
void saveCurrentTextFile();
@@ -335,7 +334,6 @@ private slots: void unhideConflictFiles();
void previewOverwriteDataFile();
void openOverwriteDataFile();
- int getBinaryExecuteInfo(const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments);
void previewOverwrittenDataFile();
void openOverwrittenDataFile();
@@ -349,10 +347,11 @@ private slots: void delete_activated();
- void deleteTriggered();
- void renameTriggered();
- void openTriggered();
void createDirectoryTriggered();
+ void openTriggered();
+ void previewTriggered();
+ void renameTriggered();
+ void deleteTriggered();
void hideTriggered();
void unhideTriggered();
@@ -415,10 +414,11 @@ private: std::set<int> m_RequestIDs;
bool m_RequestStarted;
- QAction *m_DeleteAction;
- QAction *m_RenameAction;
- QAction *m_OpenAction;
QAction *m_NewFolderAction;
+ QAction *m_OpenAction;
+ QAction *m_PreviewAction;
+ QAction *m_RenameAction;
+ QAction *m_DeleteAction;
QAction *m_HideAction;
QAction *m_UnhideAction;
@@ -440,11 +440,12 @@ private: bool canUnhideConflictItem(const QTreeWidgetItem* item) const;
bool canPreviewConflictItem(const QTreeWidgetItem* item) const;
- void previewDataFile(const QTreeWidgetItem* item);
void openDataFile(const QTreeWidgetItem* item);
+ void previewDataFile(const QTreeWidgetItem* item);
void changeConflictFilesVisibility(bool hide);
void changeFiletreeVisibility(bool hide);
+ bool canPreviewFile(bool isArchive, const QString& filename) const;
bool canHideFile(bool isArchive, const QString& filename) const;
bool canUnhideFile(bool isArchive, const QString& filename) const;
};
diff --git a/src/motddialog.cpp b/src/motddialog.cpp index 96d88542..ca1e60ad 100644 --- a/src/motddialog.cpp +++ b/src/motddialog.cpp @@ -21,8 +21,12 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "bbcode.h"
#include "utility.h"
#include "ui_motddialog.h"
+#include "organizercore.h"
+#include <utility.h>
#include <Shlwapi.h>
+using namespace MOBase;
+
MotDDialog::MotDDialog(const QString &message, QWidget *parent)
: QDialog(parent), ui(new Ui::MotDDialog)
{
@@ -43,5 +47,5 @@ void MotDDialog::on_okButton_clicked() void MotDDialog::linkClicked(const QUrl &url)
{
- ::ShellExecuteW(nullptr, L"open", MOBase::ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ shell::OpenLink(url);
}
diff --git a/src/organizer_en.ts b/src/organizer_en.ts index f38044de..24a58c81 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -323,93 +323,108 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="downloadlist.cpp" line="72"/> - <source>Size</source> + <source>Mod name</source> <translation type="unfinished"></translation> </message> <message> <location filename="downloadlist.cpp" line="73"/> - <source>Status</source> + <source>Version</source> <translation type="unfinished"></translation> </message> <message> <location filename="downloadlist.cpp" line="74"/> + <source>Nexus ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="downloadlist.cpp" line="75"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="downloadlist.cpp" line="76"/> + <source>Status</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="downloadlist.cpp" line="77"/> <source>Filetime</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="89"/> + <location filename="downloadlist.cpp" line="92"/> <source>< game %1 mod %2 file %3 ></source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="90"/> + <location filename="downloadlist.cpp" line="93"/> <source>Unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="91"/> + <location filename="downloadlist.cpp" line="94"/> <source>Pending</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="101"/> + <location filename="downloadlist.cpp" line="128"/> <source>Started</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="102"/> + <location filename="downloadlist.cpp" line="129"/> <source>Canceling</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="103"/> + <location filename="downloadlist.cpp" line="130"/> <source>Pausing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="104"/> + <location filename="downloadlist.cpp" line="131"/> <source>Canceled</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="105"/> + <location filename="downloadlist.cpp" line="132"/> <source>Paused</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="106"/> + <location filename="downloadlist.cpp" line="133"/> <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="107"/> - <location filename="downloadlist.cpp" line="108"/> - <location filename="downloadlist.cpp" line="109"/> + <location filename="downloadlist.cpp" line="134"/> + <location filename="downloadlist.cpp" line="135"/> + <location filename="downloadlist.cpp" line="136"/> <source>Fetching Info</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="110"/> + <location filename="downloadlist.cpp" line="137"/> <source>Downloaded</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="111"/> + <location filename="downloadlist.cpp" line="138"/> <source>Installed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="112"/> + <location filename="downloadlist.cpp" line="139"/> <source>Uninstalled</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="130"/> + <location filename="downloadlist.cpp" line="157"/> <source>Pending download</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlist.cpp" line="134"/> + <location filename="downloadlist.cpp" line="161"/> <source>Information missing, please select "Query Info" from the context menu to re-retrieve.</source> <translation type="unfinished"></translation> </message> @@ -417,145 +432,145 @@ p, li { white-space: pre-wrap; } <context> <name>DownloadListWidget</name> <message> - <location filename="downloadlistwidget.cpp" line="201"/> + <location filename="downloadlistwidget.cpp" line="210"/> <source>Install</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="203"/> + <location filename="downloadlistwidget.cpp" line="212"/> <source>Query Info</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="205"/> + <location filename="downloadlistwidget.cpp" line="214"/> <source>Visit on Nexus</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="206"/> + <location filename="downloadlistwidget.cpp" line="215"/> <source>Open File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="207"/> - <location filename="downloadlistwidget.cpp" line="219"/> - <location filename="downloadlistwidget.cpp" line="224"/> + <location filename="downloadlistwidget.cpp" line="216"/> + <location filename="downloadlistwidget.cpp" line="228"/> + <location filename="downloadlistwidget.cpp" line="233"/> <source>Show in Folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="211"/> - <location filename="downloadlistwidget.cpp" line="222"/> + <location filename="downloadlistwidget.cpp" line="220"/> + <location filename="downloadlistwidget.cpp" line="231"/> <source>Delete</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="213"/> + <location filename="downloadlistwidget.cpp" line="222"/> <source>Un-Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="215"/> + <location filename="downloadlistwidget.cpp" line="224"/> <source>Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="217"/> + <location filename="downloadlistwidget.cpp" line="226"/> <source>Cancel</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="218"/> + <location filename="downloadlistwidget.cpp" line="227"/> <source>Pause</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="223"/> + <location filename="downloadlistwidget.cpp" line="232"/> <source>Resume</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="229"/> + <location filename="downloadlistwidget.cpp" line="238"/> <source>Delete Installed...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="230"/> + <location filename="downloadlistwidget.cpp" line="239"/> <source>Delete Uninstalled...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="231"/> + <location filename="downloadlistwidget.cpp" line="240"/> <source>Delete All...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="235"/> + <location filename="downloadlistwidget.cpp" line="244"/> <source>Hide Installed...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="236"/> + <location filename="downloadlistwidget.cpp" line="245"/> <source>Hide Uninstalled...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="237"/> + <location filename="downloadlistwidget.cpp" line="246"/> <source>Hide All...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="239"/> + <location filename="downloadlistwidget.cpp" line="248"/> <source>Un-Hide All...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="262"/> - <location filename="downloadlistwidget.cpp" line="317"/> + <location filename="downloadlistwidget.cpp" line="271"/> <location filename="downloadlistwidget.cpp" line="326"/> <location filename="downloadlistwidget.cpp" line="335"/> + <location filename="downloadlistwidget.cpp" line="344"/> <source>Delete Files?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="263"/> + <location filename="downloadlistwidget.cpp" line="272"/> <source>This will permanently delete the selected download.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="318"/> + <location filename="downloadlistwidget.cpp" line="327"/> <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="327"/> + <location filename="downloadlistwidget.cpp" line="336"/> <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="336"/> + <location filename="downloadlistwidget.cpp" line="345"/> <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="344"/> <location filename="downloadlistwidget.cpp" line="353"/> <location filename="downloadlistwidget.cpp" line="362"/> + <location filename="downloadlistwidget.cpp" line="371"/> <source>Are you sure?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadlistwidget.cpp" line="345"/> + <location filename="downloadlistwidget.cpp" line="354"/> <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="354"/> + <location filename="downloadlistwidget.cpp" line="363"/> <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="363"/> + <location filename="downloadlistwidget.cpp" line="372"/> <source>This will remove all uninstalled downloads from this list (but NOT from disk).</source> <translation type="unfinished"></translation> </message> @@ -588,17 +603,17 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="557"/> + <location filename="downloadmanager.cpp" line="568"/> <source>Wrong Game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="557"/> + <location filename="downloadmanager.cpp" line="568"/> <source>The download link is for a mod for "%1" but this instance of MO has been set up for "%2".</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="565"/> + <location filename="downloadmanager.cpp" line="576"/> <source>There is already a download queued for this file. Mod %1 @@ -606,12 +621,12 @@ File %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="571"/> + <location filename="downloadmanager.cpp" line="582"/> <source>Already Queued</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="580"/> + <location filename="downloadmanager.cpp" line="591"/> <source>There is already a download started for this file. Mod %1: %2 @@ -619,266 +634,266 @@ File %3: %4</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="615"/> + <location filename="downloadmanager.cpp" line="626"/> <source>Already Started</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="644"/> - <location filename="downloadmanager.cpp" line="777"/> + <location filename="downloadmanager.cpp" line="655"/> + <location filename="downloadmanager.cpp" line="788"/> <source>remove: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="663"/> + <location filename="downloadmanager.cpp" line="674"/> <source>failed to delete %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="670"/> + <location filename="downloadmanager.cpp" line="681"/> <source>failed to delete meta file for %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="730"/> + <location filename="downloadmanager.cpp" line="741"/> <source>restore: invalid download index: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="799"/> + <location filename="downloadmanager.cpp" line="810"/> <source>cancel: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="812"/> + <location filename="downloadmanager.cpp" line="823"/> <source>pause: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="834"/> + <location filename="downloadmanager.cpp" line="845"/> <source>resume: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="845"/> + <location filename="downloadmanager.cpp" line="856"/> <source>resume (int): invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="869"/> + <location filename="downloadmanager.cpp" line="880"/> <source>No known download urls. Sorry, this download can't be resumed.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="910"/> - <location filename="downloadmanager.cpp" line="962"/> + <location filename="downloadmanager.cpp" line="921"/> + <location filename="downloadmanager.cpp" line="973"/> <source>query: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="932"/> + <location filename="downloadmanager.cpp" line="943"/> <source>Please enter the nexus mod id</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="932"/> + <location filename="downloadmanager.cpp" line="943"/> <source>Mod ID:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="943"/> + <location filename="downloadmanager.cpp" line="954"/> <source>Please select the source game code for %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1002"/> + <location filename="downloadmanager.cpp" line="1013"/> <source>VisitNexus: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1023"/> + <location filename="downloadmanager.cpp" line="1034"/> <source>Nexus ID for this Mod is unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1030"/> + <location filename="downloadmanager.cpp" line="1041"/> <source>OpenFile: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1047"/> + <location filename="downloadmanager.cpp" line="1058"/> <source>OpenFileInDownloadsFolder: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1083"/> + <location filename="downloadmanager.cpp" line="1094"/> <source>get pending: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1092"/> + <location filename="downloadmanager.cpp" line="1103"/> <source>get path: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1101"/> + <location filename="downloadmanager.cpp" line="1112"/> <source>Main</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1102"/> + <location filename="downloadmanager.cpp" line="1113"/> <source>Update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1103"/> + <location filename="downloadmanager.cpp" line="1114"/> <source>Optional</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1104"/> + <location filename="downloadmanager.cpp" line="1115"/> <source>Old</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1105"/> + <location filename="downloadmanager.cpp" line="1116"/> <source>Miscellaneous</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1106"/> + <location filename="downloadmanager.cpp" line="1117"/> <source>Deleted</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1107"/> + <location filename="downloadmanager.cpp" line="1118"/> <source>Unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1114"/> + <location filename="downloadmanager.cpp" line="1125"/> <source>display name: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1134"/> + <location filename="downloadmanager.cpp" line="1145"/> <source>file name: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1143"/> + <location filename="downloadmanager.cpp" line="1154"/> <source>file time: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1157"/> + <location filename="downloadmanager.cpp" line="1168"/> <source>file size: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1167"/> + <location filename="downloadmanager.cpp" line="1178"/> <source>progress: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1177"/> + <location filename="downloadmanager.cpp" line="1188"/> <source>state: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1187"/> + <location filename="downloadmanager.cpp" line="1198"/> <source>infocomplete: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1202"/> - <location filename="downloadmanager.cpp" line="1210"/> + <location filename="downloadmanager.cpp" line="1213"/> + <location filename="downloadmanager.cpp" line="1221"/> <source>mod id: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1218"/> + <location filename="downloadmanager.cpp" line="1229"/> <source>ishidden: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1227"/> + <location filename="downloadmanager.cpp" line="1238"/> <source>file info: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1237"/> + <location filename="downloadmanager.cpp" line="1248"/> <source>mark installed: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1282"/> + <location filename="downloadmanager.cpp" line="1293"/> <source>mark uninstalled: invalid download index %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1459"/> + <location filename="downloadmanager.cpp" line="1470"/> <source>Memory allocation error (in processing progress event).</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1469"/> + <location filename="downloadmanager.cpp" line="1480"/> <source>Memory allocation error (in processing downloaded data).</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1585"/> + <location filename="downloadmanager.cpp" line="1596"/> <source>Information updated</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1587"/> - <location filename="downloadmanager.cpp" line="1602"/> + <location filename="downloadmanager.cpp" line="1598"/> + <location filename="downloadmanager.cpp" line="1613"/> <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="1589"/> + <location filename="downloadmanager.cpp" line="1600"/> <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="1717"/> + <location filename="downloadmanager.cpp" line="1728"/> <source>No download server available. Please try again later.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1882"/> + <location filename="downloadmanager.cpp" line="1893"/> <source>Failed to request file info from nexus: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1909"/> + <location filename="downloadmanager.cpp" line="1920"/> <source>Warning: Content type is: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1914"/> + <location filename="downloadmanager.cpp" line="1925"/> <source>Download header content length: %1 downloaded file size: %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1916"/> + <location filename="downloadmanager.cpp" line="1927"/> <source>Download failed: %1 (%2)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="1938"/> + <location filename="downloadmanager.cpp" line="1949"/> <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="2021"/> + <location filename="downloadmanager.cpp" line="2032"/> <source>failed to re-open %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="downloadmanager.cpp" line="2062"/> + <location filename="downloadmanager.cpp" line="2073"/> <source>Unable to write download to drive (return %1). Check the drive's available storage. @@ -1568,7 +1583,7 @@ p, li { white-space: pre-wrap; } <message> <location filename="mainwindow.ui" line="287"/> <location filename="mainwindow.ui" line="851"/> - <location filename="mainwindow.cpp" line="4679"/> + <location filename="mainwindow.cpp" line="4685"/> <source>Create Backup</source> <translation type="unfinished"></translation> </message> @@ -1759,8 +1774,8 @@ p, li { white-space: pre-wrap; } <message> <location filename="mainwindow.ui" line="1073"/> <location filename="mainwindow.ui" line="1216"/> - <location filename="mainwindow.cpp" line="4552"/> - <location filename="mainwindow.cpp" line="5494"/> + <location filename="mainwindow.cpp" line="4558"/> + <location filename="mainwindow.cpp" line="5500"/> <source>Refresh</source> <translation type="unfinished"></translation> </message> @@ -1955,7 +1970,7 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="mainwindow.ui" line="1498"/> - <location filename="mainwindow.cpp" line="5443"/> + <location filename="mainwindow.cpp" line="5449"/> <source>Update</source> <translation type="unfinished"></translation> </message> @@ -1993,7 +2008,7 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="mainwindow.ui" line="1543"/> - <location filename="mainwindow.cpp" line="5517"/> + <location filename="mainwindow.cpp" line="5523"/> <source>Endorse Mod Organizer</source> <translation type="unfinished"></translation> </message> @@ -2061,8 +2076,8 @@ Error: %1</source> </message> <message> <location filename="mainwindow.cpp" line="758"/> - <location filename="mainwindow.cpp" line="4689"/> - <location filename="mainwindow.cpp" line="4693"/> + <location filename="mainwindow.cpp" line="4695"/> + <location filename="mainwindow.cpp" line="4699"/> <source>Endorse</source> <translation type="unfinished"></translation> </message> @@ -2182,733 +2197,733 @@ Error: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="1905"/> + <location filename="mainwindow.cpp" line="1911"/> <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="2007"/> + <location filename="mainwindow.cpp" line="2013"/> <source>Choose Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2008"/> + <location filename="mainwindow.cpp" line="2014"/> <source>Mod Archive</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2195"/> + <location filename="mainwindow.cpp" line="2201"/> <source>Start Tutorial?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2196"/> + <location filename="mainwindow.cpp" line="2202"/> <source>You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2374"/> + <location filename="mainwindow.cpp" line="2380"/> <source>failed to spawn notepad.exe: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2414"/> + <location filename="mainwindow.cpp" line="2420"/> <source>failed to change origin name: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2438"/> + <location filename="mainwindow.cpp" line="2444"/> <source>failed to move "%1" from mod "%2" to "%3": %4</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2462"/> + <location filename="mainwindow.cpp" line="2468"/> <source><Contains %1></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2497"/> + <location filename="mainwindow.cpp" line="2503"/> <source><Checked></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2498"/> + <location filename="mainwindow.cpp" line="2504"/> <source><Unchecked></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2499"/> + <location filename="mainwindow.cpp" line="2505"/> <source><Update></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2500"/> + <location filename="mainwindow.cpp" line="2506"/> <source><Mod Backup></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2501"/> + <location filename="mainwindow.cpp" line="2507"/> <source><Managed by MO></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2502"/> + <location filename="mainwindow.cpp" line="2508"/> <source><Managed outside MO></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2503"/> + <location filename="mainwindow.cpp" line="2509"/> <source><No category></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2504"/> + <location filename="mainwindow.cpp" line="2510"/> <source><Conflicted></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2505"/> + <location filename="mainwindow.cpp" line="2511"/> <source><Not Endorsed></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2551"/> + <location filename="mainwindow.cpp" line="2557"/> <source>failed to rename mod: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2564"/> + <location filename="mainwindow.cpp" line="2570"/> <source>Overwrite?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2565"/> + <location filename="mainwindow.cpp" line="2571"/> <source>This will replace the existing mod "%1". Continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2568"/> + <location filename="mainwindow.cpp" line="2574"/> <source>failed to remove mod "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2572"/> - <location filename="mainwindow.cpp" line="5269"/> - <location filename="mainwindow.cpp" line="5293"/> + <location filename="mainwindow.cpp" line="2578"/> + <location filename="mainwindow.cpp" line="5275"/> + <location filename="mainwindow.cpp" line="5299"/> <source>failed to rename "%1" to "%2"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2660"/> - <location filename="mainwindow.cpp" line="4255"/> - <location filename="mainwindow.cpp" line="4263"/> - <location filename="mainwindow.cpp" line="4818"/> + <location filename="mainwindow.cpp" line="2666"/> + <location filename="mainwindow.cpp" line="4261"/> + <location filename="mainwindow.cpp" line="4269"/> + <location filename="mainwindow.cpp" line="4824"/> <source>Confirm</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2661"/> + <location filename="mainwindow.cpp" line="2667"/> <source>Remove the following mods?<br><ul>%1</ul></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2676"/> + <location filename="mainwindow.cpp" line="2682"/> <source>failed to remove mod: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2708"/> - <location filename="mainwindow.cpp" line="2711"/> - <location filename="mainwindow.cpp" line="2721"/> + <location filename="mainwindow.cpp" line="2714"/> + <location filename="mainwindow.cpp" line="2717"/> + <location filename="mainwindow.cpp" line="2727"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2708"/> + <location filename="mainwindow.cpp" line="2714"/> <source>Installation file no longer exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2712"/> + <location filename="mainwindow.cpp" line="2718"/> <source>Mods installed with old versions of MO can't be reinstalled in this way.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2722"/> + <location filename="mainwindow.cpp" line="2728"/> <source>Failed to create backup.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2739"/> + <location filename="mainwindow.cpp" line="2745"/> <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="2755"/> - <location filename="mainwindow.cpp" line="2781"/> - <location filename="mainwindow.cpp" line="2815"/> - <location filename="mainwindow.cpp" line="2840"/> + <location filename="mainwindow.cpp" line="2761"/> + <location filename="mainwindow.cpp" line="2787"/> + <location filename="mainwindow.cpp" line="2821"/> + <location filename="mainwindow.cpp" line="2846"/> <source>You need to be logged in with Nexus to endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2766"/> - <location filename="mainwindow.cpp" line="2774"/> + <location filename="mainwindow.cpp" line="2772"/> + <location filename="mainwindow.cpp" line="2780"/> <source>Endorsing multiple mods will take a while. Please wait...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2826"/> - <location filename="mainwindow.cpp" line="2833"/> + <location filename="mainwindow.cpp" line="2832"/> + <location filename="mainwindow.cpp" line="2839"/> <source>Unendorsing multiple mods will take a while. Please wait...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2861"/> - <location filename="mainwindow.cpp" line="2884"/> - <location filename="mainwindow.cpp" line="2909"/> + <location filename="mainwindow.cpp" line="2867"/> + <location filename="mainwindow.cpp" line="2890"/> + <location filename="mainwindow.cpp" line="2915"/> <source>You need to be logged in with Nexus to track</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="2968"/> + <location filename="mainwindow.cpp" line="2974"/> <source>Failed to display overwrite dialog: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3155"/> + <location filename="mainwindow.cpp" line="3161"/> <source>Opening Nexus Links</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3156"/> + <location filename="mainwindow.cpp" line="3162"/> <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="3185"/> + <location filename="mainwindow.cpp" line="3191"/> <source>Nexus ID for this Mod is unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3197"/> + <location filename="mainwindow.cpp" line="3203"/> <source>Opening Web Pages</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3198"/> + <location filename="mainwindow.cpp" line="3204"/> <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="3227"/> + <location filename="mainwindow.cpp" line="3233"/> <source>Web page for this mod is unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3414"/> + <location filename="mainwindow.cpp" line="3420"/> <source><table cellspacing="5"><tr><th>Type</th><th>All</th><th>Visible</th><tr><td>Enabled mods:&emsp;</td><td align=right>%1 / %2</td><td align=right>%3 / %4</td></tr><tr><td>Unmanaged/DLCs:&emsp;</td><td align=right>%5</td><td align=right>%6</td></tr><tr><td>Mod backups:&emsp;</td><td align=right>%7</td><td align=right>%8</td></tr><tr><td>Separators:&emsp;</td><td align=right>%9</td><td align=right>%10</td></tr></table></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3469"/> + <location filename="mainwindow.cpp" line="3475"/> <source><table cellspacing="6"><tr><th>Type</th><th>Active </th><th>Total</th></tr><tr><td>All plugins:</td><td align=right>%1 </td><td align=right>%2</td></tr><tr><td>ESMs:</td><td align=right>%3 </td><td align=right>%4</td></tr><tr><td>ESPs:</td><td align=right>%7 </td><td align=right>%8</td></tr><tr><td>ESMs+ESPs:</td><td align=right>%9 </td><td align=right>%10</td></tr><tr><td>ESLs:</td><td align=right>%5 </td><td align=right>%6</td></tr></table></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3501"/> - <location filename="mainwindow.cpp" line="3639"/> - <location filename="mainwindow.cpp" line="4614"/> + <location filename="mainwindow.cpp" line="3507"/> + <location filename="mainwindow.cpp" line="3645"/> + <location filename="mainwindow.cpp" line="4620"/> <source>Create Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3502"/> + <location filename="mainwindow.cpp" line="3508"/> <source>This will create an empty mod. Please enter a name:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3511"/> - <location filename="mainwindow.cpp" line="3649"/> + <location filename="mainwindow.cpp" line="3517"/> + <location filename="mainwindow.cpp" line="3655"/> <source>A mod with this name already exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3539"/> + <location filename="mainwindow.cpp" line="3545"/> <source>Create Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3540"/> + <location filename="mainwindow.cpp" line="3546"/> <source>This will create a new separator. Please enter a name:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3547"/> + <location filename="mainwindow.cpp" line="3553"/> <source>A separator with this name already exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3640"/> + <location filename="mainwindow.cpp" line="3646"/> <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="3721"/> + <location filename="mainwindow.cpp" line="3727"/> <source>Move successful.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3742"/> - <location filename="mainwindow.cpp" line="6101"/> + <location filename="mainwindow.cpp" line="3748"/> + <location filename="mainwindow.cpp" line="6107"/> <source>Are you sure?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="3743"/> + <location filename="mainwindow.cpp" line="3749"/> <source>About to recursively delete: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4137"/> + <location filename="mainwindow.cpp" line="4143"/> <source>Continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4138"/> + <location filename="mainwindow.cpp" line="4144"/> <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="4158"/> - <location filename="mainwindow.cpp" line="5411"/> + <location filename="mainwindow.cpp" line="4164"/> + <location filename="mainwindow.cpp" line="5417"/> <source>Sorry</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4159"/> + <location filename="mainwindow.cpp" line="4165"/> <source>I don't know a versioning scheme where %1 is newer than %2.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4255"/> + <location filename="mainwindow.cpp" line="4261"/> <source>Really enable all visible mods?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4263"/> + <location filename="mainwindow.cpp" line="4269"/> <source>Really disable all visible mods?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4343"/> + <location filename="mainwindow.cpp" line="4349"/> <source>Export to csv</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4346"/> + <location filename="mainwindow.cpp" line="4352"/> <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="4349"/> + <location filename="mainwindow.cpp" line="4355"/> <source>Select what mods you want export:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4350"/> + <location filename="mainwindow.cpp" line="4356"/> <source>All installed mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4351"/> + <location filename="mainwindow.cpp" line="4357"/> <source>Only active (checked) mods from your current profile</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4352"/> + <location filename="mainwindow.cpp" line="4358"/> <source>All currently visible mods in the mod list</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4373"/> + <location filename="mainwindow.cpp" line="4379"/> <source>Choose what Columns to export:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4376"/> + <location filename="mainwindow.cpp" line="4382"/> <source>Mod_Priority</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4378"/> + <location filename="mainwindow.cpp" line="4384"/> <source>Mod_Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4380"/> + <location filename="mainwindow.cpp" line="4386"/> <source>Notes_column</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4381"/> + <location filename="mainwindow.cpp" line="4387"/> <source>Mod_Status</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4382"/> + <location filename="mainwindow.cpp" line="4388"/> <source>Primary_Category</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4383"/> + <location filename="mainwindow.cpp" line="4389"/> <source>Nexus_ID</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4384"/> + <location filename="mainwindow.cpp" line="4390"/> <source>Mod_Nexus_URL</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4385"/> + <location filename="mainwindow.cpp" line="4391"/> <source>Mod_Version</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4386"/> + <location filename="mainwindow.cpp" line="4392"/> <source>Install_Date</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4387"/> + <location filename="mainwindow.cpp" line="4393"/> <source>Download_File_Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4494"/> + <location filename="mainwindow.cpp" line="4500"/> <source>export failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4513"/> + <location filename="mainwindow.cpp" line="4519"/> <source>Open Game folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4515"/> + <location filename="mainwindow.cpp" line="4521"/> <source>Open MyGames folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4517"/> + <location filename="mainwindow.cpp" line="4523"/> <source>Open INIs folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4521"/> + <location filename="mainwindow.cpp" line="4527"/> <source>Open Instance folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4523"/> + <location filename="mainwindow.cpp" line="4529"/> <source>Open Mods folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4525"/> + <location filename="mainwindow.cpp" line="4531"/> <source>Open Profile folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4527"/> + <location filename="mainwindow.cpp" line="4533"/> <source>Open Downloads folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4531"/> + <location filename="mainwindow.cpp" line="4537"/> <source>Open MO2 Install folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4533"/> + <location filename="mainwindow.cpp" line="4539"/> <source>Open MO2 Plugins folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4535"/> + <location filename="mainwindow.cpp" line="4541"/> <source>Open MO2 Logs folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4543"/> + <location filename="mainwindow.cpp" line="4549"/> <source>Install Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4544"/> + <location filename="mainwindow.cpp" line="4550"/> <source>Create empty mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4545"/> + <location filename="mainwindow.cpp" line="4551"/> <source>Create Separator</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4549"/> + <location filename="mainwindow.cpp" line="4555"/> <source>Enable all visible</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4550"/> + <location filename="mainwindow.cpp" line="4556"/> <source>Disable all visible</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4551"/> + <location filename="mainwindow.cpp" line="4557"/> <source>Check for updates</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4553"/> + <location filename="mainwindow.cpp" line="4559"/> <source>Export to csv...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4562"/> - <location filename="mainwindow.cpp" line="4578"/> + <location filename="mainwindow.cpp" line="4568"/> + <location filename="mainwindow.cpp" line="4584"/> <source>Send to</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4563"/> - <location filename="mainwindow.cpp" line="4579"/> + <location filename="mainwindow.cpp" line="4569"/> + <location filename="mainwindow.cpp" line="4585"/> <source>Top</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4564"/> - <location filename="mainwindow.cpp" line="4580"/> + <location filename="mainwindow.cpp" line="4570"/> + <location filename="mainwindow.cpp" line="4586"/> <source>Bottom</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4565"/> - <location filename="mainwindow.cpp" line="4581"/> + <location filename="mainwindow.cpp" line="4571"/> + <location filename="mainwindow.cpp" line="4587"/> <source>Priority...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4566"/> + <location filename="mainwindow.cpp" line="4572"/> <source>Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4605"/> + <location filename="mainwindow.cpp" line="4611"/> <source>All Mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4613"/> + <location filename="mainwindow.cpp" line="4619"/> <source>Sync to Mods...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4615"/> + <location filename="mainwindow.cpp" line="4621"/> <source>Move content to Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4616"/> + <location filename="mainwindow.cpp" line="4622"/> <source>Clear Overwrite...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4618"/> - <location filename="mainwindow.cpp" line="4736"/> + <location filename="mainwindow.cpp" line="4624"/> + <location filename="mainwindow.cpp" line="4742"/> <source>Open in Explorer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4620"/> + <location filename="mainwindow.cpp" line="4626"/> <source>Restore Backup</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4621"/> + <location filename="mainwindow.cpp" line="4627"/> <source>Remove Backup...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4624"/> - <location filename="mainwindow.cpp" line="4643"/> + <location filename="mainwindow.cpp" line="4630"/> + <location filename="mainwindow.cpp" line="4649"/> <source>Change Categories</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4628"/> - <location filename="mainwindow.cpp" line="4648"/> + <location filename="mainwindow.cpp" line="4634"/> + <location filename="mainwindow.cpp" line="4654"/> <source>Primary Category</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4632"/> + <location filename="mainwindow.cpp" line="4638"/> <source>Rename Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4633"/> + <location filename="mainwindow.cpp" line="4639"/> <source>Remove Separator...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4636"/> + <location filename="mainwindow.cpp" line="4642"/> <source>Select Color...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4638"/> + <location filename="mainwindow.cpp" line="4644"/> <source>Reset Color</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4655"/> + <location filename="mainwindow.cpp" line="4661"/> <source>Change versioning scheme</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4659"/> + <location filename="mainwindow.cpp" line="4665"/> <source>Force-check updates</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4661"/> + <location filename="mainwindow.cpp" line="4667"/> <source>Un-ignore update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4664"/> + <location filename="mainwindow.cpp" line="4670"/> <source>Ignore update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4669"/> - <location filename="mainwindow.cpp" line="6214"/> + <location filename="mainwindow.cpp" line="4675"/> + <location filename="mainwindow.cpp" line="6220"/> <source>Enable selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4670"/> - <location filename="mainwindow.cpp" line="6215"/> + <location filename="mainwindow.cpp" line="4676"/> + <location filename="mainwindow.cpp" line="6221"/> <source>Disable selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4676"/> + <location filename="mainwindow.cpp" line="4682"/> <source>Rename Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4677"/> + <location filename="mainwindow.cpp" line="4683"/> <source>Reinstall Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4678"/> + <location filename="mainwindow.cpp" line="4684"/> <source>Remove Mod...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4686"/> + <location filename="mainwindow.cpp" line="4692"/> <source>Un-Endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4690"/> + <location filename="mainwindow.cpp" line="4696"/> <source>Won't endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4696"/> + <location filename="mainwindow.cpp" line="4702"/> <source>Endorsement state unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4706"/> + <location filename="mainwindow.cpp" line="4712"/> <source>Start tracking</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4709"/> + <location filename="mainwindow.cpp" line="4715"/> <source>Stop tracking</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4712"/> + <location filename="mainwindow.cpp" line="4718"/> <source>Tracked state unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4723"/> + <location filename="mainwindow.cpp" line="4729"/> <source>Ignore missing data</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4727"/> + <location filename="mainwindow.cpp" line="4733"/> <source>Mark as converted/working</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4731"/> + <location filename="mainwindow.cpp" line="4737"/> <source>Visit on Nexus</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4733"/> + <location filename="mainwindow.cpp" line="4739"/> <source>Visit web page</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4740"/> + <location filename="mainwindow.cpp" line="4746"/> <source>Information...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4747"/> - <location filename="mainwindow.cpp" line="6267"/> + <location filename="mainwindow.cpp" line="4753"/> + <location filename="mainwindow.cpp" line="6273"/> <source>Exception: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4749"/> - <location filename="mainwindow.cpp" line="6269"/> + <location filename="mainwindow.cpp" line="4755"/> + <location filename="mainwindow.cpp" line="6275"/> <source>Unknown exception</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4778"/> + <location filename="mainwindow.cpp" line="4784"/> <source><All></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4780"/> + <location filename="mainwindow.cpp" line="4786"/> <source><Multiple></source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4815"/> + <location filename="mainwindow.cpp" line="4821"/> <source>%1 more</source> <translation type="unfinished"></translation> </message> <message numerus="yes"> - <location filename="mainwindow.cpp" line="4819"/> + <location filename="mainwindow.cpp" line="4825"/> <source>Are you sure you want to remove the following %n save(s)?<br><ul>%1</ul><br>Removed saves will be sent to the Recycle Bin.</source> <translation type="unfinished"> <numerusform></numerusform> @@ -2916,12 +2931,12 @@ You can also use online editors and converters instead.</source> </translation> </message> <message> - <location filename="mainwindow.cpp" line="4864"/> + <location filename="mainwindow.cpp" line="4870"/> <source>Enable Mods...</source> <translation type="unfinished"></translation> </message> <message numerus="yes"> - <location filename="mainwindow.cpp" line="4879"/> + <location filename="mainwindow.cpp" line="4885"/> <source>Delete %n save(s)</source> <translation type="unfinished"> <numerusform></numerusform> @@ -2929,22 +2944,22 @@ You can also use online editors and converters instead.</source> </translation> </message> <message> - <location filename="mainwindow.cpp" line="4921"/> + <location filename="mainwindow.cpp" line="4927"/> <source>failed to remove %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4943"/> + <location filename="mainwindow.cpp" line="4949"/> <source>failed to create %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4973"/> + <location filename="mainwindow.cpp" line="4979"/> <source>Restarting MO</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4974"/> + <location filename="mainwindow.cpp" line="4980"/> <source>Changing the managed game directory requires restarting MO. Any pending downloads will be paused. @@ -2952,373 +2967,373 @@ Click OK to restart MO now.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="4994"/> + <location filename="mainwindow.cpp" line="5000"/> <source>Can't change download directory while downloads are in progress!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5140"/> + <location filename="mainwindow.cpp" line="5146"/> <source>failed to write to file %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5146"/> + <location filename="mainwindow.cpp" line="5152"/> <source>%1 written</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5188"/> + <location filename="mainwindow.cpp" line="5194"/> <source>Select binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5188"/> + <location filename="mainwindow.cpp" line="5194"/> <source>Binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5214"/> + <location filename="mainwindow.cpp" line="5220"/> <source>Enter Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5215"/> + <location filename="mainwindow.cpp" line="5221"/> <source>Please enter a name for the executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5229"/> + <location filename="mainwindow.cpp" line="5235"/> <source>Not an executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5229"/> + <location filename="mainwindow.cpp" line="5235"/> <source>This is not a recognized executable.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5254"/> - <location filename="mainwindow.cpp" line="5279"/> + <location filename="mainwindow.cpp" line="5260"/> + <location filename="mainwindow.cpp" line="5285"/> <source>Replace file?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5254"/> + <location filename="mainwindow.cpp" line="5260"/> <source>There already is a hidden version of this file. Replace it?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5257"/> - <location filename="mainwindow.cpp" line="5282"/> + <location filename="mainwindow.cpp" line="5263"/> + <location filename="mainwindow.cpp" line="5288"/> <source>File operation failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5257"/> - <location filename="mainwindow.cpp" line="5282"/> + <location filename="mainwindow.cpp" line="5263"/> + <location filename="mainwindow.cpp" line="5288"/> <source>Failed to remove "%1". Maybe you lack the required file permissions?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5279"/> + <location filename="mainwindow.cpp" line="5285"/> <source>There already is a visible version of this file. Replace it?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5323"/> - <location filename="mainwindow.cpp" line="6881"/> + <location filename="mainwindow.cpp" line="5329"/> + <location filename="mainwindow.cpp" line="6887"/> <source>Set Priority</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5323"/> + <location filename="mainwindow.cpp" line="5329"/> <source>Set the priority of the selected plugins</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5378"/> + <location filename="mainwindow.cpp" line="5384"/> <source>file not found: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5391"/> + <location filename="mainwindow.cpp" line="5397"/> <source>failed to generate preview for %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5411"/> + <location filename="mainwindow.cpp" line="5417"/> <source>Sorry, can't preview anything. This function currently does not support extracting from bsas.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5445"/> + <location filename="mainwindow.cpp" line="5451"/> <source>Update available</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5474"/> + <location filename="mainwindow.cpp" line="5480"/> <source>Open/Execute</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5475"/> + <location filename="mainwindow.cpp" line="5481"/> <source>Add as Executable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5479"/> + <location filename="mainwindow.cpp" line="5485"/> <source>Preview</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5485"/> + <location filename="mainwindow.cpp" line="5491"/> <source>Un-Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5487"/> + <location filename="mainwindow.cpp" line="5493"/> <source>Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5493"/> + <location filename="mainwindow.cpp" line="5499"/> <source>Write To File...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5518"/> + <location filename="mainwindow.cpp" line="5524"/> <source>Do you want to endorse Mod Organizer on %1 now?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5532"/> + <location filename="mainwindow.cpp" line="5538"/> <source>Abstain from Endorsing Mod Organizer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5533"/> + <location filename="mainwindow.cpp" line="5539"/> <source>Are you sure you want to abstain from endorsing Mod Organizer 2? You will have to visit the mod page on the %1 Nexus site to change your mind.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5614"/> - <location filename="mainwindow.cpp" line="5615"/> + <location filename="mainwindow.cpp" line="5620"/> + <location filename="mainwindow.cpp" line="5621"/> <source>Thank you for endorsing MO2! :)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5617"/> - <location filename="mainwindow.cpp" line="5618"/> + <location filename="mainwindow.cpp" line="5623"/> + <location filename="mainwindow.cpp" line="5624"/> <source>Please reconsider endorsing MO2 on Nexus!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5853"/> + <location filename="mainwindow.cpp" line="5859"/> <source>Thank you!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5853"/> + <location filename="mainwindow.cpp" line="5859"/> <source>Thank you for your endorsement!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5856"/> + <location filename="mainwindow.cpp" line="5862"/> <source>Okay.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5856"/> + <location filename="mainwindow.cpp" line="5862"/> <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="5915"/> + <location filename="mainwindow.cpp" line="5921"/> <source>Mod ID %1 no longer seems to be available on Nexus.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5917"/> + <location filename="mainwindow.cpp" line="5923"/> <source>Request to Nexus failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5953"/> - <location filename="mainwindow.cpp" line="6015"/> + <location filename="mainwindow.cpp" line="5959"/> + <location filename="mainwindow.cpp" line="6021"/> <source>failed to read %1: %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5965"/> - <location filename="mainwindow.cpp" line="6457"/> + <location filename="mainwindow.cpp" line="5971"/> + <location filename="mainwindow.cpp" line="6463"/> <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5965"/> + <location filename="mainwindow.cpp" line="5971"/> <source>failed to extract %1 (errorcode %2)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="5997"/> + <location filename="mainwindow.cpp" line="6003"/> <source>Extract BSA</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6026"/> + <location filename="mainwindow.cpp" line="6032"/> <source>This archive contains invalid hashes. Some files may be broken.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6072"/> + <location filename="mainwindow.cpp" line="6078"/> <source>Extract...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6102"/> + <location filename="mainwindow.cpp" line="6108"/> <source>This will restart MO, continue?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6149"/> + <location filename="mainwindow.cpp" line="6155"/> <source>Edit Categories...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6150"/> + <location filename="mainwindow.cpp" line="6156"/> <source>Deselect filter</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6203"/> + <location filename="mainwindow.cpp" line="6209"/> <source>Remove</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6219"/> + <location filename="mainwindow.cpp" line="6225"/> <source>Enable all</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6220"/> + <location filename="mainwindow.cpp" line="6226"/> <source>Disable all</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6241"/> + <location filename="mainwindow.cpp" line="6247"/> <source>Unlock load order</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6244"/> + <location filename="mainwindow.cpp" line="6250"/> <source>Lock load order</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6254"/> + <location filename="mainwindow.cpp" line="6260"/> <source>Open Origin in Explorer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6259"/> + <location filename="mainwindow.cpp" line="6265"/> <source>Open Origin Info...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6403"/> + <location filename="mainwindow.cpp" line="6409"/> <source>depends on missing "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6407"/> + <location filename="mainwindow.cpp" line="6413"/> <source>incompatible with "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6433"/> + <location filename="mainwindow.cpp" line="6439"/> <source>Please wait while LOOT is running</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6530"/> + <location filename="mainwindow.cpp" line="6536"/> <source>loot failed. Exit code was: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6552"/> + <location filename="mainwindow.cpp" line="6558"/> <source>failed to start loot</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6555"/> + <location filename="mainwindow.cpp" line="6561"/> <source>failed to run loot: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6559"/> + <location filename="mainwindow.cpp" line="6565"/> <source>Errors occured</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6606"/> + <location filename="mainwindow.cpp" line="6612"/> <source>Backup of load order created</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6616"/> + <location filename="mainwindow.cpp" line="6622"/> <source>Choose backup to restore</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6629"/> + <location filename="mainwindow.cpp" line="6635"/> <source>No Backups</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6629"/> + <location filename="mainwindow.cpp" line="6635"/> <source>There are no backups to restore</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6650"/> - <location filename="mainwindow.cpp" line="6672"/> + <location filename="mainwindow.cpp" line="6656"/> + <location filename="mainwindow.cpp" line="6678"/> <source>Restore failed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6651"/> - <location filename="mainwindow.cpp" line="6673"/> + <location filename="mainwindow.cpp" line="6657"/> + <location filename="mainwindow.cpp" line="6679"/> <source>Failed to restore the backup. Errorcode: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6662"/> + <location filename="mainwindow.cpp" line="6668"/> <source>Backup of modlist created</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6768"/> + <location filename="mainwindow.cpp" line="6774"/> <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="6770"/> + <location filename="mainwindow.cpp" line="6776"/> <source>Overwrite</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6771"/> + <location filename="mainwindow.cpp" line="6777"/> <source>Rename new file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6772"/> + <location filename="mainwindow.cpp" line="6778"/> <source>Ignore file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="mainwindow.cpp" line="6881"/> + <location filename="mainwindow.cpp" line="6887"/> <source>Set the priority of the selected mods</source> <translation type="unfinished"></translation> </message> @@ -3581,63 +3596,64 @@ Most mods do not have optional esps, so chances are good you are looking at an e <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="409"/> + <location filename="modinfodialog.ui" line="424"/> <source>The following conflicted files are provided by this mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="462"/> - <location filename="modinfodialog.ui" line="518"/> + <location filename="modinfodialog.ui" line="479"/> + <location filename="modinfodialog.ui" line="549"/> + <location filename="modinfodialog.ui" line="613"/> <source>File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="467"/> + <location filename="modinfodialog.ui" line="484"/> <source>Overwritten Mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="477"/> + <location filename="modinfodialog.ui" line="506"/> <source>The following conflicted files are provided by other mods</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="523"/> + <location filename="modinfodialog.ui" line="554"/> <source>Providing Mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="533"/> - <source>Non-Conflicted files</source> + <location filename="modinfodialog.ui" line="576"/> + <source>The following files have no conflicts</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="553"/> + <location filename="modinfodialog.ui" line="635"/> <source>Categories</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="576"/> + <location filename="modinfodialog.ui" line="658"/> <source>Primary Category</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="593"/> + <location filename="modinfodialog.ui" line="675"/> <source>Nexus Info</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="601"/> + <location filename="modinfodialog.ui" line="683"/> <source>Mod ID</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="608"/> + <location filename="modinfodialog.ui" line="690"/> <source>Mod ID for this mod on Nexus.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="611"/> + <location filename="modinfodialog.ui" line="693"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3646,22 +3662,22 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="638"/> + <location filename="modinfodialog.ui" line="720"/> <source>Source Game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="645"/> + <location filename="modinfodialog.ui" line="727"/> <source>Source game for this mod.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="648"/> + <location filename="modinfodialog.ui" line="730"/> <source><html><head/><body><p>Source game for this mod. This determines where the mod was downloaded from and decides where to fetch info, version updates, and send endorsements. Changing this will likely require you to enter a new Mod ID.</p></body></html></source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="668"/> + <location filename="modinfodialog.ui" line="750"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3670,76 +3686,76 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="675"/> + <location filename="modinfodialog.ui" line="757"/> <source>Version</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="705"/> + <location filename="modinfodialog.ui" line="787"/> <source>Refresh</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="708"/> + <location filename="modinfodialog.ui" line="790"/> <source>Refresh all information from Nexus.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="722"/> + <location filename="modinfodialog.ui" line="804"/> <source>Description</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="744"/> + <location filename="modinfodialog.ui" line="826"/> <source>about:blank</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="770"/> + <location filename="modinfodialog.ui" line="852"/> <source>Endorse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="785"/> + <location filename="modinfodialog.ui" line="867"/> <source>Web page URL (only used if invalid NexusID) :</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="798"/> + <location filename="modinfodialog.ui" line="880"/> <source>Notes</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="804"/> - <location filename="modinfodialog.ui" line="807"/> - <location filename="modinfodialog.ui" line="810"/> + <location filename="modinfodialog.ui" line="886"/> + <location filename="modinfodialog.ui" line="889"/> + <location filename="modinfodialog.ui" line="892"/> <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="817"/> - <location filename="modinfodialog.ui" line="820"/> - <location filename="modinfodialog.ui" line="826"/> + <location filename="modinfodialog.ui" line="899"/> + <location filename="modinfodialog.ui" line="902"/> + <location filename="modinfodialog.ui" line="908"/> <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="834"/> + <location filename="modinfodialog.ui" line="916"/> <source>Filetree</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="848"/> + <location filename="modinfodialog.ui" line="930"/> <source>Open Mod in Explorer</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="873"/> + <location filename="modinfodialog.ui" line="955"/> <source>A directory view of this mod</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="876"/> + <location filename="modinfodialog.ui" line="958"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3749,258 +3765,260 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="903"/> + <location filename="modinfodialog.ui" line="985"/> <source>Previous</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="910"/> + <location filename="modinfodialog.ui" line="992"/> <source>Next</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.ui" line="930"/> + <location filename="modinfodialog.ui" line="1012"/> <source>Close</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="425"/> + <location filename="modinfodialog.cpp" line="483"/> <source>&Delete</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="426"/> + <location filename="modinfodialog.cpp" line="484"/> <source>&Rename</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="427"/> + <location filename="modinfodialog.cpp" line="485"/> <source>&Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="428"/> + <location filename="modinfodialog.cpp" line="486"/> <source>&Unhide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="429"/> + <location filename="modinfodialog.cpp" line="487"/> <source>&Open</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="430"/> + <location filename="modinfodialog.cpp" line="488"/> <source>&New Folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="695"/> - <location filename="modinfodialog.cpp" line="710"/> + <location filename="modinfodialog.cpp" line="802"/> + <location filename="modinfodialog.cpp" line="817"/> <source>Save changes?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="695"/> - <location filename="modinfodialog.cpp" line="710"/> + <location filename="modinfodialog.cpp" line="802"/> + <location filename="modinfodialog.cpp" line="817"/> <source>Save changes to "%1"?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="901"/> + <location filename="modinfodialog.cpp" line="1008"/> <source>File Exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="901"/> + <location filename="modinfodialog.cpp" line="1008"/> <source>A file with that name exists, please enter a new one</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="918"/> + <location filename="modinfodialog.cpp" line="1025"/> <source>failed to move file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="943"/> + <location filename="modinfodialog.cpp" line="1050"/> <source>failed to create directory "optional"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="987"/> + <location filename="modinfodialog.cpp" line="1094"/> <source>Info requested, please wait</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="995"/> + <location filename="modinfodialog.cpp" line="1102"/> <source>Main</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="996"/> + <location filename="modinfodialog.cpp" line="1103"/> <source>Update</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="997"/> + <location filename="modinfodialog.cpp" line="1104"/> <source>Optional</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="998"/> + <location filename="modinfodialog.cpp" line="1105"/> <source>Old</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="999"/> + <location filename="modinfodialog.cpp" line="1106"/> <source>Miscellaneous</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1000"/> + <location filename="modinfodialog.cpp" line="1107"/> <source>Deleted</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1001"/> + <location filename="modinfodialog.cpp" line="1108"/> <source>Unknown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1012"/> + <location filename="modinfodialog.cpp" line="1119"/> <source>Current Version: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1016"/> + <location filename="modinfodialog.cpp" line="1123"/> <source>No update available</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1033"/> + <location filename="modinfodialog.cpp" line="1140"/> <source><div style="text-align: center;"><h1>Uh oh!</h1><p>Sorry, there is no description available for this mod. :(</p></div></source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1049"/> + <location filename="modinfodialog.cpp" line="1156"/> <source><a href="%1">Visit on Nexus</a></source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1148"/> + <location filename="modinfodialog.cpp" line="1255"/> <source>Failed to delete %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1164"/> - <location filename="modinfodialog.cpp" line="1170"/> - <location filename="modinfodialog.cpp" line="1189"/> - <location filename="modinfodialog.cpp" line="1194"/> + <location filename="modinfodialog.cpp" line="1271"/> + <location filename="modinfodialog.cpp" line="1277"/> + <location filename="modinfodialog.cpp" line="1296"/> + <location filename="modinfodialog.cpp" line="1301"/> <source>Confirm</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1164"/> - <location filename="modinfodialog.cpp" line="1189"/> + <location filename="modinfodialog.cpp" line="1271"/> + <location filename="modinfodialog.cpp" line="1296"/> <source>Are sure you want to delete "%1"?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1170"/> - <location filename="modinfodialog.cpp" line="1194"/> + <location filename="modinfodialog.cpp" line="1277"/> + <location filename="modinfodialog.cpp" line="1301"/> <source>Are sure you want to delete the selected files?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1324"/> - <location filename="modinfodialog.cpp" line="1330"/> + <location filename="modinfodialog.cpp" line="1433"/> + <location filename="modinfodialog.cpp" line="1439"/> <source>New Folder</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1336"/> + <location filename="modinfodialog.cpp" line="1445"/> <source>Failed to create "%1"</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1628"/> + <location filename="modinfodialog.cpp" line="1739"/> <source>Select binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1628"/> + <location filename="modinfodialog.cpp" line="1739"/> <source>Binary</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1742"/> + <location filename="modinfodialog.cpp" line="1867"/> <source>file not found: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1755"/> + <location filename="modinfodialog.cpp" line="1880"/> <source>failed to generate preview for %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1771"/> + <location filename="modinfodialog.cpp" line="1896"/> <source>Sorry</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1771"/> + <location filename="modinfodialog.cpp" line="1896"/> <source>Sorry, can't preview anything. This function currently does not support extracting from bsas.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1888"/> + <location filename="modinfodialog.cpp" line="2013"/> <source>Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1894"/> + <location filename="modinfodialog.cpp" line="2019"/> <source>Un-Hide</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1898"/> - <location filename="modinfodialog.cpp" line="1916"/> + <location filename="modinfodialog.cpp" line="2023"/> + <location filename="modinfodialog.cpp" line="2041"/> + <location filename="modinfodialog.cpp" line="2060"/> <source>Open/Execute</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1902"/> - <location filename="modinfodialog.cpp" line="1919"/> + <location filename="modinfodialog.cpp" line="2027"/> + <location filename="modinfodialog.cpp" line="2044"/> + <location filename="modinfodialog.cpp" line="2063"/> <source>Preview</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1969"/> + <location filename="modinfodialog.cpp" line="2113"/> <source>Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1969"/> + <location filename="modinfodialog.cpp" line="2113"/> <source>Please enter a name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1973"/> - <location filename="modinfodialog.cpp" line="1976"/> + <location filename="modinfodialog.cpp" line="2117"/> + <location filename="modinfodialog.cpp" line="2120"/> <source>Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1973"/> + <location filename="modinfodialog.cpp" line="2117"/> <source>Invalid name. Must be a valid file name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1976"/> + <location filename="modinfodialog.cpp" line="2120"/> <source>A tweak by that name exists</source> <translation type="unfinished"></translation> </message> <message> - <location filename="modinfodialog.cpp" line="1990"/> + <location filename="modinfodialog.cpp" line="2134"/> <source>Create Tweak</source> <translation type="unfinished"></translation> </message> @@ -5780,7 +5798,7 @@ If the folder was still in use, restart MO and try again.</source> </message> <message> <location filename="mainwindow.cpp" line="1453"/> - <location filename="mainwindow.cpp" line="5095"/> + <location filename="mainwindow.cpp" line="5101"/> <source><Manage...></source> <translation type="unfinished"></translation> </message> diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 9488f83a..bd64e1bc 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -35,6 +35,7 @@ #include "instancemanager.h" #include <scriptextender.h> #include "helper.h" +#include "previewdialog.h" #include <QApplication> #include <QCoreApplication> @@ -267,6 +268,7 @@ bool checkService() return serviceRunning; } + OrganizerCore::OrganizerCore(const QSettings &initSettings) : m_UserInterface(nullptr) , m_PluginContainer(nullptr) @@ -1220,6 +1222,212 @@ QStringList OrganizerCore::modsSortedByProfilePriority() const return res; } +bool OrganizerCore::getFileExecutionContext( + QWidget* parent, const QFileInfo &targetInfo, + QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type) +{ + QString extension = targetInfo.suffix(); + if ((extension.compare("cmd", Qt::CaseInsensitive) == 0) || + (extension.compare("com", Qt::CaseInsensitive) == 0) || + (extension.compare("bat", Qt::CaseInsensitive) == 0)) { + binaryInfo = QFileInfo("C:\\Windows\\System32\\cmd.exe"); + arguments = QString("/C \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); + type = FileExecutionTypes::Executable; + return true; + } else if (extension.compare("exe", Qt::CaseInsensitive) == 0) { + binaryInfo = targetInfo; + type = FileExecutionTypes::Executable; + return true; + } else if (extension.compare("jar", Qt::CaseInsensitive) == 0) { + // types that need to be injected into + std::wstring targetPathW = targetInfo.absoluteFilePath().toStdWString(); + QString binaryPath; + + { // try to find java automatically + WCHAR buffer[MAX_PATH]; + if (::FindExecutableW(targetPathW.c_str(), nullptr, buffer) > (HINSTANCE)32) { + DWORD binaryType = 0UL; + if (!::GetBinaryTypeW(buffer, &binaryType)) { + qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError()); + } else if (binaryType == SCS_32BIT_BINARY) { + binaryPath = QString::fromWCharArray(buffer); + } + } + } + if (binaryPath.isEmpty() && (extension == "jar")) { + // second attempt: look to the registry + QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat); + if (javaReg.contains("CurrentVersion")) { + QString currentVersion = javaReg.value("CurrentVersion").toString(); + binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe"); + } + } + if (binaryPath.isEmpty()) { + binaryPath = QFileDialog::getOpenFileName( + parent, QObject::tr("Select binary"), QString(), QObject::tr("Binary") + " (*.exe)"); + } + if (binaryPath.isEmpty()) { + return false; + } + binaryInfo = QFileInfo(binaryPath); + if (extension == "jar") { + arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); + } else { + arguments = QString("\"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath())); + } + + type = FileExecutionTypes::Executable; + return true; + } else { + type = FileExecutionTypes::Other; + return true; + } +} + +bool OrganizerCore::executeFileVirtualized( + QWidget* parent, const QFileInfo& targetInfo) +{ + QFileInfo binaryInfo; + QString arguments; + FileExecutionTypes type; + + if (!getFileExecutionContext(parent, targetInfo, binaryInfo, arguments, type)) { + return false; + } + + switch (type) + { + case FileExecutionTypes::Executable: { + spawnBinaryDirect( + binaryInfo, arguments, currentProfile()->name(), + targetInfo.absolutePath(), "", ""); + + return true; + } + + case FileExecutionTypes::Other: { + ::ShellExecuteW(nullptr, L"open", + ToWString(targetInfo.absoluteFilePath()).c_str(), + nullptr, nullptr, SW_SHOWNORMAL); + + return true; + } + } + + // nop + return false; +} + +bool OrganizerCore::previewFileWithAlternatives( + QWidget* parent, QString fileName) +{ + // what we have is an absolute path to the file in its actual location (for the primary origin) + // what we want is the path relative to the virtual data directory + + // we need to look in the virtual directory for the file to make sure the info is up to date. + + // check if the file comes from the actual data folder instead of a mod + QDir gameDirectory = managedGame()->dataDirectory().absolutePath(); + QString relativePath = gameDirectory.relativeFilePath(fileName); + QDir dirRelativePath = gameDirectory.relativeFilePath(fileName); + + // if the file is on a different drive the dirRelativePath will actually be an + // absolute path so we make sure that is not the case + if (!dirRelativePath.isAbsolute() && !relativePath.startsWith("..")) { + fileName = relativePath; + } + else { + // crude: we search for the next slash after the base mod directory to skip + // everything up to the data-relative directory + int offset = settings().getModDirectory().size() + 1; + offset = fileName.indexOf("/", offset); + fileName = fileName.mid(offset + 1); + } + + + + const FileEntry::Ptr file = directoryStructure()->searchFile(ToWString(fileName), nullptr); + + if (file.get() == nullptr) { + reportError(tr("file not found: %1").arg(qUtf8Printable(fileName))); + return false; + } + + // set up preview dialog + PreviewDialog preview(fileName); + auto addFunc = [&](int originId) { + FilesOrigin &origin = directoryStructure()->getOriginByID(originId); + QString filePath = QDir::fromNativeSeparators(ToQString(origin.getPath())) + "/" + fileName; + if (QFile::exists(filePath)) { + // it's very possible the file doesn't exist, because it's inside an archive. we don't support that + QWidget *wid = m_PluginContainer->previewGenerator().genPreview(filePath); + if (wid == nullptr) { + reportError(tr("failed to generate preview for %1").arg(filePath)); + } + else { + preview.addVariant(ToQString(origin.getName()), wid); + } + } + }; + + addFunc(file->getOrigin()); + for (auto alt : file->getAlternatives()) { + addFunc(alt.first); + } + + if (preview.numVariants() > 0) { + QSettings &s = settings().directInterface(); + QString key = QString("geometry/%1").arg(preview.objectName()); + if (s.contains(key)) { + preview.restoreGeometry(s.value(key).toByteArray()); + } + + preview.exec(); + + s.setValue(key, preview.saveGeometry()); + + return true; + } + else { + QMessageBox::information( + parent, tr("Sorry"), + tr("Sorry, can't preview anything. This function currently does not support extracting from bsas.")); + + return false; + } +} + +bool OrganizerCore::previewFile( + QWidget* parent, const QString& originName, const QString& path) +{ + if (!QFile::exists(path)) { + reportError(tr("File '%1' not found.").arg(path)); + return false; + } + + PreviewDialog preview(path); + + QWidget *wid = m_PluginContainer->previewGenerator().genPreview(path); + if (wid == nullptr) { + reportError(tr("Failed to generate preview for %1").arg(path)); + return false; + } + + preview.addVariant(originName, wid); + + QSettings &s = settings().directInterface(); + QString key = QString("geometry/%1").arg(preview.objectName()); + if (s.contains(key)) { + preview.restoreGeometry(s.value(key).toByteArray()); + } + + preview.exec(); + + s.setValue(key, preview.saveGeometry()); + + return true; +} + void OrganizerCore::spawnBinary(const QFileInfo &binary, const QString &arguments, const QDir ¤tDirectory, diff --git a/src/organizercore.h b/src/organizercore.h index bfb72529..e24227b7 100644 --- a/src/organizercore.h +++ b/src/organizercore.h @@ -56,6 +56,7 @@ namespace MOBase { class IPluginGame;
}
+
class OrganizerCore : public QObject, public MOBase::IPluginDiagnose
{
@@ -87,6 +88,12 @@ private: typedef boost::signals2::signal<void (const QString&)> SignalModInstalled;
public:
+ enum class FileExecutionTypes
+ {
+ Executable = 1,
+ Other = 2
+ };
+
static bool isNxmLink(const QString &link) { return link.startsWith("nxm://", Qt::CaseInsensitive); }
OrganizerCore(const QSettings &initSettings);
@@ -140,6 +147,14 @@ public: void doAfterLogin(const std::function<void()> &function) { m_PostLoginTasks.append(function); }
+ static bool getFileExecutionContext(
+ QWidget* parent, const QFileInfo &targetInfo,
+ QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type);
+
+ bool executeFileVirtualized(QWidget* parent, const QFileInfo& targetInfo);
+ bool previewFileWithAlternatives(QWidget* parent, QString filename);
+ bool previewFile(QWidget* parent, const QString& originName, const QString& path);
+
void spawnBinary(const QFileInfo &binary, const QString &arguments = "",
const QDir ¤tDirectory = QDir(),
const QString &steamAppID = "",
diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index 3d82cf17..9b3e55df 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -21,6 +21,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "ui_overwriteinfodialog.h"
#include "report.h"
#include "utility.h"
+#include "organizercore.h"
#include <QMessageBox>
#include <QMenu>
#include <QShortcut>
@@ -217,12 +218,7 @@ void OverwriteInfoDialog::renameTriggered() void OverwriteInfoDialog::openFile(const QModelIndex &index)
{
- QString fileName = m_FileSystemModel->filePath(index);
-
- HINSTANCE res = ::ShellExecuteW(nullptr, L"open", ToWString(fileName).c_str(), nullptr, nullptr, SW_SHOW);
- if ((INT_PTR)res <= 32) {
- qCritical("failed to invoke %s: %d", qUtf8Printable(fileName), res);
- }
+ shell::OpenFile(m_FileSystemModel->filePath(index));
}
@@ -263,7 +259,7 @@ void OverwriteInfoDialog::createDirectoryTriggered() void OverwriteInfoDialog::on_explorerButton_clicked()
{
- ::ShellExecuteW(nullptr, L"explore", ToWString(m_ModInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ shell::ExploreFile(m_ModInfo->absolutePath());
}
void OverwriteInfoDialog::on_filesView_customContextMenuRequested(const QPoint &pos)
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index ec9bdac3..2edb92f5 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -139,7 +139,7 @@ void PluginList::highlightPlugins(const QItemSelectionModel *selection, const MO if (plugins.size() > 0) {
for (auto plugin : plugins) {
MOShared::FileEntry::Ptr file = directoryEntry.findFile(plugin.toStdWString());
- if (file->getOrigin() != origin.getID()) {
+ if (file && file->getOrigin() != origin.getID()) {
const std::vector<std::pair<int, std::pair<std::wstring, int>>> alternatives = file->getAlternatives();
if (std::find_if(alternatives.begin(), alternatives.end(), [&](const std::pair<int, std::pair<std::wstring, int>>& element) { return element.first == origin.getID(); }) == alternatives.end())
continue;
diff --git a/src/problemsdialog.cpp b/src/problemsdialog.cpp index 795baab0..56109d34 100644 --- a/src/problemsdialog.cpp +++ b/src/problemsdialog.cpp @@ -1,5 +1,6 @@ #include "problemsdialog.h"
#include "ui_problemsdialog.h"
+#include "organizercore.h"
#include <utility.h>
#include <iplugin.h>
#include <iplugindiagnose.h>
@@ -87,5 +88,5 @@ void ProblemsDialog::startFix() void ProblemsDialog::urlClicked(const QUrl &url)
{
- ::ShellExecuteW(nullptr, L"open", ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ shell::OpenLink(url);
}
diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 4c0f9a8d..271c621b 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -31,6 +31,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "settings.h"
#include "bbcode.h"
#include "plugincontainer.h"
+#include "organizercore.h"
#include <versioninfo.h>
#include <report.h>
#include <util.h>
@@ -178,7 +179,7 @@ void SelfUpdater::startUpdate() tr("New update available (%1)")
.arg(m_UpdateCandidate["tag_name"].toString()), tr("Do you want to install update? All your mods and setup will be left untouched.\nSelect Show Details option to see the full change-log."),
QMessageBox::Yes | QMessageBox::Cancel, m_Parent);
-
+
query.setDetailedText(m_UpdateCandidate["body"].toString());
query.button(QMessageBox::Yes)->setText(tr("Install"));
@@ -329,22 +330,14 @@ void SelfUpdater::downloadCancel() void SelfUpdater::installUpdate()
{
- const QString mopath
- = QDir::fromNativeSeparators(qApp->property("dataPath").toString());
-
- std::wstring parameters = ToWString("/DIR=\"" + qApp->applicationDirPath() + "\" ");
+ const QString parameters = "/DIR=\"" + qApp->applicationDirPath() + "\" ";
- HINSTANCE res = ::ShellExecuteW(
- nullptr, L"open", m_UpdateFile.fileName().toStdWString().c_str(), parameters.c_str(),
- nullptr, SW_SHOW);
-
- if (res > (HINSTANCE)32) {
+ if (shell::Execute(m_UpdateFile.fileName(), parameters)) {
QCoreApplication::quit();
} else {
- reportError(tr("Failed to start %1: %2")
- .arg(m_UpdateFile.fileName())
- .arg((INT_PTR)res));
+ reportError(tr("Failed to start %1").arg(m_UpdateFile.fileName()));
}
+
m_UpdateFile.remove();
}
diff --git a/src/settings.cpp b/src/settings.cpp index 231487bb..a844fdc9 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -130,18 +130,19 @@ bool Settings::pluginBlacklisted(const QString &fileName) const void Settings::registerAsNXMHandler(bool force) { - std::wstring nxmPath = ToWString(QCoreApplication::applicationDirPath() + "/nxmhandler.exe"); - std::wstring executable = ToWString(QCoreApplication::applicationFilePath()); - std::wstring mode = force ? L"forcereg" : L"reg"; - std::wstring parameters = mode + L" " + m_GamePlugin->gameShortName().toStdWString(); - for (QString altGame : m_GamePlugin->validShortNames()) { - parameters += L"," + altGame.toStdWString(); + const auto nxmPath = QCoreApplication::applicationDirPath() + "/nxmhandler.exe"; + const auto executable = QCoreApplication::applicationFilePath(); + + QString mode = force ? "forcereg" : "reg"; + QString parameters = mode + " " + m_GamePlugin->gameShortName(); + for (const QString& altGame : m_GamePlugin->validShortNames()) { + parameters += "," + altGame; } - parameters += L" \"" + executable + L"\""; - HINSTANCE res = ::ShellExecuteW(nullptr, L"open", nxmPath.c_str(), parameters.c_str(), nullptr, SW_SHOWNORMAL); - if ((INT_PTR)res <= 32) { - QMessageBox::critical(nullptr, tr("Failed"), - tr("Sorry, failed to start the helper application")); + parameters += " \"" + executable + "\""; + + if (!shell::Execute(nxmPath, parameters)) { + QMessageBox::critical( + nullptr, tr("Failed"), tr("Failed to start the helper application")); } } |
