From 94ef8dffbc594585e6a47a79e008ec230934a9fe Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 4 Aug 2018 22:16:39 -0500 Subject: List load order backups from most recent to oldest --- src/mainwindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f6cfbfbd..300c187e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -162,6 +162,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #endif #include @@ -5135,7 +5136,7 @@ QString MainWindow::queryRestore(const QString &filePath) SelectionDialog dialog(tr("Choose backup to restore"), this); QRegExp exp(pluginFileInfo.fileName() + PATTERN_BACKUP_REGEX); QRegExp exp2(pluginFileInfo.fileName() + "\\.(.*)"); - for(const QFileInfo &info : files) { + for(const QFileInfo &info : boost::adaptors::reverse(files)) { if (exp.exactMatch(info.fileName())) { QDateTime time = QDateTime::fromString(exp.cap(1), PATTERN_BACKUP_DATE); dialog.addChoice(time.toString(), "", exp.cap(1)); -- cgit v1.3.1 From 1e4b5d2436df759dead3f7c9da9c928da3ff3047 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 5 Aug 2018 15:56:39 -0500 Subject: Set the names of the toolbar widgets to allow styling QToolButton#foo where foo is one of: actionChange_Game actionInstallMod actionNexus actionAdd_Profile actionModify_Executables actionTool actionSettings seperator actionEndorseMO actionProblems actionUpdate actionHelp --- src/mainwindow.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 300c187e..dc09ae4e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -257,6 +257,9 @@ MainWindow::MainWindow(QSettings &initSettings createHelpWidget(); for (QAction *action : ui->toolBar->actions()) { + // set the name of the widget to the name of the action to allow styling + ui->toolBar->widgetForAction(action)->setObjectName(action->objectName()); + if (action->isSeparator()) { // insert spacers ui->toolBar->insertWidget(action, spacer); -- cgit v1.3.1 From fc19486f53307c3a4233553db6c60418e991beb1 Mon Sep 17 00:00:00 2001 From: "Frederik “Freso” S. Olesen" Date: Mon, 6 Aug 2018 15:15:01 +0200 Subject: Fix capitalisation of "Explorer" 1. Explorer is a specific program, so it should be treated as a proper noun, and thus capitalised. 2. Other menu items in the same menu are Title Cases, so it looks out of place that this item is not. --- src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index dc09ae4e..9a9e5b28 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3561,7 +3561,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Create Mod..."), this, SLOT(createModFromOverwrite())); menu->addAction(tr("Clear Overwrite..."), this, SLOT(clearOverwrite())); } - menu->addAction(tr("Open in explorer"), this, SLOT(openExplorer_clicked())); + menu->addAction(tr("Open in Explorer"), this, SLOT(openExplorer_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) { menu->addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked())); menu->addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked())); -- cgit v1.3.1 From b0c15c9cfb74bba152eceb4d3f4d490cd75c754b Mon Sep 17 00:00:00 2001 From: Al12rs Date: Mon, 6 Aug 2018 20:17:57 +0200 Subject: Added Open File option to downloads tab. --- src/downloadlistwidgetcompact.cpp | 2 +- src/downloadmanager.cpp | 5 +- src/mainwindow.cpp | 1 + src/organizer_en.ts | 743 +++++++++++++++++++------------------- 4 files changed, 382 insertions(+), 369 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/downloadlistwidgetcompact.cpp b/src/downloadlistwidgetcompact.cpp index 710ecadc..fcf93754 100644 --- a/src/downloadlistwidgetcompact.cpp +++ b/src/downloadlistwidgetcompact.cpp @@ -247,7 +247,7 @@ void DownloadListWidgetCompactDelegate::issueVisitOnNexus() emit visitOnNexus(m_ContextIndex.row()); } -void DownloadListWidgetDelegate::issueOpenFile() +void DownloadListWidgetCompactDelegate::issueOpenFile() { emit openFile(m_ContextIndex.row()); } diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index bff2cc7b..331556cb 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -935,13 +935,12 @@ void DownloadManager::openFile(int index) } QDir path = QDir(m_OutputDirectory); if (path.exists(getFileName(index))) { - params = params + QDir::toNativeSeparators(getFilePath(index)) + "\""; - ::ShellExecuteW(nullptr, nullptr, L"open", ToWString(params).c_str(), nullptr, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", ToWString(QDir::toNativeSeparators(getFilePath(index))).c_str(), nullptr, nullptr, SW_SHOWNORMAL); return; } - ::ShellExecuteW(nullptr, L"open", ToWString(QDir::toNativeSeparators(m_OutputDirectory)).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"explore", ToWString(QDir::toNativeSeparators(m_OutputDirectory)).c_str(), nullptr, nullptr, SW_SHOWNORMAL); return; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9a9e5b28..d87bf0f0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4377,6 +4377,7 @@ void MainWindow::updateDownloadListDelegate() connect(ui->downloadView->itemDelegate(), SIGNAL(installDownload(int)), &m_OrganizerCore, SLOT(installDownload(int))); connect(ui->downloadView->itemDelegate(), SIGNAL(queryInfo(int)), m_OrganizerCore.downloadManager(), SLOT(queryInfo(int))); connect(ui->downloadView->itemDelegate(), SIGNAL(visitOnNexus(int)), m_OrganizerCore.downloadManager(), SLOT(visitOnNexus(int))); + connect(ui->downloadView->itemDelegate(), SIGNAL(openFile(int)), m_OrganizerCore.downloadManager(), SLOT(openFile(int))); connect(ui->downloadView->itemDelegate(), SIGNAL(openInDownloadsFolder(int)), m_OrganizerCore.downloadManager(), SLOT(openInDownloadsFolder(int))); connect(ui->downloadView->itemDelegate(), SIGNAL(removeDownload(int, bool)), m_OrganizerCore.downloadManager(), SLOT(removeDownload(int, bool))); connect(ui->downloadView->itemDelegate(), SIGNAL(restoreDownload(int)), m_OrganizerCore.downloadManager(), SLOT(restoreDownload(int))); diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 01a4abcb..88a8e0a3 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -414,12 +414,12 @@ p, li { white-space: pre-wrap; } - - - - - - + + + + + + Are you sure? @@ -429,124 +429,129 @@ p, li { white-space: pre-wrap; } - + This will remove all finished downloads from this list and from disk. - + This will remove all installed downloads from this list and from disk. - + This will remove all uninstalled downloads from this list and from disk. - + This will permanently remove all finished downloads from this list (but NOT from disk). - + This will permanently remove all installed downloads from this list (but NOT from disk). - + This will permanently remove all uninstalled downloads from this list (but NOT from disk). - + Install - + Query Info - + Visit on Nexus - - - + + Open File + + + + + + Show in Folder - + Delete - + Un-Hide - + Hide - + Cancel - + Pause - + Remove - + Resume - + Delete Installed... - + Delete Uninstalled... - + Delete All... - + Hide Installed... - + Hide Uninstalled... - + Hide All... - + Un-Hide All... @@ -574,22 +579,22 @@ p, li { white-space: pre-wrap; } - - - + + + Are you sure? - + This will remove all finished downloads from this list and from disk. - - - + + + Delete Files? @@ -599,115 +604,120 @@ p, li { white-space: pre-wrap; } - + This will remove all installed downloads from this list and from disk. - + This will remove all uninstalled downloads from this list and from disk. - + This will remove all finished downloads from this list (but NOT from disk). - + This will remove all installed downloads from this list (but NOT from disk). - + This will remove all uninstalled downloads from this list (but NOT from disk). - + Install - + Query Info - + Visit on Nexus - - - + + Open File + + + + + + Show in Folder - - + + Delete - + Un-Hide - + Hide - + Cancel - + Pause - + Resume - + Delete Installed... - + Delete Uninstalled... - + Delete All... - + Hide Installed... - + Hide Uninstalled... - + Hide All... - + Un-Hide All... @@ -833,7 +843,6 @@ p, li { white-space: pre-wrap; } - VisitNexus: invalid download index %1 @@ -843,164 +852,169 @@ p, li { white-space: pre-wrap; } - + + OpenFileInDownloadsFolder: invalid download index %1 + + + + get pending: invalid download index %1 - + get path: invalid download index %1 - + Main - + Update - + Optional - + Old - + Misc - + Unknown - + display name: invalid download index %1 - + file name: invalid download index %1 - + file time: invalid download index %1 - + file size: invalid download index %1 - + progress: invalid download index %1 - + state: invalid download index %1 - + infocomplete: invalid download index %1 - - + + mod id: invalid download index %1 - + ishidden: invalid download index %1 - + file info: invalid download index %1 - + mark installed: invalid download index %1 - + mark uninstalled: invalid download index %1 - + Memory allocation error (in processing progress event). - + Memory allocation error (in processing downloaded data). - + Information updated - - + + No matching file found on Nexus! Maybe this file is no longer available or it was renamed? - + No file on Nexus matches the selected file by name. Please manually choose the correct one. - + No download server available. Please try again later. - + Failed to request file info from nexus: %1 - + Warning: Content type is: %1 - + Download header content length: %1 downloaded file size: %2 - + Download failed: %1 (%2) - + We were unable to download the file due to errors after four retries. There may be an issue with the Nexus servers. - + failed to re-open %1 @@ -1747,8 +1761,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1922,7 +1936,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1933,7 +1947,7 @@ p, li { white-space: pre-wrap; } - + No Problems @@ -1963,7 +1977,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -1973,713 +1987,712 @@ Right now this has very limited functionality - - Ctrl+C - - - - + Change Game - + Open the Instance selection dialog to manage a different Game - + Toolbar - + Desktop - + Start Menu - + There is no supported sort mechanism for this game. You will probably have to use a third-party tool. - + Problems - + There are potential problems with your setup - + Everything seems to be in order - + Help on UI - + Documentation Wiki - + Report Issue - + Tutorials - + About - + About Qt - + Name - + Please enter a name for the new profile - + failed to create profile: %1 - + Show tutorial? - + You are starting Mod Organizer for the first time. Do you want to show a tutorial of its basic features? If you choose no you can always start the tutorial from the "Help"-menu. - + Downloads in progress - + There are still downloads in progress, do you really want to quit? - + Plugin "%1" failed: %2 - + Plugin "%1" failed - + Browse Mod Page - + Also in: <br> - + No conflict - + <Edit...> - + This bsa is enabled in the ini file so it may be required! - + Activating Network Proxy - + Notice: Your current MO version (%1) is lower than the previous version (%2).<br>The GUI may not downgrade gracefully, so you may experience oddities.<br>However, there should be no serious issues. - + Choose Mod - + Mod Archive - + Start Tutorial? - + You're about to start a tutorial. For technical reasons it's not possible to end the tutorial early. Continue? - + failed to spawn notepad.exe: %1 - + failed to change origin name: %1 - + failed to move "%1" from mod "%2" to "%3": %4 - + <Contains %1> - + <Checked> - + <Unchecked> - + <Update> - + <Managed by MO> - + <Managed outside MO> - + <No category> - + <Conflicted> - + <Not Endorsed> - + failed to rename mod: %1 - + Overwrite? - + This will replace the existing mod "%1". Continue? - + failed to remove mod "%1" - - - + + + failed to rename "%1" to "%2" - - - - + + + + Confirm - + Remove the following mods?<br><ul>%1</ul> - + failed to remove mod: %1 - - + + Failed - + Installation file no longer exists - + Mods installed with old versions of MO can't be reinstalled in this way. - + You need to be logged in with Nexus to resume a download - - + + You need to be logged in with Nexus to endorse - + Failed to display overwrite dialog: %1 - + Nexus ID for this Mod is unknown - + Web page for this mod is unknown - - - + + + Create Mod... - + This will create an empty mod. Please enter a name: - - + + A mod with this name already exists - + This will move all files from overwrite into a new, regular mod. Please enter a name: - - + + Are you sure? - + About to recursively delete: - + Not logged in, endorsement information will be wrong - + Continue? - + 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. - - + + Sorry - + I don't know a versioning scheme where %1 is newer than %2. - + Really enable all visible mods? - + Really disable all visible mods? - + Export to csv - + 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. - + Select what mods you want export: - + All installed mods - + Only active (checked) mods from your current profile - + All currently visible mods in the mod list - + Choose what Columns to export: - + Mod_Priority - + Mod_Name - + Mod_Status - + Primary_Category - + Nexus_ID - + Mod_Nexus_URL - + Mod_Version - + Install_Date - + Download_File_Name - + export failed: %1 - + Open Game folder - + Open MyGames folder - + Open Instance folder - + Open Mods folder - + Open Profile folder - + Open Downloads folder - + Open MO2 Install folder - + Open MO2 Plugins folder - + Open MO2 Logs folder - + Install Mod... - + Create empty mod - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer + + + + Open in explorer - + Restore Backup - + Remove Backup... - + Change Categories - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - + Rename Mod... - + Reinstall Mod - + Remove Mod... - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Mark as converted/working - + Visit on Nexus - + Visit web page - + Information... - - + + Exception: - - + + Unknown exception - + <All> - + <Multiple> - + %1 more - + 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. @@ -2687,12 +2700,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2700,319 +2713,319 @@ You can also use online editors and converters instead. - + failed to remove %1 - + failed to create %1 - + Can't change download directory while downloads are in progress! - + failed to write to file %1 - + %1 written - + Select binary - + Binary - + Enter Name - + Please enter a name for the executable - + Not an executable - + This is not a recognized executable. - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - + There already is a visible version of this file. Replace it? - + file not found: %1 - + failed to generate preview for %1 - + Sorry, can't preview anything. This function currently does not support extracting from bsas. - + Update available - + Open/Execute - + Add as Executable - + Preview - + Un-Hide - + Hide - + Write To File... - + Do you want to endorse Mod Organizer on %1 now? - + Thank you! - + Thank you for your endorsement! - + Request to Nexus failed: %1 - - + + failed to read %1: %2 - - + + Error - + failed to extract %1 (errorcode %2) - + Extract BSA - + This archive contains invalid hashes. Some files may be broken. - + Extract... - + This will restart MO, continue? - + Edit Categories... - + Deselect filter - + Remove - + Enable all - + Disable all - + Unlock load order - + Lock load order - + depends on missing "%1" - + incompatible with "%1" - + Please wait while LOOT is running - + loot failed. Exit code was: %1 - + failed to start loot - + failed to run loot: %1 - + Errors occured - + Backup of load order created - + Choose backup to restore - + No Backups - + There are no backups to restore - - + + Restore failed - - + + Failed to restore the backup. Errorcode: %1 - + Backup of modlist created - + A file with the same name has already been downloaded. What would you like to do? - + Overwrite - + Rename new file - + Ignore file @@ -3853,138 +3866,138 @@ p, li { white-space: pre-wrap; } - + installed version: "%1", newest version: "%2" - + The newest version on Nexus seems to be older than the one you have installed. This could either mean the version you have has been withdrawn (i.e. due to a bug) or the author uses a non-standard versioning scheme and that newest version is actually newer. Either way you may want to "upgrade". - + Categories: <br> - + Invalid name - + Name is already in use by another mod - + drag&drop failed: %1 - + Confirm - + Are you sure you want to remove "%1"? - + Flags - + Content - + Mod Name - + Version - + Priority - + Category - + Source Game - + Nexus ID - + Installation - - + + unknown - + Name of your mods - + Version of the mod (if available) - + Installation priority of your mod. The higher, the more "important" it is and thus overwrites files from mods with lower priority. - + Category of the mod. - + The source game which was the origin of this mod. - + Id of the mod as used on Nexus. - + Emblemes to highlight things that might require attention. - + Depicts the content of the mod:<br><table cellspacing=7><tr><td><img src=":/MO/gui/content/plugin" width=32/></td><td>Game plugins (esp/esm/esl)</td></tr><tr><td><img src=":/MO/gui/content/interface" width=32/></td><td>Interface</td></tr><tr><td><img src=":/MO/gui/content/mesh" width=32/></td><td>Meshes</td></tr><tr><td><img src=":/MO/gui/content/bsa" width=32/></td><td>BSA</td></tr><tr><td><img src=":/MO/gui/content/texture" width=32/></td><td>Textures</td></tr><tr><td><img src=":/MO/gui/content/sound" width=32/></td><td>Sounds</td></tr><tr><td><img src=":/MO/gui/content/music" width=32/></td><td>Music</td></tr><tr><td><img src=":/MO/gui/content/string" width=32/></td><td>Strings</td></tr><tr><td><img src=":/MO/gui/content/script" width=32/></td><td>Scripts (Papyrus)</td></tr><tr><td><img src=":/MO/gui/content/skse" width=32/></td><td>Script Extender plugins</td></tr><tr><td><img src=":/MO/gui/content/skyproc" width=32/></td><td>SkyProc Patcher</td></tr><tr><td><img src=":/MO/gui/content/menu" width=32/></td><td>Mod Configuration Menu</td></tr><tr><td><img src=":/MO/gui/content/inifile" width=32/></td><td>INI files</td></tr></table> - + Time this mod was installed @@ -5240,18 +5253,18 @@ If the folder was still in use, restart MO and try again. - + Please use "Help" from the toolbar to get usage instructions to all elements - - + + <Manage...> - + failed to parse profile %1: %2 -- cgit v1.3.1 From 80594d6e1a6f90dd3964497d66ffca54888a79d4 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 7 Aug 2018 23:20:55 -0500 Subject: Set toolbar widget names later to catch the problems and update widgets --- src/mainwindow.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index d87bf0f0..2889876b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -257,9 +257,6 @@ MainWindow::MainWindow(QSettings &initSettings createHelpWidget(); for (QAction *action : ui->toolBar->actions()) { - // set the name of the widget to the name of the action to allow styling - ui->toolBar->widgetForAction(action)->setObjectName(action->objectName()); - if (action->isSeparator()) { // insert spacers ui->toolBar->insertWidget(action, spacer); @@ -444,6 +441,11 @@ MainWindow::MainWindow(QSettings &initSettings refreshExecutablesList(); updateToolBar(); + + for (QAction *action : ui->toolBar->actions()) { + // set the name of the widget to the name of the action to allow styling + ui->toolBar->widgetForAction(action)->setObjectName(action->objectName()); + } } -- cgit v1.3.1 From 9a426a2474700b3e3e858b3299d8a60bca58f8c7 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 12 Aug 2018 12:33:22 -0500 Subject: Revert "Improve robustness of endorsement checks" This reverts commit fc8a6b358fb7bda18979c7c5c23c13d7c2ae8dc8. --- src/mainwindow.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2889876b..7a30ccb6 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4417,8 +4417,7 @@ void MainWindow::nxmUpdatesAvailable(const std::vector &modIDs, QVariant us if (game && result["id"].toInt() == game->nexusModOrganizerID() && result["game_id"].toInt() == game->nexusGameID()) { - if (result["voted_by_user"].type() != QVariant::Invalid && - !result["voted_by_user"].toBool()) { + if (!result["voted_by_user"].toBool()) { ui->actionEndorseMO->setVisible(true); } } else { @@ -4442,8 +4441,7 @@ void MainWindow::nxmUpdatesAvailable(const std::vector &modIDs, QVariant us (*iter)->setNewestVersion(result["version"].toString()); (*iter)->setNexusDescription(result["description"].toString()); if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->loggedIn() && - result.contains("voted_by_user") && - result["voted_by_user"].type() != QVariant::Invalid) { + result.contains("voted_by_user")) { // don't use endorsement info if we're not logged in or if the response doesn't contain it (*iter)->setIsEndorsed(result["voted_by_user"].toBool()); } -- cgit v1.3.1 From 17e4ec7b13e6df86cc473b78d8e44d37b2e80cf7 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 12 Aug 2018 19:59:54 -0500 Subject: Fix selecting the active profile when opening the profiles dialog --- src/mainwindow.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7a30ccb6..11cc8c6c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1961,8 +1961,7 @@ void MainWindow::on_actionInstallMod_triggered() void MainWindow::on_actionAdd_Profile_triggered() { for (;;) { - //Note: Calling this with an invalid profile name. Not quite sure why - ProfilesDialog profilesDialog(m_OrganizerCore.managedGame()->gameDirectory().absolutePath(), + ProfilesDialog profilesDialog(m_OrganizerCore.currentProfile()->name(), m_OrganizerCore.managedGame(), this); // workaround: need to disable monitoring of the saves directory, otherwise the active -- cgit v1.3.1 From 79b2e52a58d711df53a125b1e3f510b2c2ebf8ff Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 16 Aug 2018 08:35:19 -0500 Subject: Fix another instance of "Open in Explorer" --- src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 11cc8c6c..e22fe07f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3642,7 +3642,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Visit web page"), this, SLOT(visitWebPage_clicked())); } - menu->addAction(tr("Open in explorer"), this, SLOT(openExplorer_clicked())); + menu->addAction(tr("Open in Explorer"), this, SLOT(openExplorer_clicked())); } if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) == flags.end()) { -- cgit v1.3.1 From 43b2df9077db98475af6ab613cf7eaf301f84879 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 16 Aug 2018 13:55:32 -0500 Subject: Add "enable/disable selected" to plugin list context menu --- src/mainwindow.cpp | 18 ++++++++++++++++++ src/mainwindow.h | 4 ++++ src/organizer_en.ts | 5 ++++- src/pluginlist.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/pluginlist.h | 10 ++++++++++ 5 files changed, 77 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e22fe07f..d638e988 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4170,6 +4170,19 @@ void MainWindow::unhideFile() } } + +void MainWindow::enableSelectedPlugins_clicked() +{ + m_OrganizerCore.pluginList()->enableSelected(ui->espList->selectionModel()); +} + + +void MainWindow::disableSelectedPlugins_clicked() +{ + m_OrganizerCore.pluginList()->disableSelected(ui->espList->selectionModel()); +} + + void MainWindow::previewDataFile() { QString fileName = QDir::fromNativeSeparators(m_ContextItem->data(0, Qt::UserRole).toString()); @@ -4761,6 +4774,11 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) m_ContextRow = m_PluginListSortProxy->mapToSource(ui->espList->indexAt(pos)).row(); QMenu menu; + menu.addAction(tr("Enable selected"), this, SLOT(enableSelectedPlugins_clicked())); + menu.addAction(tr("Disable selected"), this, SLOT(disableSelectedPlugins_clicked())); + + menu.addSeparator(); + menu.addAction(tr("Enable all"), m_OrganizerCore.pluginList(), SLOT(enableAll())); menu.addAction(tr("Disable all"), m_OrganizerCore.pluginList(), SLOT(disableAll())); diff --git a/src/mainwindow.h b/src/mainwindow.h index 6cf83301..085126f7 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -428,6 +428,10 @@ private slots: void hideFile(); void unhideFile(); + // pluginlist context menu + void enableSelectedPlugins_clicked(); + void disableSelectedPlugins_clicked(); + void linkToolbar(); void linkDesktop(); void linkMenu(); diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 90311b95..f96ca5cd 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -2565,6 +2565,7 @@ You can also use online editors and converters instead. + Open in Explorer @@ -2660,8 +2661,10 @@ You can also use online editors and converters instead. + - Open in explorer + Open in Explorer + Open in explorer diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 323cd98f..18e40a6e 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -289,6 +289,47 @@ void PluginList::enableESP(const QString &name, bool enable) } } +void PluginList::enableSelected(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()){ + bool dirty = false; + for (auto row : selectionModel->selectedRows(COL_PRIORITY)) { + int rowPriority = row.data().toInt(); + for (int i = 0; i < m_ESPs.size(); i++) { + if (m_ESPs[i].m_Priority == rowPriority) { + if (!m_ESPs[i].m_Enabled) { + m_ESPs[i].m_Enabled = true; + dirty = true; + } + + break; + } + } + } + if (dirty) emit writePluginsList(); + } +} + +void PluginList::disableSelected(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()){ + bool dirty = false; + for (auto row : selectionModel->selectedRows(COL_PRIORITY)) { + int rowPriority = row.data().toInt(); + for (int i = 0; i < m_ESPs.size(); i++) { + if (m_ESPs[i].m_Priority == rowPriority) { + if (!m_ESPs[i].m_ForceEnabled && m_ESPs[i].m_Enabled) { + m_ESPs[i].m_Enabled = false; + dirty = true; + } + break; + } + } + } + if (dirty) emit writePluginsList(); + } +} + void PluginList::enableAll() { diff --git a/src/pluginlist.h b/src/pluginlist.h index b8e35c32..03d6426a 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -244,6 +244,16 @@ public: // implementation of the QAbstractTableModel interface public slots: + /** + * @brief enables selected plugins + **/ + void enableSelected(const QItemSelectionModel *selectionModel); + + /** + * @brief disables selected plugins + **/ + void disableSelected(const QItemSelectionModel *selectionModel); + /** * @brief enables ALL plugins **/ -- cgit v1.3.1 From c27e718fbdb3355bb75a92e8773afebb7d9c69a5 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 16 Aug 2018 14:32:28 -0500 Subject: Add "enable/disable selected" to mod list context menu --- src/mainwindow.cpp | 22 ++++- src/mainwindow.h | 2 + src/modlist.cpp | 30 ++++++ src/modlist.h | 4 + src/organizer_en.ts | 263 ++++++++++++++++++++++++++-------------------------- 5 files changed, 190 insertions(+), 131 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index d638e988..e6b454c5 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3597,13 +3597,19 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Ignore update"), this, SLOT(ignoreUpdate())); } } + + menu->addSeparator(); + + menu->addAction(tr("Enable selected"), this, SLOT(enableSelectedMods_clicked())); + menu->addAction(tr("Disable selected"), this, SLOT(disableSelectedMods_clicked())); + menu->addSeparator(); menu->addAction(tr("Rename Mod..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Reinstall Mod"), this, SLOT(reinstallMod_clicked())); - menu->addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked())); + menu->addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked())); - menu->addSeparator(); + menu->addSeparator(); if (info->getNexusID() > 0) { switch (info->endorsedState()) { @@ -4183,6 +4189,18 @@ void MainWindow::disableSelectedPlugins_clicked() } +void MainWindow::enableSelectedMods_clicked() +{ + m_OrganizerCore.modList()->enableSelected(ui->modList->selectionModel()); +} + + +void MainWindow::disableSelectedMods_clicked() +{ + m_OrganizerCore.modList()->disableSelected(ui->modList->selectionModel()); +} + + void MainWindow::previewDataFile() { QString fileName = QDir::fromNativeSeparators(m_ContextItem->data(0, Qt::UserRole).toString()); diff --git a/src/mainwindow.h b/src/mainwindow.h index 085126f7..ad0972da 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -417,6 +417,8 @@ private slots: void visitWebPage_clicked(); void openExplorer_clicked(); void information_clicked(); + void enableSelectedMods_clicked(); + void disableSelectedMods_clicked(); // savegame context menu void deleteSavegame_clicked(); void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets); diff --git a/src/modlist.cpp b/src/modlist.cpp index 0d084c22..afed2241 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -1231,3 +1231,33 @@ bool ModList::eventFilter(QObject *obj, QEvent *event) } return QAbstractItemModel::eventFilter(obj, event); } + + +void ModList::enableSelected(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()) { + bool dirty = false; + for (auto row : selectionModel->selectedRows(COL_PRIORITY)) { + int modID = m_Profile->modIndexByPriority(row.data().toInt()); + if (!m_Profile->modEnabled(modID)) { + m_Profile->setModEnabled(modID, true); + emit modlist_changed(row, 0); + } + } + } +} + + +void ModList::disableSelected(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()) { + bool dirty = false; + for (auto row : selectionModel->selectedRows(COL_PRIORITY)) { + int modID = m_Profile->modIndexByPriority(row.data().toInt()); + if (m_Profile->modEnabled(modID)) { + m_Profile->setModEnabled(modID, false); + emit modlist_changed(row, 0); + } + } + } +} \ No newline at end of file diff --git a/src/modlist.h b/src/modlist.h index 2db98bd1..15376ed5 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -170,6 +170,10 @@ public slots: void dropModeUpdate(bool dropOnItems); + void enableSelected(const QItemSelectionModel *selectionModel); + + void disableSelected(const QItemSelectionModel *selectionModel); + signals: /** diff --git a/src/organizer_en.ts b/src/organizer_en.ts index f96ca5cd..0d0cae2c 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1762,7 +1762,7 @@ p, li { white-space: pre-wrap; } - + Refresh @@ -1941,7 +1941,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1982,7 +1982,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2248,8 +2248,8 @@ Right now this has very limited functionality - - + + failed to rename "%1" to "%2" @@ -2257,7 +2257,7 @@ Right now this has very limited functionality - + Confirm @@ -2340,7 +2340,7 @@ Please enter a name: - + Are you sure? @@ -2368,7 +2368,7 @@ This function will guess the versioning scheme under the assumption that the ins - + Sorry @@ -2565,7 +2565,7 @@ You can also use online editors and converters instead. - + Open in Explorer @@ -2605,102 +2605,107 @@ You can also use online editors and converters instead. - + + + Enable selected + + + + + + Disable selected + + + + Rename Mod... - + Reinstall Mod - + Remove Mod... - + Un-Endorse - - + + Endorse - + Won't endorse - + Endorsement state unknown - + Ignore missing data - + Mark as converted/working - + Visit on Nexus - + Visit web page - - - Open in Explorer - Open in explorer - - - - + Information... - - + + Exception: - - + + Unknown exception - + <All> - + <Multiple> - + %1 more - + 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. @@ -2708,12 +2713,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2721,319 +2726,319 @@ You can also use online editors and converters instead. - + failed to remove %1 - + failed to create %1 - + Can't change download directory while downloads are in progress! - + failed to write to file %1 - + %1 written - + Select binary - + Binary - + Enter Name - + Please enter a name for the executable - + Not an executable - + This is not a recognized executable. - - + + Replace file? - + There already is a hidden version of this file. Replace it? - - + + File operation failed - - + + Failed to remove "%1". Maybe you lack the required file permissions? - + There already is a visible version of this file. Replace it? - + file not found: %1 - + failed to generate preview for %1 - + Sorry, can't preview anything. This function currently does not support extracting from bsas. - + Update available - + Open/Execute - + Add as Executable - + Preview - + Un-Hide - + Hide - + Write To File... - + Do you want to endorse Mod Organizer on %1 now? - + Thank you! - + Thank you for your endorsement! - + Request to Nexus failed: %1 - - + + failed to read %1: %2 - - + + Error - + failed to extract %1 (errorcode %2) - + Extract BSA - + This archive contains invalid hashes. Some files may be broken. - + Extract... - + This will restart MO, continue? - + Edit Categories... - + Deselect filter - + Remove - + Enable all - + Disable all - + Unlock load order - + Lock load order - + depends on missing "%1" - + incompatible with "%1" - + Please wait while LOOT is running - + loot failed. Exit code was: %1 - + failed to start loot - + failed to run loot: %1 - + Errors occured - + Backup of load order created - + Choose backup to restore - + No Backups - + There are no backups to restore - - + + Restore failed - - + + Failed to restore the backup. Errorcode: %1 - + Backup of modlist created - + A file with the same name has already been downloaded. What would you like to do? - + Overwrite - + Rename new file - + Ignore file @@ -4452,84 +4457,84 @@ Continue? - - + + Confirm - + Really enable all plugins? - + Really disable all plugins? - + The file containing locked plugin indices is broken - - + + <b>Origin</b>: %1 - + <br><b><i>This plugin can't be disabled (enforced by the game).</i></b> - + Author - + Description - + Missing Masters - + Enabled Masters - + Loads Archives - + There are Archives connected to this plugin. Their assets will be added to your game, overwriting in case of conflicts following the plugin order. Loose files will always overwrite assets from Archives. (This flag only checks for Archives from the same mod as the plugin) - + Loads INI settings - + There is an ini file connected to this plugin. Its settings will be added to your game settings, overwriting in case of conflicts. - + This ESP is flagged as an ESL. It will adhere to the ESP load order but the records will be loaded in ESL space. - + failed to restore load order for %1 @@ -5267,7 +5272,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> @@ -5308,12 +5313,12 @@ If the folder was still in use, restart MO and try again. - + failed to access %1 - + failed to set file time %1 -- cgit v1.3.1 From d65031c814769079a72d79b0edb84a20266b2b3c Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 16 Aug 2018 22:40:05 -0500 Subject: Allow user to cancel VFS mapping --- src/mainwindow.cpp | 3 +++ src/organizercore.cpp | 3 +++ src/usvfsconnector.cpp | 4 ++++ src/usvfsconnector.h | 16 +++++++++++++++- 4 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e6b454c5..3c749bf5 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -5012,6 +5012,9 @@ void MainWindow::on_bossButton_clicked() createStdoutPipe(&stdOutRead, &stdOutWrite); try { m_OrganizerCore.prepareVFS(); + } catch (const UsvfsConnectorException &e) { + qDebug(e.what()); + return; } catch (const std::exception &e) { QMessageBox::warning(qApp->activeWindow(), tr("Error"), e.what()); return; diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 74ec752e..5c85e323 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1311,6 +1311,9 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary, if (m_AboutToRun(binary.absoluteFilePath())) { try { m_USVFS.updateMapping(fileMapping(profileName, customOverwrite)); + } catch (const UsvfsConnectorException &e) { + qDebug(e.what()); + return INVALID_HANDLE_VALUE; } catch (const std::exception &e) { QMessageBox::warning(window, tr("Error"), e.what()); return INVALID_HANDLE_VALUE; diff --git a/src/usvfsconnector.cpp b/src/usvfsconnector.cpp index ffbdf3aa..4ffc81c0 100644 --- a/src/usvfsconnector.cpp +++ b/src/usvfsconnector.cpp @@ -166,6 +166,10 @@ void UsvfsConnector::updateMapping(const MappingType &mapping) ClearVirtualMappings(); for (auto map : mapping) { + if (progress.wasCanceled()) { + ClearVirtualMappings(); + throw UsvfsConnectorException("VFS mapping canceled by user"); + } progress.setValue(value++); if (value % 10 == 0) { QCoreApplication::processEvents(); diff --git a/src/usvfsconnector.h b/src/usvfsconnector.h index 0935bac1..40f8857b 100644 --- a/src/usvfsconnector.h +++ b/src/usvfsconnector.h @@ -21,7 +21,7 @@ along with Mod Organizer. If not, see . #ifndef USVFSCONNECTOR_H #define USVFSCONNECTOR_H - +#include #include #include #include @@ -58,6 +58,20 @@ private: }; +class UsvfsConnectorException : public std::exception { + +public: + UsvfsConnectorException(const QString &text) + : std::exception(), m_Message(text.toLocal8Bit()) {} + + virtual const char* what() const throw() + { return m_Message.constData(); } +private: + QByteArray m_Message; + +}; + + class UsvfsConnector : public QObject { Q_OBJECT -- cgit v1.3.1