From 8ea8444dc89546ee731060e66a9b33d3721bbf6d Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 24 Aug 2018 19:50:46 -0500 Subject: Update the version to 2.1.6 --- src/version.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/version.rc b/src/version.rc index 1b0eba08..3f2deab0 100644 --- a/src/version.rc +++ b/src/version.rc @@ -3,8 +3,8 @@ // If VS_FF_PRERELEASE is not set, MO labels the build as a release and uses VER_FILEVERSION to determine version number. // Otherwise, if letters are used in VER_FILEVERSION_STR, uses the full MOBase::VersionInfo parser // Otherwise, uses the numbers from VER_FILEVERSION and sets the release type as pre-alpha -#define VER_FILEVERSION 2,1,5 -#define VER_FILEVERSION_STR "2.1.5\0" +#define VER_FILEVERSION 2,1,6 +#define VER_FILEVERSION_STR "2.1.6\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1 From c4636d891f94f3af6664a82d1f6757a386431fde Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 25 Aug 2018 14:30:27 +0200 Subject: Added ModGroups contents icon and flag. --- src/modinfo.cpp | 2 + src/modinfo.h | 6 +- src/modinforegular.cpp | 4 + src/modlist.cpp | 3 + src/organizer_en.ts | 236 ++++++++++++++++++++++----------------- src/resources.qrc | 1 + src/resources/contents/xedit.png | Bin 0 -> 1796 bytes 7 files changed, 146 insertions(+), 106 deletions(-) create mode 100644 src/resources/contents/xedit.png (limited to 'src') diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 91f3c1a1..b42c7303 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -103,6 +103,8 @@ QString ModInfo::getContentTypeName(int contentType) case CONTENT_SKYPROC: return tr("SkyProc Tools"); case CONTENT_MCM: return tr("MCM Data"); case CONTENT_INI: return tr("INI files"); + case CONTENT_MODGROUP: return tr("ModGroup files"); + default: throw MyException(tr("invalid content type %1").arg(contentType)); } } diff --git a/src/modinfo.h b/src/modinfo.h index 4cdd7bcf..82dd8dc8 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -85,10 +85,12 @@ public: CONTENT_SKSE, CONTENT_SKYPROC, CONTENT_MCM, - CONTENT_INI + CONTENT_INI, + CONTENT_MODGROUP + }; - static const int NUM_CONTENT_TYPES = CONTENT_INI + 1; + static const int NUM_CONTENT_TYPES = CONTENT_MODGROUP + 1; enum EHighlight { HIGHLIGHT_NONE = 0, diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 5b6ddcda..f74b3a36 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -471,6 +471,10 @@ std::vector ModInfoRegular::getContents() const m_CachedContent.push_back(CONTENT_INI); } + if (dir.entryList(QStringList() << "*.modgroups").size() > 0) { + m_CachedContent.push_back(CONTENT_MODGROUP); + } + ScriptExtender *extender = qApp->property("managed_game") .value() ->feature(); diff --git a/src/modlist.cpp b/src/modlist.cpp index afed2241..bcd087bc 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -74,6 +74,7 @@ ModList::ModList(PluginContainer *pluginContainer, QObject *parent) m_ContentIcons[ModInfo::CONTENT_TEXTURE] = std::make_tuple(":/MO/gui/content/texture", tr("Textures")); m_ContentIcons[ModInfo::CONTENT_MCM] = std::make_tuple(":/MO/gui/content/menu", tr("MCM Configuration")); m_ContentIcons[ModInfo::CONTENT_INI] = std::make_tuple(":/MO/gui/content/inifile", tr("INI files")); + m_ContentIcons[ModInfo::CONTENT_MODGROUP] = std::make_tuple(":/MO/gui/content/modgroup", tr("ModGroup files")); m_LastCheck.start(); } @@ -1119,6 +1120,8 @@ QString ModList::getColumnToolTip(int column) "SkyProc Patcher" "Mod Configuration Menu" "INI files" + "ModGroup files" + ""); case COL_INSTALLTIME: return tr("Time this mod was installed"); default: return tr("unknown"); diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 8b8bd101..6a045733 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -817,212 +817,220 @@ p, li { white-space: pre-wrap; } - + No known download urls. Sorry, this download can't be resumed. - + query: invalid download index %1 - + Please enter the nexus mod id - + Mod ID: - + Please select the source game code for %1 - + VisitNexus: invalid download index %1 - + Nexus ID for this Mod is unknown - + OpenFile: invalid download index %1 - + 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 + + + Unable to write download to drive (return %1). +Check the drive's available storage. + +Canceling download "%2"... + + EditExecutablesDialog @@ -3111,16 +3119,21 @@ You can also use online editors and converters instead. + ModGroup files + + + + invalid content type %1 - + invalid mod index %1 - + remove: invalid mod index %1 @@ -3756,12 +3769,12 @@ p, li { white-space: pre-wrap; } - + %1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory - + Categories: <br> @@ -3824,193 +3837,198 @@ p, li { white-space: pre-wrap; } - + + ModGroup files + + + + This entry contains files that have been created inside the virtual data tree (i.e. by the construction kit) - + Backup - + No valid game data - + Not endorsed yet - + Overwrites files - + Overwritten files - + Overwrites & Overwritten - + Redundant - + Alternate game source - + Non-MO - + invalid - + 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> + + 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><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table> - + Time this mod was installed @@ -4808,78 +4826,88 @@ p, li { white-space: pre-wrap; } - + Archive invalidation isn't required for this game. - - + + failed to create profile: %1 - + Name - + Please enter a name for the new profile - + failed to copy profile: %1 - + Invalid name - + Invalid profile name - + + Deleting active profile + + + + + Unable to delete active profile. Please change to a different profile first. + + + + Confirm - + Are you sure you want to remove this profile (including local savegames if any)? - + Profile broken - + This profile you're about to delete seems to be broken or the path is invalid. I'm about to delete the following folder: "%1". Proceed? - + Rename Profile - + New Name - + failed to change archive invalidation state: %1 - + failed to determine if invalidation is active: %1 @@ -5323,7 +5351,7 @@ If the folder was still in use, restart MO and try again. - + Before you can use ModOrganizer, you need to create at least one profile. ATTENTION: Run the game at least once before creating a profile! diff --git a/src/resources.qrc b/src/resources.qrc index f3459ea7..1dccce0b 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -94,6 +94,7 @@ resources/contents/locked-chest.png resources/contents/config.png resources/contents/feather-and-scroll.png + resources/contents/xedit.png qt.conf diff --git a/src/resources/contents/xedit.png b/src/resources/contents/xedit.png new file mode 100644 index 00000000..49453d71 Binary files /dev/null and b/src/resources/contents/xedit.png differ -- cgit v1.3.1 From c576f1ff40d81553e26c9f8fcfc01dc675fc9c1a Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 26 Aug 2018 18:39:30 -0500 Subject: Refresh save game list when local game settings may have changed --- src/mainwindow.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3c749bf5..5908f9e4 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -84,6 +84,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include "localsavegames.h" #include #include @@ -1132,6 +1133,11 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) } else { activateSelectedProfile(); } + + LocalSavegames *saveGames = m_OrganizerCore.managedGame()->feature(); + if (saveGames != nullptr && saveGames->updateSaveGames(m_OrganizerCore.currentProfile())) { + refreshSaveList(); + } } } @@ -1973,6 +1979,12 @@ void MainWindow::on_actionAdd_Profile_triggered() break; } } + + LocalSavegames *saveGames = m_OrganizerCore.managedGame()->feature(); + if (saveGames != nullptr && saveGames->updateSaveGames(m_OrganizerCore.currentProfile())) { + refreshSaveList(); + } + // addProfile(); } -- cgit v1.3.1 From 138154aca0fcb27e3e09e2de3f895c5e1de99e3f Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 31 Aug 2018 22:16:13 +0200 Subject: Added "Refresh" button to downloads tab. --- src/mainwindow.cpp | 5 + src/mainwindow.h | 1 + src/mainwindow.ui | 14 ++ src/organizer_en.ts | 554 ++++++++++++++++++++++++++-------------------------- 4 files changed, 300 insertions(+), 274 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5908f9e4..dd8b1447 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1764,6 +1764,11 @@ void MainWindow::on_btnRefreshData_clicked() m_OrganizerCore.refreshDirectoryStructure(); } +void MainWindow::on_btnRefreshDownloads_clicked() +{ + m_OrganizerCore.downloadManager()->refreshList(); +} + void MainWindow::on_tabWidget_currentChanged(int index) { if (index == 0) { diff --git a/src/mainwindow.h b/src/mainwindow.h index ad0972da..b3d179e8 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -575,6 +575,7 @@ private slots: // ui slots void on_bsaList_customContextMenuRequested(const QPoint &pos); void on_clearFiltersButton_clicked(); void on_btnRefreshData_clicked(); + void on_btnRefreshDownloads_clicked(); void on_categoriesList_customContextMenuRequested(const QPoint &pos); void on_conflictsCheckBox_toggled(bool checked); void on_dataTree_customContextMenuRequested(const QPoint &pos); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index cf0f2aa4..75be7536 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1218,6 +1218,20 @@ p, li { white-space: pre-wrap; } 2 + + + Refresh downloads view + + + Refresh + + + + :/MO/gui/resources/view-refresh.png:/MO/gui/resources/view-refresh.png + + + + diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 6a045733..09d1fe79 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1643,7 +1643,7 @@ p, li { white-space: pre-wrap; } - + Namefilter @@ -1769,8 +1769,9 @@ p, li { white-space: pre-wrap; } - - + + + Refresh @@ -1822,150 +1823,155 @@ p, li { white-space: pre-wrap; } - + + Refresh downloads view + + + + This is a list of mods you downloaded from Nexus. Double click one to install it. You can also drag an archive into here. - + Show Hidden - + Tool Bar - + Install Mod - + Install &Mod - + Install a new mod from an archive - + Ctrl+M - + Profiles - + &Profiles - + Configure Profiles - + Ctrl+P - + Executables - + &Executables - + Configure the executables that can be started through Mod Organizer - + Ctrl+E - - + + Tools - + &Tools - + Ctrl+I - + Settings - + &Settings - + Configure settings and workarounds - + Ctrl+S - + Nexus - + Search nexus network for more mods - + Ctrl+N - - + + Update - + Mod Organizer is up-to-date - - + + No Problems - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1973,747 +1979,747 @@ Right now this has very limited functionality - - + + Help - + Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Copy Log to Clipboard - + 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 - + Restore Backup - + Remove Backup... - + Change Categories - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2721,12 +2727,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2734,319 +2740,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 @@ -5294,18 +5300,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 c6751b690aaed5a7069eb7ec073e7675335a2e0f Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 7 Sep 2018 18:56:28 +0200 Subject: Improved Skript Extender Plugin filter to actually look for plugins and not only the SKSE folder. --- src/modinforegular.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index f74b3a36..dcace416 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -481,8 +481,12 @@ std::vector ModInfoRegular::getContents() const if (extender != nullptr) { QString sePluginPath = extender->PluginPath(); - if (dir.exists(sePluginPath)) - m_CachedContent.push_back(CONTENT_SKSE); + if (dir.exists(sePluginPath)) { + QDir sePluginDir(absolutePath() + "/" + sePluginPath); + if (sePluginDir.entryList(QStringList() << "*.dll").size() > 0) { + m_CachedContent.push_back(CONTENT_SKSE); + } + } } if (dir.exists("textures") || dir.exists("icons") || dir.exists("bookart")) m_CachedContent.push_back(CONTENT_TEXTURE); -- cgit v1.3.1 From ba162804cd85120e7210f31bbcd1e4b2a45fd394 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 7 Sep 2018 20:19:20 +0200 Subject: Added Contains Script Extender Files filter. --- src/modinfo.cpp | 1 + src/modinfo.h | 1 + src/modinforegular.cpp | 1 + 3 files changed, 3 insertions(+) (limited to 'src') diff --git a/src/modinfo.cpp b/src/modinfo.cpp index b42c7303..8ce40da3 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -100,6 +100,7 @@ QString ModInfo::getContentTypeName(int contentType) case CONTENT_SOUND: return tr("Sound Effects"); case CONTENT_SCRIPT: return tr("Scripts"); case CONTENT_SKSE: return tr("Script Extender"); + case CONTENT_SKSEFILES: return tr("Script Extender Files"); case CONTENT_SKYPROC: return tr("SkyProc Tools"); case CONTENT_MCM: return tr("MCM Data"); case CONTENT_INI: return tr("INI files"); diff --git a/src/modinfo.h b/src/modinfo.h index 82dd8dc8..919d1a5b 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -83,6 +83,7 @@ public: CONTENT_SOUND, CONTENT_SCRIPT, CONTENT_SKSE, + CONTENT_SKSEFILES, CONTENT_SKYPROC, CONTENT_MCM, CONTENT_INI, diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index dcace416..1e77e050 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -482,6 +482,7 @@ std::vector ModInfoRegular::getContents() const if (extender != nullptr) { QString sePluginPath = extender->PluginPath(); if (dir.exists(sePluginPath)) { + m_CachedContent.push_back(CONTENT_SKSEFILES); QDir sePluginDir(absolutePath() + "/" + sePluginPath); if (sePluginDir.entryList(QStringList() << "*.dll").size() > 0) { m_CachedContent.push_back(CONTENT_SKSE); -- cgit v1.3.1 From 979206228d6bcfd71fb22c6a9b8dd4f54f7b5a75 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 7 Sep 2018 20:53:42 +0200 Subject: Added Mod Backups filter for modlist. --- src/categories.h | 6 ++++-- src/mainwindow.cpp | 1 + src/modlistsortproxy.cpp | 6 ++++++ 3 files changed, 11 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/categories.h b/src/categories.h index 474a1440..48e0b44b 100644 --- a/src/categories.h +++ b/src/categories.h @@ -47,8 +47,10 @@ public: static const int CATEGORY_SPECIAL_NOCATEGORY = 10003; static const int CATEGORY_SPECIAL_CONFLICT = 10004; static const int CATEGORY_SPECIAL_NOTENDORSED = 10005; - static const int CATEGORY_SPECIAL_MANAGED = 10006; - static const int CATEGORY_SPECIAL_UNMANAGED = 10007; + static const int CATEGORY_SPECIAL_BACKUP = 10006; + static const int CATEGORY_SPECIAL_MANAGED = 10007; + static const int CATEGORY_SPECIAL_UNMANAGED = 10008; + public: diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index dd8b1447..28d561b9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2223,6 +2223,7 @@ void MainWindow::refreshFilters() addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_CHECKED, ModListSortProxy::TYPE_SPECIAL); addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_UNCHECKED, ModListSortProxy::TYPE_SPECIAL); addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_BACKUP, ModListSortProxy::TYPE_SPECIAL); addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_MANAGED, ModListSortProxy::TYPE_SPECIAL); addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_UNMANAGED, ModListSortProxy::TYPE_SPECIAL); addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_NOCATEGORY, ModListSortProxy::TYPE_SPECIAL); diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index 88084ae1..59784642 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -270,6 +270,9 @@ bool ModListSortProxy::filterMatchesModAnd(ModInfo::Ptr info, bool enabled) cons case CategoryFactory::CATEGORY_SPECIAL_NOTENDORSED: { ModInfo::EEndorsedState state = info->endorsedState(); if (state != ModInfo::ENDORSED_FALSE) return false; + } break; + case CategoryFactory::CATEGORY_SPECIAL_BACKUP: { + if (!info->hasFlag(ModInfo::FLAG_BACKUP)) return false; } break; case CategoryFactory::CATEGORY_SPECIAL_MANAGED: { if (info->hasFlag(ModInfo::FLAG_FOREIGN)) return false; @@ -312,6 +315,9 @@ bool ModListSortProxy::filterMatchesModOr(ModInfo::Ptr info, bool enabled) const case CategoryFactory::CATEGORY_SPECIAL_NOTENDORSED: { ModInfo::EEndorsedState state = info->endorsedState(); if ((state == ModInfo::ENDORSED_FALSE) || (state == ModInfo::ENDORSED_NEVER)) return true; + } break; + case CategoryFactory::CATEGORY_SPECIAL_BACKUP: { + if (info->hasFlag(ModInfo::FLAG_BACKUP)) return true; } break; case CategoryFactory::CATEGORY_SPECIAL_MANAGED: { if (!info->hasFlag(ModInfo::FLAG_FOREIGN)) return true; -- cgit v1.3.1 From 67fb7e56d3a080844927d4d41764da1e9bb39795 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 7 Sep 2018 22:04:03 +0200 Subject: Add option to create a Mod backup from the modlist context menu. --- src/installationmanager.h | 4 +++- src/mainwindow.cpp | 12 ++++++++++++ src/mainwindow.h | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/installationmanager.h b/src/installationmanager.h index e17aee17..e66184d3 100644 --- a/src/installationmanager.h +++ b/src/installationmanager.h @@ -147,6 +147,8 @@ public: */ virtual bool testOverwrite(MOBase::GuessedValue &modName, bool *merge = nullptr) const; + QString generateBackupName(const QString &directoryName) const; + private: void queryPassword(QString *password); @@ -171,7 +173,7 @@ private: bool doInstall(MOBase::GuessedValue &modName, QString gameName, int modID, const QString &version, const QString &newestVersion, int categoryID, const QString &repository); - QString generateBackupName(const QString &directoryName) const; + //QString generateBackupName(const QString &directoryName) const; bool ensureValidModName(MOBase::GuessedValue &name) const; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 28d561b9..57988663 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2409,6 +2409,16 @@ void MainWindow::reinstallMod_clicked() } } +void MainWindow::backupMod_clicked() +{ + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + QString backupDirectory = m_OrganizerCore.installationManager()->generateBackupName(modInfo->absolutePath()); + if (!copyDir(modInfo->absolutePath(), backupDirectory, false)) { + QMessageBox::information(this, tr("Failed"), + tr("Failed to create backup.")); + } + m_OrganizerCore.refreshModList(); +} void MainWindow::resumeDownload(int downloadIndex) { @@ -3626,6 +3636,8 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) 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("Create Backup"), this, SLOT(backupMod_clicked())); + menu->addSeparator(); diff --git a/src/mainwindow.h b/src/mainwindow.h index b3d179e8..0bf3d3c8 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -407,6 +407,7 @@ private slots: void restoreBackup_clicked(); void renameMod_clicked(); void removeMod_clicked(); + void backupMod_clicked(); void reinstallMod_clicked(); void endorse_clicked(); void dontendorse_clicked(); -- cgit v1.3.1 From 33e11e20566cbbbbf49a064d0fac9f626a410f9a Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 8 Sep 2018 12:32:45 +0200 Subject: Added debug line to check actual processed parameters passed to CreateProcessHooked() to see if we can discover somethig more on Parameter is incorrect error. --- src/spawn.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/spawn.cpp b/src/spawn.cpp index ac8ccf30..f92387d5 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -29,6 +29,8 @@ along with Mod Organizer. If not, see . #include #include +#include + #include @@ -91,6 +93,7 @@ static bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, PROCESS_INFORMATION pi; BOOL success = FALSE; if (hooked) { + qDebug() << "Creating process hooked: <" << QString::fromWCharArray(commandLine, length) <<">"; success = ::CreateProcessHooked(nullptr, commandLine, nullptr, nullptr, // no special process or thread attributes -- cgit v1.3.1 From 3e29d312315a15394a4da423dfa8791f40e3ab52 Mon Sep 17 00:00:00 2001 From: Silarn Date: Sun, 9 Sep 2018 04:12:23 -0500 Subject: Allow installs to pass Mod ID through (fixes NCC installs losing ID) --- src/installationmanager.cpp | 1834 +++++++++++++++++++++---------------------- src/installationmanager.h | 452 +++++------ 2 files changed, 1143 insertions(+), 1143 deletions(-) (limited to 'src') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index fead2bc4..5c8b6897 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -1,917 +1,917 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Mod Organizer. If not, see . -*/ - -#include "installationmanager.h" - -#include "utility.h" -#include "report.h" -#include "categories.h" -#include "questionboxmemory.h" -#include "settings.h" -#include "queryoverwritedialog.h" -#include "messagedialog.h" -#include "iplugininstallersimple.h" -#include "iplugininstallercustom.h" -#include "nexusinterface.h" -#include "selectiondialog.h" -#include "modinfo.h" -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - - -using namespace MOBase; -using namespace MOShared; - - -typedef Archive* (*CreateArchiveType)(); - - - -template -static T resolveFunction(QLibrary &lib, const char *name) -{ - T temp = reinterpret_cast(lib.resolve(name)); - if (temp == nullptr) { - throw std::runtime_error(QObject::tr("invalid 7-zip32.dll: %1") - .arg(lib.errorString()) - .toLatin1() - .constData()); - } - return temp; -} - -InstallationManager::InstallationManager() - : m_ParentWidget(nullptr), - m_SupportedExtensions({"zip", "rar", "7z", "fomod", "001"}) { - QLibrary archiveLib(QCoreApplication::applicationDirPath() + - "\\dlls\\archive.dll"); - if (!archiveLib.load()) { - throw MyException(QObject::tr("archive.dll not loaded: \"%1\"") - .arg(archiveLib.errorString())); - } - - CreateArchiveType CreateArchiveFunc - = resolveFunction(archiveLib, "CreateArchive"); - - m_ArchiveHandler = CreateArchiveFunc(); - if (!m_ArchiveHandler->isValid()) { - throw MyException(getErrorString(m_ArchiveHandler->getLastError())); - } -} - -InstallationManager::~InstallationManager() -{ - delete m_ArchiveHandler; -} - -void InstallationManager::setParentWidget(QWidget *widget) -{ - for (IPluginInstaller *installer : m_Installers) { - installer->setParentWidget(widget); - } -} - -void InstallationManager::setURL(QString const &url) -{ - m_URL = url; -} - -void InstallationManager::queryPassword(QString *password) -{ - *password = QInputDialog::getText(nullptr, tr("Password required"), - tr("Password"), QLineEdit::Password); -} - -void InstallationManager::mapToArchive(const DirectoryTree::Node *node, QString path, FileData * const *data) -{ - if (path.length() > 0) { - // when using a long windows path (starting with \\?\) we apparently can have redundant - // . components in the path. This wasn't a problem with "regular" path names. - if (path == ".") { - path.clear(); - } else { - path.append("\\"); - } - } - - for (DirectoryTree::const_leaf_iterator iter = node->leafsBegin(); iter != node->leafsEnd(); ++iter) { - data[iter->getIndex()]->addOutputFileName(path + iter->getName().toQString()); - } - - for (DirectoryTree::const_node_iterator iter = node->nodesBegin(); iter != node->nodesEnd(); ++iter) { - QString temp = path + (*iter)->getData().name.toQString(); - if ((*iter)->getData().index != -1) { - data[(*iter)->getData().index]->addOutputFileName(temp); - } - mapToArchive(*iter, temp, data); - } -} - - -void InstallationManager::mapToArchive(const DirectoryTree::Node *baseNode) -{ - FileData* const *data; - size_t size; - m_ArchiveHandler->getFileList(data, size); - - mapToArchive(baseNode, "", data); -} - - -bool InstallationManager::unpackSingleFile(const QString &fileName) -{ - FileData* const *data; - size_t size; - m_ArchiveHandler->getFileList(data, size); - - QString baseName = QFileInfo(fileName).fileName(); - - bool available = false; - for (size_t i = 0; i < size; ++i) { - if (data[i]->getFileName().compare(fileName, Qt::CaseInsensitive) == 0) { - available = true; - data[i]->addOutputFileName(baseName); - m_TempFilesToDelete.insert(baseName); - } - } - - if (!available) { - return false; - } - - m_InstallationProgress = new QProgressDialog(m_ParentWidget); - ON_BLOCK_EXIT([this] () { - m_InstallationProgress->hide(); - m_InstallationProgress->deleteLater(); - m_InstallationProgress = nullptr; - m_Progress = 0; - }); - m_InstallationProgress->setWindowFlags( - m_InstallationProgress->windowFlags() & ~Qt::WindowContextHelpButtonHint); - - m_InstallationProgress->setWindowTitle(tr("Extracting files")); - m_InstallationProgress->setWindowModality(Qt::WindowModal); - m_InstallationProgress->setFixedSize(600, 100); - m_InstallationProgress->show(); - - QFuture future = QtConcurrent::run([&]() -> bool { - return m_ArchiveHandler->extract( - QDir::tempPath(), - new MethodCallback(this, &InstallationManager::updateProgress), - nullptr, - new MethodCallback(this, &InstallationManager::report7ZipError) - ); - }); - do { - if (m_Progress != m_InstallationProgress->value()) - m_InstallationProgress->setValue(m_Progress); - QCoreApplication::processEvents(); - } while (!future.isFinished() || m_InstallationProgress->isVisible()); - bool res = future.result(); - - return res; -} - - -QString InstallationManager::extractFile(const QString &fileName) -{ - if (unpackSingleFile(fileName)) { - return QDir::tempPath() + "/" + QFileInfo(fileName).fileName(); - } else { - return QString(); - } -} - - -static QString canonicalize(const QString &name) -{ - QString result(name); - if ((result.startsWith('/')) || - (result.startsWith('\\'))) { - result.remove(0, 1); - } - result.replace('/', '\\'); - - return result; -} - - -QStringList InstallationManager::extractFiles(const QStringList &filesOrig, bool flatten) -{ - QStringList files; - - for (const QString &file : filesOrig) { - files.append(canonicalize(file)); - } - - QStringList result; - - FileData* const *data; - size_t size; - m_ArchiveHandler->getFileList(data, size); - - for (size_t i = 0; i < size; ++i) { - //FIXME Use qstring all the way through - if (files.contains(data[i]->getFileName(), Qt::CaseInsensitive)) { - std::wstring temp = data[i]->getFileName().toStdWString(); - wchar_t const * const origFile = temp.c_str(); - const wchar_t *targetFile = origFile; - //Note: I don't think 'flatten' is ever set to true. so this code - //might never be executed - if (flatten) { - targetFile = wcsrchr(origFile/*data[i]->getFileName()*/, '\\'); - if (targetFile == nullptr) { - targetFile = wcsrchr(origFile/*data[i]->getFileName()*/, '/'); - } - if (targetFile == nullptr) { - qCritical() << "Failed to find backslash in " << data[i]->getFileName(); - continue; - } else { - // skip the slash - ++targetFile; - } - } - data[i]->addOutputFileName(ToQString(targetFile)); - - result.append(QDir::tempPath().append("/").append(ToQString(targetFile))); - - m_TempFilesToDelete.insert(ToQString(targetFile)); - } - } - - m_InstallationProgress = new QProgressDialog(m_ParentWidget); - ON_BLOCK_EXIT([this] () { - m_InstallationProgress->hide(); - m_InstallationProgress->deleteLater(); - m_InstallationProgress = nullptr; - m_Progress = 0; - }); - m_InstallationProgress->setWindowFlags( - m_InstallationProgress->windowFlags() & (~Qt::WindowContextHelpButtonHint)); - m_InstallationProgress->setWindowTitle(tr("Extracting files")); - m_InstallationProgress->setWindowModality(Qt::WindowModal); - m_InstallationProgress->setFixedSize(600, 100); - m_InstallationProgress->show(); - - // unpack only the files we need for the installer - QFuture future = QtConcurrent::run([&]() -> bool { - return m_ArchiveHandler->extract( - QDir::tempPath(), - new MethodCallback(this, &InstallationManager::updateProgress), - nullptr, - new MethodCallback(this, &InstallationManager::report7ZipError) - ); - }); - do { - if (m_Progress != m_InstallationProgress->value()) - m_InstallationProgress->setValue(m_Progress); - QCoreApplication::processEvents(); - } while (!future.isFinished() || m_InstallationProgress->isVisible()); - if (!future.result()) { - throw MyException(QString("extracting failed (%1)").arg(m_ArchiveHandler->getLastError())); - } - - return result; -} - -IPluginInstaller::EInstallResult InstallationManager::installArchive(GuessedValue &modName, const QString &archiveName) -{ - // in earlier versions the modName was copied here and the copy passed to install. I don't know why I did this and it causes - // a problem if this is called by the bundle installer and the bundled installer adds additional names that then end up being used, - // because the caller will then not have the right name. - bool iniTweaks; - if (install(archiveName, modName, iniTweaks)) { - return IPluginInstaller::RESULT_SUCCESS; - } else { - return IPluginInstaller::RESULT_FAILED; - } -} - - -DirectoryTree *InstallationManager::createFilesTree() -{ - FileData* const *data; - size_t size; - m_ArchiveHandler->getFileList(data, size); - - QScopedPointer result(new DirectoryTree); - - for (size_t i = 0; i < size; ++i) { - // the files are in a flat list where each file has a a full path relative to the archive root - // to create a tree, we have to iterate over each path component of each. This could be sped up by - // grouping the filenames first, but so far there doesn't seem to be an actual performance problem - DirectoryTree::Node *currentNode = result.data(); - - QString fileName = data[i]->getFileName(); - QStringList components = fileName.split("\\"); - - // iterate over all path-components of this filename (including the filename itself) - for (QStringList::iterator componentIter = components.begin(); componentIter != components.end(); ++componentIter) { - if (componentIter->size() == 0) { - // empty string indicates fileName is actually only a directory name and we have - // completely processed it already. - break; - } - - bool exists = false; - // test if this path is already in the tree - for (DirectoryTree::node_iterator nodeIter = currentNode->nodesBegin(); nodeIter != currentNode->nodesEnd(); ++nodeIter) { - if ((*nodeIter)->getData().name == *componentIter) { - currentNode = *nodeIter; - exists = true; - break; - } - } - - if (!exists) { - if (componentIter + 1 == components.end()) { - // last path component. directory or file? - if (data[i]->isDirectory()) { - // this is a bit problematic. archives will often only list directories if they are empty, - // otherwise the dir only appears in the path of a file. In the UI however we allow the user - // to uncheck all files in a directory while keeping the dir checked. Those directories are - // currently not installed. - DirectoryTree::Node *newNode = new DirectoryTree::Node; - newNode->setData( - DirectoryTreeInformation(*componentIter, static_cast(i))); - currentNode->addNode(newNode, false); - currentNode = newNode; - } else { - currentNode->addLeaf(FileTreeInformation(*componentIter, i)); - } - } else { - DirectoryTree::Node *newNode = new DirectoryTree::Node; - newNode->setData(DirectoryTreeInformation(*componentIter, -1)); - currentNode->addNode(newNode, false); - currentNode = newNode; - } - } - } - } - - return result.take(); -} - - -bool InstallationManager::isSimpleArchiveTopLayer(const DirectoryTree::Node *node, bool bainStyle) -{ - // see if there is at least one directory that makes sense on the top level - for (DirectoryTree::const_node_iterator iter = node->nodesBegin(); iter != node->nodesEnd(); ++iter) { - if ((bainStyle && InstallationTester::isTopLevelDirectoryBain((*iter)->getData().name)) || - (!bainStyle && InstallationTester::isTopLevelDirectory((*iter)->getData().name))) { - qDebug("%s on the top level", (*iter)->getData().name.toUtf8().constData()); - return true; - } - } - - // see if there is a file that makes sense on the top level - for (DirectoryTree::const_leaf_iterator iter = node->leafsBegin(); iter != node->leafsEnd(); ++iter) { - if (InstallationTester::isTopLevelSuffix(iter->getName())) { - return true; - } - } - return false; -} - - -DirectoryTree::Node *InstallationManager::getSimpleArchiveBase(DirectoryTree *dataTree) -{ - DirectoryTree::Node *currentNode = dataTree; - - while (true) { - if (isSimpleArchiveTopLayer(currentNode, false)) { - return currentNode; - } else if ((currentNode->numLeafs() == 0) && - (currentNode->numNodes() == 1)) { - currentNode = *currentNode->nodesBegin(); - } else { - qDebug("not a simple archive"); - return nullptr; - } - } -} - - -void InstallationManager::updateProgress(float percentage) -{ - if (m_InstallationProgress != nullptr) { - m_Progress = static_cast(percentage * 100.0); - - if (m_InstallationProgress->wasCanceled()) { - m_ArchiveHandler->cancel(); - m_InstallationProgress->reset(); - } - } -} - - -void InstallationManager::updateProgressFile(QString const &fileName) -{ - m_ProgressFile = fileName; -} - - -void InstallationManager::report7ZipError(QString const &errorMessage) -{ - reportError(errorMessage); - m_ArchiveHandler->cancel(); -} - - -QString InstallationManager::generateBackupName(const QString &directoryName) const -{ - QString backupName = directoryName + "_backup"; - if (QDir(backupName).exists()) { - int idx = 2; - QString temp = backupName + QString::number(idx); - while (QDir(temp).exists()) { - ++idx; - temp = backupName + QString::number(idx); - } - backupName = temp; - } - return backupName; -} - - -bool InstallationManager::testOverwrite(GuessedValue &modName, bool *merge) const -{ - QString targetDirectory = QDir::fromNativeSeparators(m_ModsDirectory + "\\" + modName); - while (QDir(targetDirectory).exists()) { - Settings &settings(Settings::instance()); - bool backup = settings.directInterface().value("backup_install", false).toBool(); - QueryOverwriteDialog overwriteDialog(m_ParentWidget, - backup ? QueryOverwriteDialog::BACKUP_YES : QueryOverwriteDialog::BACKUP_NO); - if (overwriteDialog.exec()) { - settings.directInterface().setValue("backup_install", overwriteDialog.backup()); - if (overwriteDialog.backup()) { - QString backupDirectory = generateBackupName(targetDirectory); - if (!copyDir(targetDirectory, backupDirectory, false)) { - reportError(tr("failed to create backup")); - return false; - } - } - if (merge != nullptr) { - *merge = (overwriteDialog.action() == QueryOverwriteDialog::ACT_MERGE); - } - if (overwriteDialog.action() == QueryOverwriteDialog::ACT_RENAME) { - bool ok = false; - QString name = QInputDialog::getText(m_ParentWidget, tr("Mod Name"), tr("Name"), - QLineEdit::Normal, modName, &ok); - if (ok && !name.isEmpty()) { - modName.update(name, GUESS_USER); - if (!ensureValidModName(modName)) { - return false; - } - targetDirectory = QDir::fromNativeSeparators(m_ModsDirectory) + "/" + modName; - } - } else if (overwriteDialog.action() == QueryOverwriteDialog::ACT_REPLACE) { - // save original settings like categories. Because it makes sense - QString metaFilename = targetDirectory + "/meta.ini"; - QFile settingsFile(metaFilename); - QByteArray originalSettings; - if (settingsFile.open(QIODevice::ReadOnly)) { - originalSettings = settingsFile.readAll(); - settingsFile.close(); - } - - // remove the directory with all content, then recreate it empty - shellDelete(QStringList(targetDirectory)); - if (!QDir().mkdir(targetDirectory)) { - // windows may keep the directory around for a moment, preventing its re-creation. Not sure - // if this still happens with shellDelete - Sleep(100); - QDir().mkdir(targetDirectory); - } - // restore the saved settings - if (settingsFile.open(QIODevice::WriteOnly)) { - settingsFile.write(originalSettings); - settingsFile.close(); - } else { - qCritical("failed to restore original settings: %s", metaFilename.toUtf8().constData()); - } - return true; - } else if (overwriteDialog.action() == QueryOverwriteDialog::ACT_MERGE) { - return true; - } - } else { - return false; - } - } - - QDir().mkdir(targetDirectory); - - return true; -} - - -bool InstallationManager::ensureValidModName(GuessedValue &name) const -{ - while (name->isEmpty()) { - bool ok; - name.update(QInputDialog::getText(m_ParentWidget, tr("Invalid name"), - tr("The name you entered is invalid, please enter a different one."), - QLineEdit::Normal, "", &ok), - GUESS_USER); - if (!ok) { - return false; - } - } - return true; -} - -bool InstallationManager::doInstall(GuessedValue &modName, QString gameName, int modID, - const QString &version, const QString &newestVersion, - int categoryID, const QString &repository) -{ - if (!ensureValidModName(modName)) { - return false; - } - - bool merge = false; - // determine target directory - if (!testOverwrite(modName, &merge)) { - return false; - } - - QString targetDirectory = QDir(m_ModsDirectory + "/" + modName).canonicalPath(); - QString targetDirectoryNative = QDir::toNativeSeparators(targetDirectory); - - qDebug("installing to \"%s\"", targetDirectoryNative.toUtf8().constData()); - - m_InstallationProgress = new QProgressDialog(m_ParentWidget); - ON_BLOCK_EXIT([this] () { - m_InstallationProgress->hide(); - m_InstallationProgress->deleteLater(); - m_InstallationProgress = nullptr; - m_Progress = 0; - m_ProgressFile = QString(); - }); - - m_InstallationProgress->setWindowFlags( - m_InstallationProgress->windowFlags() & (~Qt::WindowContextHelpButtonHint)); - m_InstallationProgress->setWindowModality(Qt::WindowModal); - m_InstallationProgress->setFixedSize(600, 100); - m_InstallationProgress->show(); - QFuture future = QtConcurrent::run([&]() -> bool { - return m_ArchiveHandler->extract( - targetDirectory, - new MethodCallback(this, &InstallationManager::updateProgress), - new MethodCallback(this, &InstallationManager::updateProgressFile), - new MethodCallback(this, &InstallationManager::report7ZipError) - ); - }); - do { - if (m_Progress != m_InstallationProgress->value()) - m_InstallationProgress->setValue(m_Progress); - if (m_ProgressFile != m_InstallationProgress->labelText()) - m_InstallationProgress->setLabelText(m_ProgressFile); - QCoreApplication::processEvents(); - } while (!future.isFinished()); - if (!future.result()) { - if (m_ArchiveHandler->getLastError() == Archive::ERROR_EXTRACT_CANCELLED) { - return false; - } else { - throw MyException(QString("extracting failed (%1)").arg(m_ArchiveHandler->getLastError())); - } - } - - QSettings settingsFile(targetDirectory + "/meta.ini", QSettings::IniFormat); - - // overwrite settings only if they are actually are available or haven't been set before - if ((gameName != "") || !settingsFile.contains("gameName")) { - settingsFile.setValue("gameName", gameName); - } - if ((modID != 0) || !settingsFile.contains("modid")) { - settingsFile.setValue("modid", modID); - } - if (!settingsFile.contains("version") || - (!version.isEmpty() && - (!merge || (VersionInfo(version) >= VersionInfo(settingsFile.value("version").toString()))))) { - settingsFile.setValue("version", version); - } - if (!newestVersion.isEmpty() || !settingsFile.contains("newestVersion")) { - settingsFile.setValue("newestVersion", newestVersion); - } - // issue #51 used to overwrite the manually set categories - if (!settingsFile.contains("category")) { - settingsFile.setValue("category", QString::number(categoryID)); - } - settingsFile.setValue("installationFile", m_CurrentFile); - settingsFile.setValue("repository", repository); - settingsFile.setValue("url", m_URL); - - if (!merge) { - // this does not clear the list we have in memory but the mod is going to have to be re-read anyway - // btw.: installedFiles were written with beginWriteArray but we can still clear it with beginGroup. nice - settingsFile.beginGroup("installedFiles"); - settingsFile.remove(""); - settingsFile.endGroup(); - } - - return true; -} - - -bool InstallationManager::wasCancelled() -{ - return m_ArchiveHandler->getLastError() == Archive::ERROR_EXTRACT_CANCELLED; -} - - -void InstallationManager::postInstallCleanup() -{ - m_ArchiveHandler->close(); - - // directories we may want to remove. sorted from longest to shortest to ensure we remove subdirectories first. - auto longestFirst = [](const QString &LHS, const QString &RHS) -> bool { - if (LHS.size() != RHS.size()) return LHS.size() > RHS.size(); - else return LHS < RHS; - }; - - std::set> directoriesToRemove(longestFirst); - - // clean up temp files - // TODO: this doesn't yet remove directories. Also, the files may be left there if this point isn't reached - for (const QString &tempFile : m_TempFilesToDelete) { - QFileInfo fileInfo(QDir::tempPath() + "/" + tempFile); - QFile::remove(fileInfo.absoluteFilePath()); - directoriesToRemove.insert(fileInfo.absolutePath()); - } - - m_TempFilesToDelete.clear(); - - // try to delete each directory we had temporary files in. the call fails for non-empty directories which is ok - for (const QString &dir : directoriesToRemove) { - QDir().rmdir(dir); - } -} - -bool InstallationManager::install(const QString &fileName, - GuessedValue &modName, - bool &hasIniTweaks) -{ - QFileInfo fileInfo(fileName); - if (m_SupportedExtensions.find(fileInfo.suffix()) == m_SupportedExtensions.end()) { - reportError(tr("File format \"%1\" not supported").arg(fileInfo.suffix())); - return false; - } - - modName.setFilter(&fixDirectoryName); - - modName.update(QFileInfo(fileName).completeBaseName(), GUESS_FALLBACK); - - // read out meta information from the download if available - QString gameName = ""; - int modID = 0; - QString version = ""; - QString newestVersion = ""; - int categoryID = 0; - QString repository = "Nexus"; - - QString metaName = fileName + ".meta"; - if (QFile(metaName).exists()) { - QSettings metaFile(metaName, QSettings::IniFormat); - gameName = metaFile.value("gameName", "").toString(); - modID = metaFile.value("modID", 0).toInt(); - QTextDocument doc; - doc.setHtml(metaFile.value("name", "").toString()); - modName.update(doc.toPlainText(), GUESS_FALLBACK); - modName.update(metaFile.value("modName", "").toString(), GUESS_META); - - version = metaFile.value("version", "").toString(); - newestVersion = metaFile.value("newestVersion", "").toString(); - unsigned int categoryIndex = CategoryFactory::instance().resolveNexusID( - metaFile.value("category", 0).toInt()); - categoryID = CategoryFactory::instance().getCategoryID(categoryIndex); - repository = metaFile.value("repository", "").toString(); - } - - if (version.isEmpty()) { - QDateTime lastMod = fileInfo.lastModified(); - version = "d" + lastMod.toString("yyyy.M.d"); - } - - { // guess the mod name and mod if from the file name if there was no meta information - QString guessedModName; - int guessedModID = modID; - NexusInterface::interpretNexusFileName(QFileInfo(fileName).fileName(), guessedModName, guessedModID, false); - if ((modID == 0) && (guessedModID != -1)) { - modID = guessedModID; - } else if (modID != guessedModID) { - qDebug("passed mod id: %d, guessed id: %d", modID, guessedModID); - } - - modName.update(guessedModName, GUESS_GOOD); - } - - m_CurrentFile = fileInfo.absoluteFilePath(); - if (fileInfo.dir() == QDir(m_DownloadsDirectory)) { - m_CurrentFile = fileInfo.fileName(); - } - qDebug("using mod name \"%s\" (id %d) -> %s", modName->toUtf8().constData(), modID, qPrintable(m_CurrentFile)); - - //If there's an archive already open, close it. This happens with the bundle - //installer when it uncompresses a split archive, then finds it has a real archive - //to deal with. - m_ArchiveHandler->close(); - - // open the archive and construct the directory tree the installers work on - bool archiveOpen = m_ArchiveHandler->open(fileName, - new MethodCallback(this, &InstallationManager::queryPassword)); - if (!archiveOpen) { - qDebug("integrated archiver can't open %s: %s (%d)", - qPrintable(fileName), - qPrintable(getErrorString(m_ArchiveHandler->getLastError())), - m_ArchiveHandler->getLastError()); - } - ON_BLOCK_EXIT(std::bind(&InstallationManager::postInstallCleanup, this)); - - QScopedPointer filesTree(archiveOpen ? createFilesTree() : nullptr); - IPluginInstaller::EInstallResult installResult = IPluginInstaller::RESULT_NOTATTEMPTED; - - std::sort(m_Installers.begin(), m_Installers.end(), [] (IPluginInstaller *LHS, IPluginInstaller *RHS) { - return LHS->priority() > RHS->priority(); - }); - - for (IPluginInstaller *installer : m_Installers) { - // don't use inactive installers (installer can't be null here but vc static code analysis thinks it could) - if ((installer == nullptr) || !installer->isActive()) { - continue; - } - - // try only manual installers if that was requested - if (installResult == IPluginInstaller::RESULT_MANUALREQUESTED) { - if (!installer->isManualInstaller()) { - continue; - } - } else if (installResult != IPluginInstaller::RESULT_NOTATTEMPTED) { - break; - } - - try { - { // simple case - IPluginInstallerSimple *installerSimple - = dynamic_cast(installer); - if ((installerSimple != nullptr) && (filesTree != nullptr) - && (installer->isArchiveSupported(*filesTree))) { - installResult - = installerSimple->install(modName, *filesTree, version, modID); - if (installResult == IPluginInstaller::RESULT_SUCCESS) { - mapToArchive(filesTree.data()); - // the simple installer only prepares the installation, the rest - // works the same for all installers - if (!doInstall(modName, gameName, modID, version, newestVersion, categoryID, - repository)) { - installResult = IPluginInstaller::RESULT_FAILED; - } - } - } - } - - { // custom case - IPluginInstallerCustom *installerCustom - = dynamic_cast(installer); - if ((installerCustom != nullptr) - && (((filesTree != nullptr) - && installer->isArchiveSupported(*filesTree)) - || ((filesTree == nullptr) - && installerCustom->isArchiveSupported(fileName)))) { - std::set installerExt - = installerCustom->supportedExtensions(); - if (installerExt.find(fileInfo.suffix()) != installerExt.end()) { - installResult - = installerCustom->install(modName, gameName, fileName, version, modID); - unsigned int idx = ModInfo::getIndex(modName); - if (idx != UINT_MAX) { - ModInfo::Ptr info = ModInfo::getByIndex(idx); - info->setRepository(repository); - } - } - } - } - } catch (const IncompatibilityException &e) { - qCritical("plugin \"%s\" incompatible: %s", - qPrintable(installer->name()), e.what()); - } - - // act upon the installation result. at this point the files have already been - // extracted to the correct location - switch (installResult) { - case IPluginInstaller::RESULT_CANCELED: - case IPluginInstaller::RESULT_FAILED: { - return false; - } break; - case IPluginInstaller::RESULT_SUCCESS: - case IPluginInstaller::RESULT_SUCCESSCANCEL: { - if (filesTree != nullptr) { - DirectoryTree::node_iterator iniTweakNode = filesTree->nodeFind(DirectoryTreeInformation("INI Tweaks")); - hasIniTweaks = (iniTweakNode != filesTree->nodesEnd()) && - ((*iniTweakNode)->numLeafs() != 0); - return true; - } else { - return false; - } - } break; - } - } - - reportError(tr("None of the available installer plugins were able to handle that archive.\n" - "This is likely due to a corrupted or incompatible download or unrecognized archive format.")); - return false; -} - - - -QString InstallationManager::getErrorString(Archive::Error errorCode) -{ - switch (errorCode) { - case Archive::ERROR_NONE: { - return tr("no error"); - } break; - case Archive::ERROR_LIBRARY_NOT_FOUND: { - return tr("7z.dll not found"); - } break; - case Archive::ERROR_LIBRARY_INVALID: { - return tr("7z.dll isn't valid"); - } break; - case Archive::ERROR_ARCHIVE_NOT_FOUND: { - return tr("archive not found"); - } break; - case Archive::ERROR_FAILED_TO_OPEN_ARCHIVE: { - return tr("failed to open archive"); - } break; - case Archive::ERROR_INVALID_ARCHIVE_FORMAT: { - return tr("unsupported archive type"); - } break; - case Archive::ERROR_LIBRARY_ERROR: { - return tr("internal library error"); - } break; - case Archive::ERROR_ARCHIVE_INVALID: { - return tr("archive invalid"); - } break; - default: { - // this probably means the archiver.dll is newer than this - return tr("unknown archive error"); - } break; - } -} - - -void InstallationManager::registerInstaller(IPluginInstaller *installer) -{ - m_Installers.push_back(installer); - installer->setInstallationManager(this); - IPluginInstallerCustom *installerCustom = dynamic_cast(installer); - if (installerCustom != nullptr) { - std::set extensions = installerCustom->supportedExtensions(); - m_SupportedExtensions.insert(extensions.begin(), extensions.end()); - } -} - -QStringList InstallationManager::getSupportedExtensions() const -{ - QStringList result; - foreach (const QString &extension, m_SupportedExtensions) { - result.append(extension); - } - return result; -} +/* +Copyright (C) 2012 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see . +*/ + +#include "installationmanager.h" + +#include "utility.h" +#include "report.h" +#include "categories.h" +#include "questionboxmemory.h" +#include "settings.h" +#include "queryoverwritedialog.h" +#include "messagedialog.h" +#include "iplugininstallersimple.h" +#include "iplugininstallercustom.h" +#include "nexusinterface.h" +#include "selectiondialog.h" +#include "modinfo.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + + +using namespace MOBase; +using namespace MOShared; + + +typedef Archive* (*CreateArchiveType)(); + + + +template +static T resolveFunction(QLibrary &lib, const char *name) +{ + T temp = reinterpret_cast(lib.resolve(name)); + if (temp == nullptr) { + throw std::runtime_error(QObject::tr("invalid 7-zip32.dll: %1") + .arg(lib.errorString()) + .toLatin1() + .constData()); + } + return temp; +} + +InstallationManager::InstallationManager() + : m_ParentWidget(nullptr), + m_SupportedExtensions({"zip", "rar", "7z", "fomod", "001"}) { + QLibrary archiveLib(QCoreApplication::applicationDirPath() + + "\\dlls\\archive.dll"); + if (!archiveLib.load()) { + throw MyException(QObject::tr("archive.dll not loaded: \"%1\"") + .arg(archiveLib.errorString())); + } + + CreateArchiveType CreateArchiveFunc + = resolveFunction(archiveLib, "CreateArchive"); + + m_ArchiveHandler = CreateArchiveFunc(); + if (!m_ArchiveHandler->isValid()) { + throw MyException(getErrorString(m_ArchiveHandler->getLastError())); + } +} + +InstallationManager::~InstallationManager() +{ + delete m_ArchiveHandler; +} + +void InstallationManager::setParentWidget(QWidget *widget) +{ + for (IPluginInstaller *installer : m_Installers) { + installer->setParentWidget(widget); + } +} + +void InstallationManager::setURL(QString const &url) +{ + m_URL = url; +} + +void InstallationManager::queryPassword(QString *password) +{ + *password = QInputDialog::getText(nullptr, tr("Password required"), + tr("Password"), QLineEdit::Password); +} + +void InstallationManager::mapToArchive(const DirectoryTree::Node *node, QString path, FileData * const *data) +{ + if (path.length() > 0) { + // when using a long windows path (starting with \\?\) we apparently can have redundant + // . components in the path. This wasn't a problem with "regular" path names. + if (path == ".") { + path.clear(); + } else { + path.append("\\"); + } + } + + for (DirectoryTree::const_leaf_iterator iter = node->leafsBegin(); iter != node->leafsEnd(); ++iter) { + data[iter->getIndex()]->addOutputFileName(path + iter->getName().toQString()); + } + + for (DirectoryTree::const_node_iterator iter = node->nodesBegin(); iter != node->nodesEnd(); ++iter) { + QString temp = path + (*iter)->getData().name.toQString(); + if ((*iter)->getData().index != -1) { + data[(*iter)->getData().index]->addOutputFileName(temp); + } + mapToArchive(*iter, temp, data); + } +} + + +void InstallationManager::mapToArchive(const DirectoryTree::Node *baseNode) +{ + FileData* const *data; + size_t size; + m_ArchiveHandler->getFileList(data, size); + + mapToArchive(baseNode, "", data); +} + + +bool InstallationManager::unpackSingleFile(const QString &fileName) +{ + FileData* const *data; + size_t size; + m_ArchiveHandler->getFileList(data, size); + + QString baseName = QFileInfo(fileName).fileName(); + + bool available = false; + for (size_t i = 0; i < size; ++i) { + if (data[i]->getFileName().compare(fileName, Qt::CaseInsensitive) == 0) { + available = true; + data[i]->addOutputFileName(baseName); + m_TempFilesToDelete.insert(baseName); + } + } + + if (!available) { + return false; + } + + m_InstallationProgress = new QProgressDialog(m_ParentWidget); + ON_BLOCK_EXIT([this] () { + m_InstallationProgress->hide(); + m_InstallationProgress->deleteLater(); + m_InstallationProgress = nullptr; + m_Progress = 0; + }); + m_InstallationProgress->setWindowFlags( + m_InstallationProgress->windowFlags() & ~Qt::WindowContextHelpButtonHint); + + m_InstallationProgress->setWindowTitle(tr("Extracting files")); + m_InstallationProgress->setWindowModality(Qt::WindowModal); + m_InstallationProgress->setFixedSize(600, 100); + m_InstallationProgress->show(); + + QFuture future = QtConcurrent::run([&]() -> bool { + return m_ArchiveHandler->extract( + QDir::tempPath(), + new MethodCallback(this, &InstallationManager::updateProgress), + nullptr, + new MethodCallback(this, &InstallationManager::report7ZipError) + ); + }); + do { + if (m_Progress != m_InstallationProgress->value()) + m_InstallationProgress->setValue(m_Progress); + QCoreApplication::processEvents(); + } while (!future.isFinished() || m_InstallationProgress->isVisible()); + bool res = future.result(); + + return res; +} + + +QString InstallationManager::extractFile(const QString &fileName) +{ + if (unpackSingleFile(fileName)) { + return QDir::tempPath() + "/" + QFileInfo(fileName).fileName(); + } else { + return QString(); + } +} + + +static QString canonicalize(const QString &name) +{ + QString result(name); + if ((result.startsWith('/')) || + (result.startsWith('\\'))) { + result.remove(0, 1); + } + result.replace('/', '\\'); + + return result; +} + + +QStringList InstallationManager::extractFiles(const QStringList &filesOrig, bool flatten) +{ + QStringList files; + + for (const QString &file : filesOrig) { + files.append(canonicalize(file)); + } + + QStringList result; + + FileData* const *data; + size_t size; + m_ArchiveHandler->getFileList(data, size); + + for (size_t i = 0; i < size; ++i) { + //FIXME Use qstring all the way through + if (files.contains(data[i]->getFileName(), Qt::CaseInsensitive)) { + std::wstring temp = data[i]->getFileName().toStdWString(); + wchar_t const * const origFile = temp.c_str(); + const wchar_t *targetFile = origFile; + //Note: I don't think 'flatten' is ever set to true. so this code + //might never be executed + if (flatten) { + targetFile = wcsrchr(origFile/*data[i]->getFileName()*/, '\\'); + if (targetFile == nullptr) { + targetFile = wcsrchr(origFile/*data[i]->getFileName()*/, '/'); + } + if (targetFile == nullptr) { + qCritical() << "Failed to find backslash in " << data[i]->getFileName(); + continue; + } else { + // skip the slash + ++targetFile; + } + } + data[i]->addOutputFileName(ToQString(targetFile)); + + result.append(QDir::tempPath().append("/").append(ToQString(targetFile))); + + m_TempFilesToDelete.insert(ToQString(targetFile)); + } + } + + m_InstallationProgress = new QProgressDialog(m_ParentWidget); + ON_BLOCK_EXIT([this] () { + m_InstallationProgress->hide(); + m_InstallationProgress->deleteLater(); + m_InstallationProgress = nullptr; + m_Progress = 0; + }); + m_InstallationProgress->setWindowFlags( + m_InstallationProgress->windowFlags() & (~Qt::WindowContextHelpButtonHint)); + m_InstallationProgress->setWindowTitle(tr("Extracting files")); + m_InstallationProgress->setWindowModality(Qt::WindowModal); + m_InstallationProgress->setFixedSize(600, 100); + m_InstallationProgress->show(); + + // unpack only the files we need for the installer + QFuture future = QtConcurrent::run([&]() -> bool { + return m_ArchiveHandler->extract( + QDir::tempPath(), + new MethodCallback(this, &InstallationManager::updateProgress), + nullptr, + new MethodCallback(this, &InstallationManager::report7ZipError) + ); + }); + do { + if (m_Progress != m_InstallationProgress->value()) + m_InstallationProgress->setValue(m_Progress); + QCoreApplication::processEvents(); + } while (!future.isFinished() || m_InstallationProgress->isVisible()); + if (!future.result()) { + throw MyException(QString("extracting failed (%1)").arg(m_ArchiveHandler->getLastError())); + } + + return result; +} + +IPluginInstaller::EInstallResult InstallationManager::installArchive(GuessedValue &modName, const QString &archiveName, const int &modId) +{ + // in earlier versions the modName was copied here and the copy passed to install. I don't know why I did this and it causes + // a problem if this is called by the bundle installer and the bundled installer adds additional names that then end up being used, + // because the caller will then not have the right name. + bool iniTweaks; + if (install(archiveName, modName, iniTweaks, modId)) { + return IPluginInstaller::RESULT_SUCCESS; + } else { + return IPluginInstaller::RESULT_FAILED; + } +} + + +DirectoryTree *InstallationManager::createFilesTree() +{ + FileData* const *data; + size_t size; + m_ArchiveHandler->getFileList(data, size); + + QScopedPointer result(new DirectoryTree); + + for (size_t i = 0; i < size; ++i) { + // the files are in a flat list where each file has a a full path relative to the archive root + // to create a tree, we have to iterate over each path component of each. This could be sped up by + // grouping the filenames first, but so far there doesn't seem to be an actual performance problem + DirectoryTree::Node *currentNode = result.data(); + + QString fileName = data[i]->getFileName(); + QStringList components = fileName.split("\\"); + + // iterate over all path-components of this filename (including the filename itself) + for (QStringList::iterator componentIter = components.begin(); componentIter != components.end(); ++componentIter) { + if (componentIter->size() == 0) { + // empty string indicates fileName is actually only a directory name and we have + // completely processed it already. + break; + } + + bool exists = false; + // test if this path is already in the tree + for (DirectoryTree::node_iterator nodeIter = currentNode->nodesBegin(); nodeIter != currentNode->nodesEnd(); ++nodeIter) { + if ((*nodeIter)->getData().name == *componentIter) { + currentNode = *nodeIter; + exists = true; + break; + } + } + + if (!exists) { + if (componentIter + 1 == components.end()) { + // last path component. directory or file? + if (data[i]->isDirectory()) { + // this is a bit problematic. archives will often only list directories if they are empty, + // otherwise the dir only appears in the path of a file. In the UI however we allow the user + // to uncheck all files in a directory while keeping the dir checked. Those directories are + // currently not installed. + DirectoryTree::Node *newNode = new DirectoryTree::Node; + newNode->setData( + DirectoryTreeInformation(*componentIter, static_cast(i))); + currentNode->addNode(newNode, false); + currentNode = newNode; + } else { + currentNode->addLeaf(FileTreeInformation(*componentIter, i)); + } + } else { + DirectoryTree::Node *newNode = new DirectoryTree::Node; + newNode->setData(DirectoryTreeInformation(*componentIter, -1)); + currentNode->addNode(newNode, false); + currentNode = newNode; + } + } + } + } + + return result.take(); +} + + +bool InstallationManager::isSimpleArchiveTopLayer(const DirectoryTree::Node *node, bool bainStyle) +{ + // see if there is at least one directory that makes sense on the top level + for (DirectoryTree::const_node_iterator iter = node->nodesBegin(); iter != node->nodesEnd(); ++iter) { + if ((bainStyle && InstallationTester::isTopLevelDirectoryBain((*iter)->getData().name)) || + (!bainStyle && InstallationTester::isTopLevelDirectory((*iter)->getData().name))) { + qDebug("%s on the top level", (*iter)->getData().name.toUtf8().constData()); + return true; + } + } + + // see if there is a file that makes sense on the top level + for (DirectoryTree::const_leaf_iterator iter = node->leafsBegin(); iter != node->leafsEnd(); ++iter) { + if (InstallationTester::isTopLevelSuffix(iter->getName())) { + return true; + } + } + return false; +} + + +DirectoryTree::Node *InstallationManager::getSimpleArchiveBase(DirectoryTree *dataTree) +{ + DirectoryTree::Node *currentNode = dataTree; + + while (true) { + if (isSimpleArchiveTopLayer(currentNode, false)) { + return currentNode; + } else if ((currentNode->numLeafs() == 0) && + (currentNode->numNodes() == 1)) { + currentNode = *currentNode->nodesBegin(); + } else { + qDebug("not a simple archive"); + return nullptr; + } + } +} + + +void InstallationManager::updateProgress(float percentage) +{ + if (m_InstallationProgress != nullptr) { + m_Progress = static_cast(percentage * 100.0); + + if (m_InstallationProgress->wasCanceled()) { + m_ArchiveHandler->cancel(); + m_InstallationProgress->reset(); + } + } +} + + +void InstallationManager::updateProgressFile(QString const &fileName) +{ + m_ProgressFile = fileName; +} + + +void InstallationManager::report7ZipError(QString const &errorMessage) +{ + reportError(errorMessage); + m_ArchiveHandler->cancel(); +} + + +QString InstallationManager::generateBackupName(const QString &directoryName) const +{ + QString backupName = directoryName + "_backup"; + if (QDir(backupName).exists()) { + int idx = 2; + QString temp = backupName + QString::number(idx); + while (QDir(temp).exists()) { + ++idx; + temp = backupName + QString::number(idx); + } + backupName = temp; + } + return backupName; +} + + +bool InstallationManager::testOverwrite(GuessedValue &modName, bool *merge) const +{ + QString targetDirectory = QDir::fromNativeSeparators(m_ModsDirectory + "\\" + modName); + while (QDir(targetDirectory).exists()) { + Settings &settings(Settings::instance()); + bool backup = settings.directInterface().value("backup_install", false).toBool(); + QueryOverwriteDialog overwriteDialog(m_ParentWidget, + backup ? QueryOverwriteDialog::BACKUP_YES : QueryOverwriteDialog::BACKUP_NO); + if (overwriteDialog.exec()) { + settings.directInterface().setValue("backup_install", overwriteDialog.backup()); + if (overwriteDialog.backup()) { + QString backupDirectory = generateBackupName(targetDirectory); + if (!copyDir(targetDirectory, backupDirectory, false)) { + reportError(tr("failed to create backup")); + return false; + } + } + if (merge != nullptr) { + *merge = (overwriteDialog.action() == QueryOverwriteDialog::ACT_MERGE); + } + if (overwriteDialog.action() == QueryOverwriteDialog::ACT_RENAME) { + bool ok = false; + QString name = QInputDialog::getText(m_ParentWidget, tr("Mod Name"), tr("Name"), + QLineEdit::Normal, modName, &ok); + if (ok && !name.isEmpty()) { + modName.update(name, GUESS_USER); + if (!ensureValidModName(modName)) { + return false; + } + targetDirectory = QDir::fromNativeSeparators(m_ModsDirectory) + "/" + modName; + } + } else if (overwriteDialog.action() == QueryOverwriteDialog::ACT_REPLACE) { + // save original settings like categories. Because it makes sense + QString metaFilename = targetDirectory + "/meta.ini"; + QFile settingsFile(metaFilename); + QByteArray originalSettings; + if (settingsFile.open(QIODevice::ReadOnly)) { + originalSettings = settingsFile.readAll(); + settingsFile.close(); + } + + // remove the directory with all content, then recreate it empty + shellDelete(QStringList(targetDirectory)); + if (!QDir().mkdir(targetDirectory)) { + // windows may keep the directory around for a moment, preventing its re-creation. Not sure + // if this still happens with shellDelete + Sleep(100); + QDir().mkdir(targetDirectory); + } + // restore the saved settings + if (settingsFile.open(QIODevice::WriteOnly)) { + settingsFile.write(originalSettings); + settingsFile.close(); + } else { + qCritical("failed to restore original settings: %s", metaFilename.toUtf8().constData()); + } + return true; + } else if (overwriteDialog.action() == QueryOverwriteDialog::ACT_MERGE) { + return true; + } + } else { + return false; + } + } + + QDir().mkdir(targetDirectory); + + return true; +} + + +bool InstallationManager::ensureValidModName(GuessedValue &name) const +{ + while (name->isEmpty()) { + bool ok; + name.update(QInputDialog::getText(m_ParentWidget, tr("Invalid name"), + tr("The name you entered is invalid, please enter a different one."), + QLineEdit::Normal, "", &ok), + GUESS_USER); + if (!ok) { + return false; + } + } + return true; +} + +bool InstallationManager::doInstall(GuessedValue &modName, QString gameName, int modID, + const QString &version, const QString &newestVersion, + int categoryID, const QString &repository) +{ + if (!ensureValidModName(modName)) { + return false; + } + + bool merge = false; + // determine target directory + if (!testOverwrite(modName, &merge)) { + return false; + } + + QString targetDirectory = QDir(m_ModsDirectory + "/" + modName).canonicalPath(); + QString targetDirectoryNative = QDir::toNativeSeparators(targetDirectory); + + qDebug("installing to \"%s\"", targetDirectoryNative.toUtf8().constData()); + + m_InstallationProgress = new QProgressDialog(m_ParentWidget); + ON_BLOCK_EXIT([this] () { + m_InstallationProgress->hide(); + m_InstallationProgress->deleteLater(); + m_InstallationProgress = nullptr; + m_Progress = 0; + m_ProgressFile = QString(); + }); + + m_InstallationProgress->setWindowFlags( + m_InstallationProgress->windowFlags() & (~Qt::WindowContextHelpButtonHint)); + m_InstallationProgress->setWindowModality(Qt::WindowModal); + m_InstallationProgress->setFixedSize(600, 100); + m_InstallationProgress->show(); + QFuture future = QtConcurrent::run([&]() -> bool { + return m_ArchiveHandler->extract( + targetDirectory, + new MethodCallback(this, &InstallationManager::updateProgress), + new MethodCallback(this, &InstallationManager::updateProgressFile), + new MethodCallback(this, &InstallationManager::report7ZipError) + ); + }); + do { + if (m_Progress != m_InstallationProgress->value()) + m_InstallationProgress->setValue(m_Progress); + if (m_ProgressFile != m_InstallationProgress->labelText()) + m_InstallationProgress->setLabelText(m_ProgressFile); + QCoreApplication::processEvents(); + } while (!future.isFinished()); + if (!future.result()) { + if (m_ArchiveHandler->getLastError() == Archive::ERROR_EXTRACT_CANCELLED) { + return false; + } else { + throw MyException(QString("extracting failed (%1)").arg(m_ArchiveHandler->getLastError())); + } + } + + QSettings settingsFile(targetDirectory + "/meta.ini", QSettings::IniFormat); + + // overwrite settings only if they are actually are available or haven't been set before + if ((gameName != "") || !settingsFile.contains("gameName")) { + settingsFile.setValue("gameName", gameName); + } + if ((modID != 0) || !settingsFile.contains("modid")) { + settingsFile.setValue("modid", modID); + } + if (!settingsFile.contains("version") || + (!version.isEmpty() && + (!merge || (VersionInfo(version) >= VersionInfo(settingsFile.value("version").toString()))))) { + settingsFile.setValue("version", version); + } + if (!newestVersion.isEmpty() || !settingsFile.contains("newestVersion")) { + settingsFile.setValue("newestVersion", newestVersion); + } + // issue #51 used to overwrite the manually set categories + if (!settingsFile.contains("category")) { + settingsFile.setValue("category", QString::number(categoryID)); + } + settingsFile.setValue("installationFile", m_CurrentFile); + settingsFile.setValue("repository", repository); + settingsFile.setValue("url", m_URL); + + if (!merge) { + // this does not clear the list we have in memory but the mod is going to have to be re-read anyway + // btw.: installedFiles were written with beginWriteArray but we can still clear it with beginGroup. nice + settingsFile.beginGroup("installedFiles"); + settingsFile.remove(""); + settingsFile.endGroup(); + } + + return true; +} + + +bool InstallationManager::wasCancelled() +{ + return m_ArchiveHandler->getLastError() == Archive::ERROR_EXTRACT_CANCELLED; +} + + +void InstallationManager::postInstallCleanup() +{ + m_ArchiveHandler->close(); + + // directories we may want to remove. sorted from longest to shortest to ensure we remove subdirectories first. + auto longestFirst = [](const QString &LHS, const QString &RHS) -> bool { + if (LHS.size() != RHS.size()) return LHS.size() > RHS.size(); + else return LHS < RHS; + }; + + std::set> directoriesToRemove(longestFirst); + + // clean up temp files + // TODO: this doesn't yet remove directories. Also, the files may be left there if this point isn't reached + for (const QString &tempFile : m_TempFilesToDelete) { + QFileInfo fileInfo(QDir::tempPath() + "/" + tempFile); + QFile::remove(fileInfo.absoluteFilePath()); + directoriesToRemove.insert(fileInfo.absolutePath()); + } + + m_TempFilesToDelete.clear(); + + // try to delete each directory we had temporary files in. the call fails for non-empty directories which is ok + for (const QString &dir : directoriesToRemove) { + QDir().rmdir(dir); + } +} + +bool InstallationManager::install(const QString &fileName, + GuessedValue &modName, + bool &hasIniTweaks, + int modID) +{ + QFileInfo fileInfo(fileName); + if (m_SupportedExtensions.find(fileInfo.suffix()) == m_SupportedExtensions.end()) { + reportError(tr("File format \"%1\" not supported").arg(fileInfo.suffix())); + return false; + } + + modName.setFilter(&fixDirectoryName); + + modName.update(QFileInfo(fileName).completeBaseName(), GUESS_FALLBACK); + + // read out meta information from the download if available + QString gameName = ""; + QString version = ""; + QString newestVersion = ""; + int categoryID = 0; + QString repository = "Nexus"; + + QString metaName = fileName + ".meta"; + if (QFile(metaName).exists()) { + QSettings metaFile(metaName, QSettings::IniFormat); + gameName = metaFile.value("gameName", "").toString(); + modID = metaFile.value("modID", 0).toInt(); + QTextDocument doc; + doc.setHtml(metaFile.value("name", "").toString()); + modName.update(doc.toPlainText(), GUESS_FALLBACK); + modName.update(metaFile.value("modName", "").toString(), GUESS_META); + + version = metaFile.value("version", "").toString(); + newestVersion = metaFile.value("newestVersion", "").toString(); + unsigned int categoryIndex = CategoryFactory::instance().resolveNexusID( + metaFile.value("category", 0).toInt()); + categoryID = CategoryFactory::instance().getCategoryID(categoryIndex); + repository = metaFile.value("repository", "").toString(); + } + + if (version.isEmpty()) { + QDateTime lastMod = fileInfo.lastModified(); + version = "d" + lastMod.toString("yyyy.M.d"); + } + + { // guess the mod name and mod if from the file name if there was no meta information + QString guessedModName; + int guessedModID = modID; + NexusInterface::interpretNexusFileName(QFileInfo(fileName).fileName(), guessedModName, guessedModID, false); + if ((modID == 0) && (guessedModID != -1)) { + modID = guessedModID; + } else if (modID != guessedModID) { + qDebug("passed mod id: %d, guessed id: %d", modID, guessedModID); + } + + modName.update(guessedModName, GUESS_GOOD); + } + + m_CurrentFile = fileInfo.absoluteFilePath(); + if (fileInfo.dir() == QDir(m_DownloadsDirectory)) { + m_CurrentFile = fileInfo.fileName(); + } + qDebug("using mod name \"%s\" (id %d) -> %s", modName->toUtf8().constData(), modID, qPrintable(m_CurrentFile)); + + //If there's an archive already open, close it. This happens with the bundle + //installer when it uncompresses a split archive, then finds it has a real archive + //to deal with. + m_ArchiveHandler->close(); + + // open the archive and construct the directory tree the installers work on + bool archiveOpen = m_ArchiveHandler->open(fileName, + new MethodCallback(this, &InstallationManager::queryPassword)); + if (!archiveOpen) { + qDebug("integrated archiver can't open %s: %s (%d)", + qPrintable(fileName), + qPrintable(getErrorString(m_ArchiveHandler->getLastError())), + m_ArchiveHandler->getLastError()); + } + ON_BLOCK_EXIT(std::bind(&InstallationManager::postInstallCleanup, this)); + + QScopedPointer filesTree(archiveOpen ? createFilesTree() : nullptr); + IPluginInstaller::EInstallResult installResult = IPluginInstaller::RESULT_NOTATTEMPTED; + + std::sort(m_Installers.begin(), m_Installers.end(), [] (IPluginInstaller *LHS, IPluginInstaller *RHS) { + return LHS->priority() > RHS->priority(); + }); + + for (IPluginInstaller *installer : m_Installers) { + // don't use inactive installers (installer can't be null here but vc static code analysis thinks it could) + if ((installer == nullptr) || !installer->isActive()) { + continue; + } + + // try only manual installers if that was requested + if (installResult == IPluginInstaller::RESULT_MANUALREQUESTED) { + if (!installer->isManualInstaller()) { + continue; + } + } else if (installResult != IPluginInstaller::RESULT_NOTATTEMPTED) { + break; + } + + try { + { // simple case + IPluginInstallerSimple *installerSimple + = dynamic_cast(installer); + if ((installerSimple != nullptr) && (filesTree != nullptr) + && (installer->isArchiveSupported(*filesTree))) { + installResult + = installerSimple->install(modName, *filesTree, version, modID); + if (installResult == IPluginInstaller::RESULT_SUCCESS) { + mapToArchive(filesTree.data()); + // the simple installer only prepares the installation, the rest + // works the same for all installers + if (!doInstall(modName, gameName, modID, version, newestVersion, categoryID, + repository)) { + installResult = IPluginInstaller::RESULT_FAILED; + } + } + } + } + + { // custom case + IPluginInstallerCustom *installerCustom + = dynamic_cast(installer); + if ((installerCustom != nullptr) + && (((filesTree != nullptr) + && installer->isArchiveSupported(*filesTree)) + || ((filesTree == nullptr) + && installerCustom->isArchiveSupported(fileName)))) { + std::set installerExt + = installerCustom->supportedExtensions(); + if (installerExt.find(fileInfo.suffix()) != installerExt.end()) { + installResult + = installerCustom->install(modName, gameName, fileName, version, modID); + unsigned int idx = ModInfo::getIndex(modName); + if (idx != UINT_MAX) { + ModInfo::Ptr info = ModInfo::getByIndex(idx); + info->setRepository(repository); + } + } + } + } + } catch (const IncompatibilityException &e) { + qCritical("plugin \"%s\" incompatible: %s", + qPrintable(installer->name()), e.what()); + } + + // act upon the installation result. at this point the files have already been + // extracted to the correct location + switch (installResult) { + case IPluginInstaller::RESULT_CANCELED: + case IPluginInstaller::RESULT_FAILED: { + return false; + } break; + case IPluginInstaller::RESULT_SUCCESS: + case IPluginInstaller::RESULT_SUCCESSCANCEL: { + if (filesTree != nullptr) { + DirectoryTree::node_iterator iniTweakNode = filesTree->nodeFind(DirectoryTreeInformation("INI Tweaks")); + hasIniTweaks = (iniTweakNode != filesTree->nodesEnd()) && + ((*iniTweakNode)->numLeafs() != 0); + return true; + } else { + return false; + } + } break; + } + } + + reportError(tr("None of the available installer plugins were able to handle that archive.\n" + "This is likely due to a corrupted or incompatible download or unrecognized archive format.")); + return false; +} + + + +QString InstallationManager::getErrorString(Archive::Error errorCode) +{ + switch (errorCode) { + case Archive::ERROR_NONE: { + return tr("no error"); + } break; + case Archive::ERROR_LIBRARY_NOT_FOUND: { + return tr("7z.dll not found"); + } break; + case Archive::ERROR_LIBRARY_INVALID: { + return tr("7z.dll isn't valid"); + } break; + case Archive::ERROR_ARCHIVE_NOT_FOUND: { + return tr("archive not found"); + } break; + case Archive::ERROR_FAILED_TO_OPEN_ARCHIVE: { + return tr("failed to open archive"); + } break; + case Archive::ERROR_INVALID_ARCHIVE_FORMAT: { + return tr("unsupported archive type"); + } break; + case Archive::ERROR_LIBRARY_ERROR: { + return tr("internal library error"); + } break; + case Archive::ERROR_ARCHIVE_INVALID: { + return tr("archive invalid"); + } break; + default: { + // this probably means the archiver.dll is newer than this + return tr("unknown archive error"); + } break; + } +} + + +void InstallationManager::registerInstaller(IPluginInstaller *installer) +{ + m_Installers.push_back(installer); + installer->setInstallationManager(this); + IPluginInstallerCustom *installerCustom = dynamic_cast(installer); + if (installerCustom != nullptr) { + std::set extensions = installerCustom->supportedExtensions(); + m_SupportedExtensions.insert(extensions.begin(), extensions.end()); + } +} + +QStringList InstallationManager::getSupportedExtensions() const +{ + QStringList result; + foreach (const QString &extension, m_SupportedExtensions) { + result.append(extension); + } + return result; +} diff --git a/src/installationmanager.h b/src/installationmanager.h index e66184d3..5160d137 100644 --- a/src/installationmanager.h +++ b/src/installationmanager.h @@ -1,226 +1,226 @@ -/* -Copyright (C) 2012 Sebastian Herbord. All rights reserved. - -This file is part of Mod Organizer. - -Mod Organizer is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Mod Organizer is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Mod Organizer. If not, see . -*/ - -#ifndef INSTALLATIONMANAGER_H -#define INSTALLATIONMANAGER_H - - -#include -#include -#include - -#include -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include - - -/** - * @brief manages the installation of mod archives - * This currently supports two special kind of archives: - * - "simple" archives: properly packaged archives without options, so they can be extracted to the (virtual) data directory directly - * - "complex" bain archives: archives with options for the bain system. - * All other archives are managed through the manual "InstallDialog" - * @todo this may be a good place to support plugins - **/ -class InstallationManager : public QObject, public MOBase::IInstallationManager -{ - Q_OBJECT - -public: - - /** - * @brief constructor - * - * @param parent parent object. - **/ - explicit InstallationManager(); - - virtual ~InstallationManager(); - - void setParentWidget(QWidget *widget); - - void setURL(const QString &url); - - /** - * @brief update the directory where mods are to be installed - * @param modsDirectory the mod directory - * @note this is called a lot, probably redundantly - */ - void setModsDirectory(const QString &modsDirectory) { m_ModsDirectory = modsDirectory; } - - /** - * @brief update the directory where downloads are stored - * @param downloadDirectory the download directory - */ - void setDownloadDirectory(const QString &downloadDirectory) { m_DownloadsDirectory = downloadDirectory; } - - /** - * @brief install a mod from an archive - * - * @param fileName absolute file name of the archive to install - * @param modName suggested name of the mod. If this is empty (the default), a name will be guessed based on the filename. The user will always have a chance to rename the mod - * @return true if the archive was installed, false if installation failed or was refused - * @exception std::exception an exception may be thrown if the archive can't be opened (maybe the format is invalid or the file is damaged) - **/ - bool install(const QString &fileName, MOBase::GuessedValue &modName, bool &hasIniTweaks); - - /** - * @return true if the installation was canceled - **/ - bool wasCancelled(); - - /** - * @brief retrieve a string describing the specified error code - * - * @param errorCode an error code as returned by the archiving function - * @return the error string - * @todo This function doesn't belong here, it is only public because the SelfUpdater class also uses "Archive" to get to the package.txt file - **/ - static QString getErrorString(Archive::Error errorCode); - - /** - * @brief register an installer-plugin - * @param the installer to register - */ - void registerInstaller(MOBase::IPluginInstaller *installer); - - /** - * @return list of file extensions we can install - */ - QStringList getSupportedExtensions() const; - - /** - * @brief extract the specified file from the currently open archive to a temporary location - * @param (relative) name of the file within the archive - * @return the absolute name of the temporary file - * @note the call will fail with an exception if no archive is open (plugins deriving - * from IPluginInstallerSimple can rely on that, custom installers shouldn't) - * @note the temporary file is automatically cleaned up after the installation - * @note This call can be very slow if the archive is large and "solid" - */ - virtual QString extractFile(const QString &fileName); - - /** - * @brief extract the specified files from the currently open archive to a temporary location - * @param (relative) names of files within the archive - * @return the absolute names of the temporary files - * @note the call will fail with an exception if no archive is open (plugins deriving - * from IPluginInstallerSimple can rely on that, custom installers shouldn't) - * @note the temporary file is automatically cleaned up after the installation - * @note This call can be very slow if the archive is large and "solid" - */ - virtual QStringList extractFiles(const QStringList &files, bool flatten); - - /** - * @brief installs an archive - * @param modName suggested name of the mod - * @param archiveFile path to the archive to install - * @return the installation result - */ - virtual MOBase::IPluginInstaller::EInstallResult installArchive(MOBase::GuessedValue &modName, const QString &archiveName); - - /** - * @brief test if the specified mod name is free. If not, query the user how to proceed - * @param modName current possible names for the mod - * @param merge if this value is not null, the value will be set to whether the use chose to merge or replace - * @return true if we can proceed with the installation, false if the user canceled or in case of an unrecoverable error - */ - virtual bool testOverwrite(MOBase::GuessedValue &modName, bool *merge = nullptr) const; - - QString generateBackupName(const QString &directoryName) const; - -private: - - void queryPassword(QString *password); - void updateProgress(float percentage); - void updateProgressFile(const QString &fileName); - void report7ZipError(const QString &errorMessage); - - MOBase::DirectoryTree *createFilesTree(); - - // remap all files in the archive to the directory structure represented by baseNode - // files not present in baseNode are disabled - void mapToArchive(const MOBase::DirectoryTree::Node *baseNode); - - // recursive worker function for mapToArchive - void mapToArchive(const MOBase::DirectoryTree::Node *node, QString path, FileData * const *data); - bool unpackSingleFile(const QString &fileName); - - - bool isSimpleArchiveTopLayer(const MOBase::DirectoryTree::Node *node, bool bainStyle); - MOBase::DirectoryTree::Node *getSimpleArchiveBase(MOBase::DirectoryTree *dataTree); - - bool doInstall(MOBase::GuessedValue &modName, QString gameName, - int modID, const QString &version, const QString &newestVersion, int categoryID, const QString &repository); - - //QString generateBackupName(const QString &directoryName) const; - - bool ensureValidModName(MOBase::GuessedValue &name) const; - - void postInstallCleanup(); - -signals: - - void progressUpdate(float percentage); - void progressUpdate(QString const fileName); - -private: - - struct ByPriority { - bool operator()(MOBase::IPluginInstaller *LHS, MOBase::IPluginInstaller *RHS) const - { - return LHS->priority() > RHS->priority(); - } - }; - - struct CaseInsensitive { - bool operator() (const QString &LHS, const QString &RHS) const - { - return QString::compare(LHS, RHS, Qt::CaseInsensitive) < 0; - } - }; - -private: - - QWidget *m_ParentWidget; - - QString m_ModsDirectory; - QString m_DownloadsDirectory; - - std::vector m_Installers; - std::set m_SupportedExtensions; - - Archive *m_ArchiveHandler; - QString m_CurrentFile; - - QProgressDialog *m_InstallationProgress { nullptr }; - int m_Progress; - QString m_ProgressFile; - - std::set m_TempFilesToDelete; - - QString m_URL; -}; - - -#endif // INSTALLATIONMANAGER_H +/* +Copyright (C) 2012 Sebastian Herbord. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see . +*/ + +#ifndef INSTALLATIONMANAGER_H +#define INSTALLATIONMANAGER_H + + +#include +#include +#include + +#include +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include + + +/** + * @brief manages the installation of mod archives + * This currently supports two special kind of archives: + * - "simple" archives: properly packaged archives without options, so they can be extracted to the (virtual) data directory directly + * - "complex" bain archives: archives with options for the bain system. + * All other archives are managed through the manual "InstallDialog" + * @todo this may be a good place to support plugins + **/ +class InstallationManager : public QObject, public MOBase::IInstallationManager +{ + Q_OBJECT + +public: + + /** + * @brief constructor + * + * @param parent parent object. + **/ + explicit InstallationManager(); + + virtual ~InstallationManager(); + + void setParentWidget(QWidget *widget); + + void setURL(const QString &url); + + /** + * @brief update the directory where mods are to be installed + * @param modsDirectory the mod directory + * @note this is called a lot, probably redundantly + */ + void setModsDirectory(const QString &modsDirectory) { m_ModsDirectory = modsDirectory; } + + /** + * @brief update the directory where downloads are stored + * @param downloadDirectory the download directory + */ + void setDownloadDirectory(const QString &downloadDirectory) { m_DownloadsDirectory = downloadDirectory; } + + /** + * @brief install a mod from an archive + * + * @param fileName absolute file name of the archive to install + * @param modName suggested name of the mod. If this is empty (the default), a name will be guessed based on the filename. The user will always have a chance to rename the mod + * @return true if the archive was installed, false if installation failed or was refused + * @exception std::exception an exception may be thrown if the archive can't be opened (maybe the format is invalid or the file is damaged) + **/ + bool install(const QString &fileName, MOBase::GuessedValue &modName, bool &hasIniTweaks, int modID = 0); + + /** + * @return true if the installation was canceled + **/ + bool wasCancelled(); + + /** + * @brief retrieve a string describing the specified error code + * + * @param errorCode an error code as returned by the archiving function + * @return the error string + * @todo This function doesn't belong here, it is only public because the SelfUpdater class also uses "Archive" to get to the package.txt file + **/ + static QString getErrorString(Archive::Error errorCode); + + /** + * @brief register an installer-plugin + * @param the installer to register + */ + void registerInstaller(MOBase::IPluginInstaller *installer); + + /** + * @return list of file extensions we can install + */ + QStringList getSupportedExtensions() const; + + /** + * @brief extract the specified file from the currently open archive to a temporary location + * @param (relative) name of the file within the archive + * @return the absolute name of the temporary file + * @note the call will fail with an exception if no archive is open (plugins deriving + * from IPluginInstallerSimple can rely on that, custom installers shouldn't) + * @note the temporary file is automatically cleaned up after the installation + * @note This call can be very slow if the archive is large and "solid" + */ + virtual QString extractFile(const QString &fileName); + + /** + * @brief extract the specified files from the currently open archive to a temporary location + * @param (relative) names of files within the archive + * @return the absolute names of the temporary files + * @note the call will fail with an exception if no archive is open (plugins deriving + * from IPluginInstallerSimple can rely on that, custom installers shouldn't) + * @note the temporary file is automatically cleaned up after the installation + * @note This call can be very slow if the archive is large and "solid" + */ + virtual QStringList extractFiles(const QStringList &files, bool flatten); + + /** + * @brief installs an archive + * @param modName suggested name of the mod + * @param archiveFile path to the archive to install + * @return the installation result + */ + virtual MOBase::IPluginInstaller::EInstallResult installArchive(MOBase::GuessedValue &modName, const QString &archiveName, const int &modId = 0); + + /** + * @brief test if the specified mod name is free. If not, query the user how to proceed + * @param modName current possible names for the mod + * @param merge if this value is not null, the value will be set to whether the use chose to merge or replace + * @return true if we can proceed with the installation, false if the user canceled or in case of an unrecoverable error + */ + virtual bool testOverwrite(MOBase::GuessedValue &modName, bool *merge = nullptr) const; + + QString generateBackupName(const QString &directoryName) const; + +private: + + void queryPassword(QString *password); + void updateProgress(float percentage); + void updateProgressFile(const QString &fileName); + void report7ZipError(const QString &errorMessage); + + MOBase::DirectoryTree *createFilesTree(); + + // remap all files in the archive to the directory structure represented by baseNode + // files not present in baseNode are disabled + void mapToArchive(const MOBase::DirectoryTree::Node *baseNode); + + // recursive worker function for mapToArchive + void mapToArchive(const MOBase::DirectoryTree::Node *node, QString path, FileData * const *data); + bool unpackSingleFile(const QString &fileName); + + + bool isSimpleArchiveTopLayer(const MOBase::DirectoryTree::Node *node, bool bainStyle); + MOBase::DirectoryTree::Node *getSimpleArchiveBase(MOBase::DirectoryTree *dataTree); + + bool doInstall(MOBase::GuessedValue &modName, QString gameName, + int modID, const QString &version, const QString &newestVersion, int categoryID, const QString &repository); + + //QString generateBackupName(const QString &directoryName) const; + + bool ensureValidModName(MOBase::GuessedValue &name) const; + + void postInstallCleanup(); + +signals: + + void progressUpdate(float percentage); + void progressUpdate(QString const fileName); + +private: + + struct ByPriority { + bool operator()(MOBase::IPluginInstaller *LHS, MOBase::IPluginInstaller *RHS) const + { + return LHS->priority() > RHS->priority(); + } + }; + + struct CaseInsensitive { + bool operator() (const QString &LHS, const QString &RHS) const + { + return QString::compare(LHS, RHS, Qt::CaseInsensitive) < 0; + } + }; + +private: + + QWidget *m_ParentWidget; + + QString m_ModsDirectory; + QString m_DownloadsDirectory; + + std::vector m_Installers; + std::set m_SupportedExtensions; + + Archive *m_ArchiveHandler; + QString m_CurrentFile; + + QProgressDialog *m_InstallationProgress { nullptr }; + int m_Progress; + QString m_ProgressFile; + + std::set m_TempFilesToDelete; + + QString m_URL; +}; + + +#endif // INSTALLATIONMANAGER_H -- cgit v1.3.1 From a3cb4001521fa4b29252ce6f9c652fb07b335bf4 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 15 Sep 2018 14:12:24 +0200 Subject: Store and load major dialogs geometry information. --- src/mainwindow.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- src/settings.cpp | 8 ++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 57988663..0a4ab912 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1906,10 +1906,16 @@ bool MainWindow::modifyExecutablesDialog() EditExecutablesDialog dialog(*m_OrganizerCore.executablesList(), *m_OrganizerCore.modList(), m_OrganizerCore.currentProfile()); + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QString key = QString("geometry/%1").arg(dialog.objectName()); + if (settings.contains(key)) { + dialog.restoreGeometry(settings.value(key).toByteArray()); + } if (dialog.exec() == QDialog::Accepted) { m_OrganizerCore.setExecutablesList(dialog.getExecutablesList()); result = true; } + settings.setValue(key, dialog.saveGeometry()); refreshExecutablesList(); } catch (const std::exception &e) { reportError(e.what()); @@ -1975,10 +1981,16 @@ void MainWindow::on_actionAdd_Profile_triggered() ProfilesDialog profilesDialog(m_OrganizerCore.currentProfile()->name(), m_OrganizerCore.managedGame(), this); + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QString key = QString("geometry/%1").arg(profilesDialog.objectName()); + if (settings.contains(key)) { + profilesDialog.restoreGeometry(settings.value(key).toByteArray()); + } // workaround: need to disable monitoring of the saves directory, otherwise the active // profile directory is locked stopMonitorSaves(); profilesDialog.exec(); + settings.setValue(key, profilesDialog.saveGeometry()); refreshSaveList(); // since the save list may now be outdated we have to refresh it completely if (refreshProfiles() && !profilesDialog.failed()) { break; @@ -2496,6 +2508,9 @@ void MainWindow::overwriteClosed(int) OverwriteInfoDialog *dialog = this->findChild("__overwriteDialog"); if (dialog != nullptr) { m_OrganizerCore.modList()->modInfoChanged(dialog->modInfo()); + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QString key = QString("geometry/%1").arg(dialog->objectName()); + settings.setValue(key, dialog->saveGeometry()); dialog->deleteLater(); } m_OrganizerCore.refreshDirectoryStructure(); @@ -2518,6 +2533,11 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, } else { qobject_cast(dialog)->setModInfo(modInfo); } + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QString key = QString("geometry/%1").arg(dialog->objectName()); + if (settings.contains(key)) { + dialog->restoreGeometry(settings.value(key).toByteArray()); + } dialog->show(); dialog->raise(); dialog->activateWindow(); @@ -2541,7 +2561,12 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, dialog.openTab(tab); } - dialog.restoreTabState(m_OrganizerCore.settings().directInterface().value("mod_info_tabs").toByteArray()); + dialog.restoreTabState(m_OrganizerCore.settings().directInterface().value("mod_info_tabs").toByteArray()); + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QString key = QString("geometry/%1").arg(dialog.objectName()); + if (settings.contains(key)) { + dialog.restoreGeometry(settings.value(key).toByteArray()); + } //If no tab was specified use the first tab from the left based on the user order. if (tab == -1) { @@ -2555,6 +2580,8 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, dialog.exec(); m_OrganizerCore.settings().directInterface().setValue("mod_info_tabs", dialog.saveTabState()); + settings.setValue(key, dialog.saveGeometry()); + modInfo->saveMeta(); emit modInfoDisplayed(); @@ -4285,7 +4312,13 @@ void MainWindow::previewDataFile() 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.")); } @@ -4746,9 +4779,16 @@ void MainWindow::on_displayCategoriesBtn_toggled(bool checked) void MainWindow::editCategories() { CategoriesDialog dialog(this); + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QString key = QString("geometry/%1").arg(dialog.objectName()); + if (settings.contains(key)) { + dialog.restoreGeometry(settings.value(key).toByteArray()); + } if (dialog.exec() == QDialog::Accepted) { dialog.commitChanges(); } + settings.setValue(key, dialog.saveGeometry()); + } void MainWindow::deselectFilters() diff --git a/src/settings.cpp b/src/settings.cpp index db4ea565..6ef43ace 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -604,6 +604,12 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent) tabs.push_back(std::unique_ptr(new PluginsTab(this, dialog))); tabs.push_back(std::unique_ptr(new WorkaroundsTab(this, dialog))); + + QString key = QString("geometry/%1").arg(dialog.objectName()); + if (m_Settings.contains(key)) { + dialog.restoreGeometry(m_Settings.value(key).toByteArray()); + } + if (dialog.exec() == QDialog::Accepted) { // remember settings before change QMap before; @@ -631,6 +637,8 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent) } m_Settings.endGroup(); } + m_Settings.setValue(key, dialog.saveGeometry()); + } Settings::SettingsTab::SettingsTab(Settings *m_parent, SettingsDialog &m_dialog) -- cgit v1.3.1 From 22a004be2ebca388866201c58bdd8e61f7fb2d2e Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 15 Sep 2018 19:18:29 +0200 Subject: Reverted default setting tab to General --- src/settingsdialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 374e1b84..05814091 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -17,7 +17,7 @@ - 1 + 0 -- cgit v1.3.1 From b1a3bdd6e8dba5df77f25b3813bcb73043b14bbc Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 16 Sep 2018 23:44:09 -0500 Subject: Automatically set CDN as a preferred server This also removes the (free) and (premium) labels from the servers as they aren't useful anymore. Premium users get premium speeds on all servers. Added (automatic) tag to the CDN server to indicate it will automatically pick servers based on geography. --- src/mainwindow.cpp | 2 +- src/settings.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 0a4ab912..04491c3e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4580,7 +4580,7 @@ void MainWindow::nxmDownloadURLs(QString, int, int, QVariant, QVariant resultDat info.name = serverInfo["Name"].toString(); info.premium = serverInfo["IsPremium"].toBool(); info.lastSeen = QDate::currentDate(); - info.preferred = 0; + info.preferred = !info.name.compare("CDN", Qt::CaseInsensitive); // other keys: ConnectedUsers, Country, URI servers.append(info); } diff --git a/src/settings.cpp b/src/settings.cpp index 6ef43ace..2dbca0eb 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -604,7 +604,7 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent) tabs.push_back(std::unique_ptr(new PluginsTab(this, dialog))); tabs.push_back(std::unique_ptr(new WorkaroundsTab(this, dialog))); - + QString key = QString("geometry/%1").arg(dialog.objectName()); if (m_Settings.contains(key)) { dialog.restoreGeometry(m_Settings.value(key).toByteArray()); @@ -838,9 +838,10 @@ Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog) m_Settings.beginGroup("Servers"); for (const QString &key : m_Settings.childKeys()) { QVariantMap val = m_Settings.value(key).toMap(); - QString type = val["premium"].toBool() ? "(premium)" : "(free)"; - - QString descriptor = key + " " + type; + QString descriptor = key; + if (!descriptor.compare("CDN", Qt::CaseInsensitive)) { + descriptor += QStringLiteral(" (automatic)"); + } if (val.contains("downloadSpeed") && val.contains("downloadCount") && (val["downloadCount"].toInt() > 0)) { int bps = static_cast(val["downloadSpeed"].toDouble() / val["downloadCount"].toInt()); descriptor += QString(" (%1 kbps)").arg(bps / 1024); -- cgit v1.3.1 From e2ec6632ec3d89e211326e0d27d032ec238b65bb Mon Sep 17 00:00:00 2001 From: Gaerzi Date: Tue, 25 Sep 2018 17:37:24 +0200 Subject: Extend version field to 12 characters This is needed because some mods out there have version strings longer than 10 characters. For example, the current version string of [SSE Engine Fixes (skse64 plugin)](https://www.nexusmods.com/skyrimspecialedition/mods/17230) is "2.12.1.5.50" -- 11 characters in total. 12 should hopefully be enough. --- src/modinfodialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index de9fe5ed..8455df78 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -682,7 +682,7 @@ p, li { white-space: pre-wrap; } - 10 + 12 -- cgit v1.3.1 From 192f14b001201d2d76fbbd12465dbe01623cf3fb Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 29 Sep 2018 12:10:41 +0200 Subject: Updated translations file --- src/organizer_en.ts | 459 +++++++++++++++++++++++++++------------------------- 1 file changed, 238 insertions(+), 221 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 09d1fe79..2490f390 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1386,7 +1386,7 @@ p, li { white-space: pre-wrap; } - + File format "%1" not supported @@ -1607,6 +1607,7 @@ p, li { white-space: pre-wrap; } + Create Backup @@ -1770,8 +1771,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1955,7 +1956,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1996,7 +1997,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2161,565 +2162,576 @@ Right now this has very limited functionality - + 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> - + + <Mod Backup> + + + + <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. - + + Failed to create backup. + + + + 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 - + Restore Backup - + Remove Backup... - + Change Categories - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2727,12 +2739,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2740,319 +2752,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 @@ -3110,36 +3122,41 @@ You can also use online editors and converters instead. - SkyProc Tools + Script Extender Files - MCM Data + SkyProc Tools - INI files + MCM Data + INI files + + + + ModGroup files - + invalid content type %1 - + invalid mod index %1 - + remove: invalid mod index %1 @@ -3775,12 +3792,12 @@ p, li { white-space: pre-wrap; } - + %1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory - + Categories: <br> @@ -4042,7 +4059,7 @@ p, li { white-space: pre-wrap; } ModListSortProxy - + Drag&Drop is only supported when sorting by priority @@ -5285,7 +5302,7 @@ If the folder was still in use, restart MO and try again. - + Mod Organizer @@ -5306,7 +5323,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> @@ -5362,27 +5379,27 @@ If the folder was still in use, restart MO and try again. - + Script Extender - + Proxy DLL - + failed to spawn "%1" - + Elevation required - + This process requires elevation to run. This is a potential security risk so I highly advice you to investigate if "%1" @@ -5392,7 +5409,7 @@ Start elevated anyway? (you will be asked if you want to allow ModOrganizer.exe - + failed to spawn "%1": %2 @@ -5587,12 +5604,12 @@ Select Show Details option to see the full change-log. - + Error - + Failed to create "%1", you may not have the necessary permission. path remains unchanged. -- cgit v1.3.1 From 15ab8d5c5e9b5a06ad61247aa81f4673a42595e6 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 29 Sep 2018 15:07:24 +0200 Subject: Changed "ignore missing game data" to not create an empty Texture folder and instead save the choice in meta.ini --- src/mainwindow.cpp | 6 ++++-- src/modinfo.h | 5 +++++ src/modinforegular.cpp | 16 +++++++++++++--- src/modinforegular.h | 7 +++++++ src/modlist.cpp | 4 +++- 5 files changed, 32 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 04491c3e..9d0c37c0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2684,16 +2684,18 @@ void MainWindow::ignoreMissingData_clicked() for (QModelIndex idx : selection->selectedRows()) { int row_idx = idx.data(Qt::UserRole + 1).toInt(); ModInfo::Ptr info = ModInfo::getByIndex(row_idx); - QDir(info->absolutePath()).mkdir("textures"); + //QDir(info->absolutePath()).mkdir("textures"); info->testValid(); + info->markValidated(true); connect(this, SIGNAL(modListDataChanged(QModelIndex, QModelIndex)), m_OrganizerCore.modList(), SIGNAL(dataChanged(QModelIndex, QModelIndex))); emit modListDataChanged(m_OrganizerCore.modList()->index(row_idx, 0), m_OrganizerCore.modList()->index(row_idx, m_OrganizerCore.modList()->columnCount() - 1)); } } else { ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); - QDir(info->absolutePath()).mkdir("textures"); + //QDir(info->absolutePath()).mkdir("textures"); info->testValid(); + info->markValidated(true); connect(this, SIGNAL(modListDataChanged(QModelIndex, QModelIndex)), m_OrganizerCore.modList(), SIGNAL(dataChanged(QModelIndex, QModelIndex))); emit modListDataChanged(m_OrganizerCore.modList()->index(m_ContextRow, 0), m_OrganizerCore.modList()->index(m_ContextRow, m_OrganizerCore.modList()->columnCount() - 1)); diff --git a/src/modinfo.h b/src/modinfo.h index 919d1a5b..895105df 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -577,6 +577,11 @@ public: */ virtual void markConverted(bool converted) {} + /** + * @brief updates the mod to flag it as valid in order to ignore the invalid game data flag + */ + virtual void markValidated(bool validated) {} + /** * @brief reads meta information from disk */ diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 1e77e050..1d84e2c8 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -31,6 +31,7 @@ ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, const IPluginGa , m_GameName(game->gameShortName()) , m_IsAlternate(false) , m_Converted(false) + , m_Validated(false) , m_MetaInfoChanged(false) , m_EndorsedState(ENDORSED_UNKNOWN) , m_NexusBridge(pluginContainer) @@ -86,6 +87,7 @@ void ModInfoRegular::readMeta() m_NexusDescription = metaFile.value("nexusDescription", "").toString(); m_Repository = metaFile.value("repository", "Nexus").toString(); m_Converted = metaFile.value("converted", false).toBool(); + m_Validated = metaFile.value("validated", false).toBool(); m_URL = metaFile.value("url", "").toString(); m_LastNexusQuery = QDateTime::fromString(metaFile.value("lastNexusQuery", "").toString(), Qt::ISODate); if (metaFile.contains("endorsed")) { @@ -150,6 +152,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("url", m_URL); metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); metaFile.setValue("converted", m_Converted); + metaFile.setValue("validated", m_Validated); if (m_EndorsedState != ENDORSED_UNKNOWN) { metaFile.setValue("endorsed", m_EndorsedState); } @@ -415,6 +418,13 @@ void ModInfoRegular::markConverted(bool converted) emit modDetailsUpdated(true); } +void ModInfoRegular::markValidated(bool validated) +{ + m_Validated = validated; + m_MetaInfoChanged = true; + saveMeta(); + emit modDetailsUpdated(true); +} QString ModInfoRegular::absolutePath() const { @@ -438,7 +448,7 @@ std::vector ModInfoRegular::getFlags() const if ((m_NexusID > 0) && (endorsedState() == ENDORSED_FALSE)) { result.push_back(ModInfo::FLAG_NOTENDORSED); } - if (!isValid()) { + if (!isValid() && !m_Validated) { result.push_back(ModInfo::FLAG_INVALID); } if (m_Notes.length() != 0) { @@ -514,7 +524,7 @@ std::vector ModInfoRegular::getContents() const int ModInfoRegular::getHighlight() const { - if (!isValid()) + if (!isValid() && !m_Validated) return HIGHLIGHT_INVALID; auto flags = getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_PLUGIN_SELECTED) != flags.end()) @@ -525,7 +535,7 @@ int ModInfoRegular::getHighlight() const QString ModInfoRegular::getDescription() const { - if (!isValid()) { + if (!isValid() && !m_Validated) { return tr("%1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory").arg(name()); } else { const std::set &categories = getCategories(); diff --git a/src/modinforegular.h b/src/modinforegular.h index 3abaded4..2f3eb941 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -28,6 +28,7 @@ public: bool isAlternate() { return m_IsAlternate; } bool isConverted() { return m_Converted; } + bool isValidated() { return m_Validated; } /** * @brief test if there is a newer version of the mod @@ -188,6 +189,11 @@ public: */ virtual void markConverted(bool converted) override; + /** + * @brief updates the mod to flag it as valid in order to ignore the invalid game data flag + */ + virtual void markValidated(bool validated) override; + /** * @brief getter for the mod name * @@ -358,6 +364,7 @@ private: bool m_MetaInfoChanged; bool m_IsAlternate; bool m_Converted; + bool m_Validated; MOBase::VersionInfo m_NewestVersion; MOBase::VersionInfo m_IgnoredVersion; diff --git a/src/modlist.cpp b/src/modlist.cpp index bcd087bc..c7f6a53b 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -768,6 +768,8 @@ IModList::ModStates ModList::state(unsigned int modIndex) const QSharedPointer modInfoRegular = modInfo.staticCast(); if (modInfoRegular->isAlternate() && !modInfoRegular->isConverted()) result |= IModList::STATE_ALTERNATE; + if (!modInfo->isValid() && modInfoRegular->isValidated()) + result |= IModList::STATE_VALID; } if (modInfo->canBeEnabled()) { if (m_Profile->modEnabled(modIndex)) { @@ -1263,4 +1265,4 @@ void ModList::disableSelected(const QItemSelectionModel *selectionModel) } } } -} \ No newline at end of file +} -- cgit v1.3.1 From 5a1d4e87835a00747fb20ea080bc5470e3bb1dc1 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 30 Sep 2018 15:51:04 -0500 Subject: Rename spacer to get remove warning --- src/modinfodialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 8455df78..e5be7b13 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -795,7 +795,7 @@ p, li { white-space: pre-wrap; } - + Qt::Horizontal -- cgit v1.3.1 From 2d50b172434945d168779029c55f4a51f290d515 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 30 Sep 2018 15:52:45 -0500 Subject: Fix pointer truncation to remove warning --- src/modinfodialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 12654755..fedddd6c 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -1080,7 +1080,7 @@ void ModInfoDialog::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)res <= 32) { + if ((unsigned long long)res <= 32) { qCritical("failed to invoke %s: %d", fileName.toUtf8().constData(), res); } } -- cgit v1.3.1 From b83807e4d5bd0f4218e7e5a1e7fc2d85e7e9f41e Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 30 Sep 2018 16:02:32 -0500 Subject: Set the web viewer widget in the mod info dialog to expand vertically --- src/modinfodialog.ui | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index e5be7b13..b3873bf3 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -238,8 +238,8 @@ 0 0 - 98 - 28 + 746 + 126 @@ -723,8 +723,20 @@ p, li { white-space: pre-wrap; } - - + + + + 0 + 0 + + + + + 0 + 200 + + + about:blank -- cgit v1.3.1 From 9c6c01df5674212da3be8e43a92c6b14b84787b6 Mon Sep 17 00:00:00 2001 From: Silarn Date: Mon, 1 Oct 2018 00:13:05 -0500 Subject: Update path to gamebryo/creation engine sources --- src/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 77ee4dfc..9ae193fe 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -288,7 +288,8 @@ INCLUDE_DIRECTORIES(${project_path}/uibase/src ${project_path}/esptk/src ${project_path}/archive/src ${project_path}/../usvfs/include - ${project_path}/game_gamebryo/src + ${project_path}/game_gamebryo/src/gamebryo + ${project_path}/game_gamebryo/src/creation ${project_path}/game_features/src ${project_path}/githubpp/src ${LZ4_ROOT}/include) -- cgit v1.3.1 From 9c35443780832d6876c63b42bcf216958f02068c Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 13 Oct 2018 10:42:12 +0200 Subject: Fixed UI file to not break each time it's opened in creator. --- src/mainwindow.cpp | 2 +- src/mainwindow.ui | 27 +-- src/organizer_en.ts | 522 ++++++++++++++++++++++++++-------------------------- 3 files changed, 278 insertions(+), 273 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9d0c37c0..04bd96c7 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -307,7 +307,7 @@ MainWindow::MainWindow(QSettings &initSettings ui->espList->setItemDelegateForColumn(PluginList::COL_FLAGS, new GenericIconDelegate(ui->espList)); ui->espList->installEventFilter(m_OrganizerCore.pluginList()); - ui->bsaList->setLocalMoveOnly(true); + //ui->bsaList->setLocalMoveOnly(true); bool pluginListAdjusted = registerWidgetState(ui->espList->objectName(), ui->espList->header(), "plugin_list_state"); registerWidgetState(ui->dataTree->objectName(), ui->dataTree->header()); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 75be7536..f271f817 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -826,7 +826,7 @@ p, li { white-space: pre-wrap; } - true + false Sort @@ -1042,7 +1042,7 @@ p, li { white-space: pre-wrap; } - + Qt::CustomContextMenu @@ -1058,21 +1058,26 @@ p, li { white-space: pre-wrap; } false - + false - + false - + 20 - + true - + 1 + + + Archives + + @@ -1218,7 +1223,7 @@ p, li { white-space: pre-wrap; } 2 - + Refresh downloads view @@ -1231,7 +1236,7 @@ p, li { white-space: pre-wrap; } - + @@ -1257,7 +1262,7 @@ p, li { white-space: pre-wrap; } Qt::ScrollBarAlwaysOn - Qt::ScrollBarAsNeeded + Qt::ScrollBarAsNeeded true @@ -1292,7 +1297,7 @@ p, li { white-space: pre-wrap; } 50 - + 15 diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 2490f390..9a7e0713 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1607,7 +1607,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1644,7 +1644,7 @@ p, li { white-space: pre-wrap; } - + Namefilter @@ -1754,61 +1754,61 @@ p, li { white-space: pre-wrap; } - + Data - + refresh data-directory overview - + Refresh the overview. This may take a moment. - - - - + + + + Refresh - + This is an overview of your data directory as visible to the game (and tools). - + File - + Mod - - + + Filter the above list so that only conflicts are displayed. - + Show only conflicts - + Saves - + <!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; } @@ -1819,160 +1819,160 @@ p, li { white-space: pre-wrap; } - + Downloads - + Refresh downloads view - + This is a list of mods you downloaded from Nexus. Double click one to install it. You can also drag an archive into here. - + Show Hidden - + Tool Bar - + Install Mod - + Install &Mod - + Install a new mod from an archive - + Ctrl+M - + Profiles - + &Profiles - + Configure Profiles - + Ctrl+P - + Executables - + &Executables - + Configure the executables that can be started through Mod Organizer - + Ctrl+E - - + + Tools - + &Tools - + Ctrl+I - + Settings - + &Settings - + Configure settings and workarounds - + Ctrl+S - + Nexus - + Search nexus network for more mods - + Ctrl+N - - + + Update - + Mod Organizer is up-to-date - + No Problems - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1980,39 +1980,39 @@ Right now this has very limited functionality - - + + Help - + Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Copy Log to Clipboard - + Change Game - + Open the Instance selection dialog to manage a different Game @@ -2268,16 +2268,16 @@ Right now this has very limited functionality - - + + failed to rename "%1" to "%2" - - - + + + Confirm @@ -2330,408 +2330,408 @@ Right now this has very limited functionality - + 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 - + Restore Backup - + Remove Backup... - + Change Categories - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2739,12 +2739,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2752,319 +2752,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 @@ -3426,37 +3426,37 @@ p, li { white-space: pre-wrap; } - + about:blank - + Endorse - + Notes - + Filetree - + Open Mod in Explorer - + A directory view of this mod - + <!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; } @@ -3466,17 +3466,17 @@ p, li { white-space: pre-wrap; } - + Previous - + Next - + Close @@ -3786,18 +3786,18 @@ p, li { white-space: pre-wrap; } ModInfoRegular - + failed to write %1/meta.ini: error %2 - + %1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory - + Categories: <br> @@ -3945,113 +3945,113 @@ p, li { white-space: pre-wrap; } - + 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><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table> - + Time this mod was installed @@ -5323,7 +5323,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> -- cgit v1.3.1 From cf52aa335aef6f9af587c3418360d0454e3b37bd Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 13 Oct 2018 11:47:10 +0200 Subject: Fix Creator setting Boss button to invisible each time --- src/mainwindow.ui | 3 --- 1 file changed, 3 deletions(-) (limited to 'src') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index f271f817..2c96775a 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -825,9 +825,6 @@ p, li { white-space: pre-wrap; } - - false - Sort -- cgit v1.3.1 From fcb29afe83be5789debbe1eacfd8be3e00d35637 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 13 Oct 2018 14:44:16 +0200 Subject: Increase filterview size to not cut off filternames --- src/mainwindow.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 2c96775a..021d564c 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -65,13 +65,13 @@ - 100 + 120 0 - 161 + 214 16777215 -- cgit v1.3.1 From 18e49b71b509a7a306d89392cc4486bb3c960e4f Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 27 Oct 2018 18:37:51 +0200 Subject: Added `uniformRowHeight = true` property to the modlist, data tab, filters view and Log area. It should make Qt perform better when showing a large number of items. --- src/mainwindow.ui | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 021d564c..41365768 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -84,6 +84,9 @@ 0 + + true + false @@ -432,6 +435,9 @@ p, li { white-space: pre-wrap; } 20 + + true + true @@ -1123,6 +1129,9 @@ p, li { white-space: pre-wrap; } This is an overview of your data directory as visible to the game (and tools). + + true + true @@ -1352,6 +1361,9 @@ p, li { white-space: pre-wrap; } QAbstractItemView::NoSelection + + true + false -- cgit v1.3.1 From 42d2344f0b81cb1cf8dbe83e8f480b84ed0c3114 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 02:16:20 +0200 Subject: Added modlist Separators feature: *New modType separator. *Bold, italic and centralized name without _separator at the end. *Added "create separator" option to context menu. *Added "rename separator" option. *Fixed rename separator issue with priority resetting. --- src/mainwindow.cpp | 42 +++++++++++++++++++++++--- src/mainwindow.h | 1 + src/modinfo.cpp | 8 +++-- src/modinfo.h | 3 +- src/modinfodialog.cpp | 17 ++++++++++- src/modinfoseparator.cpp | 36 ++++++++++++++++++++++ src/modinfoseparator.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ src/modlist.cpp | 29 ++++++++++++++++-- 8 files changed, 202 insertions(+), 11 deletions(-) create mode 100644 src/modinfoseparator.cpp create mode 100644 src/modinfoseparator.h (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 04bd96c7..bc25ab70 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2629,8 +2629,9 @@ void MainWindow::modOpenNext(int tab) ModInfo::Ptr mod = ModInfo::getByIndex(m_ContextRow); std::vector flags = mod->getFlags(); if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || - (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end())) { - // skip overwrite and backups + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end())) { + // skip overwrite and backups and separators modOpenNext(tab); } else { displayModInformation(m_ContextRow,tab); @@ -2649,8 +2650,9 @@ void MainWindow::modOpenPrev(int tab) ModInfo::Ptr mod = ModInfo::getByIndex(m_ContextRow); std::vector flags = mod->getFlags(); if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || - (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end())) { - // skip overwrite and backups + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end())) { + // skip overwrite and backups and separators modOpenPrev(tab); } else { displayModInformation(m_ContextRow,tab); @@ -2839,6 +2841,33 @@ void MainWindow::createEmptyMod_clicked() m_OrganizerCore.refreshModList(); } +void MainWindow::createSeparator_clicked() +{ + GuessedValue name; + name.setFilter(&fixDirectoryName); + while (name->isEmpty()) + { + bool ok; + name.update(QInputDialog::getText(this, tr("Create Separator..."), + tr("This will create a new separator.\n" + "Please enter a name:"), QLineEdit::Normal, "", &ok), + GUESS_USER); + if (!ok) { return; } + } + if (m_OrganizerCore.getMod(name) != nullptr) + { + reportError(tr("A separator with this name already exists")); + return; + } + name->append("_separator"); + if (m_OrganizerCore.getMod(name) != nullptr) + { + return; + } + if (m_OrganizerCore.createMod(name) == nullptr) { return; } + m_OrganizerCore.refreshModList(); +} + void MainWindow::createModFromOverwrite() { GuessedValue name; @@ -3579,6 +3608,8 @@ QMenu *MainWindow::modListContextMenu() menu->addAction(tr("Create empty mod"), this, SLOT(createEmptyMod_clicked())); + menu->addAction(tr("Create separator"), this, SLOT(createSeparator_clicked())); + menu->addSeparator(); menu->addAction(tr("Enable all visible"), this, SLOT(enableVisibleMods())); @@ -3623,6 +3654,9 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) } 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())); + } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()){ + menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); + menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { // nop, nothing to do with this mod } else { diff --git a/src/mainwindow.h b/src/mainwindow.h index 0bf3d3c8..78d374e6 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -404,6 +404,7 @@ private slots: // modlist context menu void installMod_clicked(); void createEmptyMod_clicked(); + void createSeparator_clicked(); void restoreBackup_clicked(); void renameMod_clicked(); void removeMod_clicked(); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 8ce40da3..4c41a114 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -23,6 +23,7 @@ along with Mod Organizer. If not, see . #include "modinforegular.h" #include "modinfoforeign.h" #include "modinfooverwrite.h" +#include "modinfoseparator.h" #include "installationtester.h" #include "categories.h" @@ -64,11 +65,14 @@ bool ModInfo::ByName(const ModInfo::Ptr &LHS, const ModInfo::Ptr &RHS) ModInfo::Ptr ModInfo::createFrom(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &dir, DirectoryEntry **directoryStructure) { QMutexLocker locker(&s_Mutex); -// int id = s_NextID++; + // int id = s_NextID++; static QRegExp backupExp(".*backup[0-9]*"); + static QRegExp separatorExp(".*_separator"); ModInfo::Ptr result; if (backupExp.exactMatch(dir.dirName())) { result = ModInfo::Ptr(new ModInfoBackup(pluginContainer, game, dir, directoryStructure)); + } else if(separatorExp.exactMatch(dir.dirName())){ + result = Ptr(new ModInfoSeparator(pluginContainer, game, dir, directoryStructure)); } else { result = ModInfo::Ptr(new ModInfoRegular(pluginContainer, game, dir, directoryStructure)); } @@ -418,4 +422,4 @@ void ModInfo::testValid() while (dirIter.hasNext()) { dirIter.next(); } -} \ No newline at end of file +} diff --git a/src/modinfo.h b/src/modinfo.h index 895105df..9f6c2fbc 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -62,6 +62,7 @@ public: enum EFlag { FLAG_INVALID, FLAG_BACKUP, + FLAG_SEPARATOR, FLAG_OVERWRITE, FLAG_FOREIGN, FLAG_NOTENDORSED, @@ -560,7 +561,7 @@ public: /** * @return true if this mod is considered "valid", that is: it contains data used by the game **/ - bool isValid() const { return m_Valid; } + virtual bool isValid() const { return m_Valid; } /** * @return true if the file has been endorsed on nexus diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index fedddd6c..54910e41 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -134,7 +134,22 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo refreshLists(); - if (unmanaged) { + if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR)) + { + ui->tabWidget->setTabEnabled(TAB_TEXTFILES, false); + ui->tabWidget->setTabEnabled(TAB_INIFILES, false); + ui->tabWidget->setTabEnabled(TAB_IMAGES, false); + ui->tabWidget->setTabEnabled(TAB_ESPS, false); + ui->tabWidget->setTabEnabled(TAB_CONFLICTS, false); + //ui->tabWidget->setTabEnabled(TAB_CATEGORIES, false); + addCategories(CategoryFactory::instance(), modInfo->getCategories(), ui->categoriesTree->invisibleRootItem(), 0); + refreshPrimaryCategoriesBox(); + ui->tabWidget->setTabEnabled(TAB_NEXUS, false); + //ui->tabWidget->setTabEnabled(TAB_NOTES, false); + ui->tabWidget->setTabEnabled(TAB_FILETREE, false); + } + else if (unmanaged) + { ui->tabWidget->setTabEnabled(TAB_INIFILES, false); ui->tabWidget->setTabEnabled(TAB_CATEGORIES, false); ui->tabWidget->setTabEnabled(TAB_NEXUS, false); diff --git a/src/modinfoseparator.cpp b/src/modinfoseparator.cpp new file mode 100644 index 00000000..60014f66 --- /dev/null +++ b/src/modinfoseparator.cpp @@ -0,0 +1,36 @@ +#include "modinfoseparator.h" + +bool ModInfoSeparator::setName(const QString& name) +{ + return ModInfoRegular::setName(name); +} + +std::vector ModInfoSeparator::getFlags() const +{ + { + auto result = ModInfoRegular::getFlags(); + result.insert(result.begin(), FLAG_SEPARATOR); + return result; + } +} + +int ModInfoSeparator::getHighlight() const +{ + return HIGHLIGHT_CENTER; +} + +QString ModInfoSeparator::getDescription() const +{ + return tr("This is a Separator"); +} + +QString ModInfoSeparator::name() const +{ + return ModInfoRegular::name(); +} + + +ModInfoSeparator::ModInfoSeparator(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure) + : ModInfoRegular(pluginContainer, game, path, directoryStructure) +{ +} diff --git a/src/modinfoseparator.h b/src/modinfoseparator.h new file mode 100644 index 00000000..f215fb17 --- /dev/null +++ b/src/modinfoseparator.h @@ -0,0 +1,77 @@ +#ifndef MODINFOSEPARATOR_H +#define MODINFOSEPARATOR_H + +#include "modinforegular.h" + +class ModInfoSeparator: + public ModInfoRegular +{ + friend class ModInfo; + +public: + + virtual bool updateAvailable() const { return false; } + virtual bool updateIgnored() const { return false; } + virtual bool downgradeAvailable() const { return false; } + virtual bool updateNXMInfo() { return false; } + virtual bool isValid() const { return true; } + //TODO: Fix renaming method to avoid priority reset + virtual bool setName(const QString& name); + + virtual int getNexusID() const { return -1; } + + virtual void setGameName(QString /*gameName*/) + { + } + + virtual void setNexusID(int /*modID*/) + { + } + + virtual void endorse(bool /*doEndorse*/) + { + } + + virtual void ignoreUpdate(bool /*ignore*/) + { + } + + virtual bool canBeUpdated() const { return false; } + virtual bool canBeEnabled() const { return false; } + virtual std::vector getIniTweaks() const { return std::vector(); } + + virtual std::vector getFlags() const; + virtual int getHighlight() const; + + virtual QString getDescription() const; + virtual QString name() const; + virtual QString getGameName() const { return ""; } + virtual QString getInstallationFile() const { return ""; } + virtual QString getURL() const { return ""; } + virtual QString repository() const { return ""; } + + virtual QDateTime getLastNexusQuery() const { return QDateTime(); } + virtual QDateTime creationTime() const { return QDateTime(); } + + virtual void getNexusFiles + ( + QList::const_iterator& /*unused*/, + QList::const_iterator& /*unused*/) + { + } + + virtual QString getNexusDescription() const { return QString(); } + + virtual void addInstalledFile(int /*modId*/, int /*fileId*/) + { + } + +private: + + ModInfoSeparator + ( + PluginContainer* pluginContainer, const MOBase::IPluginGame* game, const QDir& path, + MOShared::DirectoryEntry** directoryStructure); +}; + +#endif diff --git a/src/modlist.cpp b/src/modlist.cpp index c7f6a53b..31ef9ddc 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -45,6 +45,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include @@ -145,6 +146,7 @@ QString ModList::getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const { switch (flag) { case ModInfo::FLAG_BACKUP: return tr("Backup"); + case ModInfo::FLAG_SEPARATOR: return tr("Separator"); case ModInfo::FLAG_INVALID: return tr("No valid game data"); case ModInfo::FLAG_NOTENDORSED: return tr("Not endorsed yet"); case ModInfo::FLAG_NOTES: return QString("%1").arg(modInfo->notes().replace("\n", "
")); @@ -203,7 +205,13 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const || (column == COL_CONTENT)) { return QVariant(); } else if (column == COL_NAME) { - return modInfo->name(); + auto flags = modInfo->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + return modInfo->name().replace("_separator", ""); + } + else + return modInfo->name(); } else if (column == COL_VERSION) { VersionInfo verInfo = modInfo->getVersion(); QString version = verInfo.displayString(); @@ -277,6 +285,7 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } } else if (role == Qt::TextAlignmentRole) { + auto flags = modInfo->getFlags(); if (column == COL_NAME) { if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_CENTER) { return QVariant(Qt::AlignCenter | Qt::AlignVCenter); @@ -327,8 +336,15 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return modInfo->getGameName(); } else if (role == Qt::FontRole) { QFont result; + auto flags = modInfo->getFlags(); if (column == COL_NAME) { - if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_INVALID) { + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + //result.setCapitalization(QFont::AllUppercase); + result.setItalic(true); + //result.setUnderline(true); + result.setBold(true); + } else if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_INVALID) { result.setItalic(true); } } else if ((column == COL_CATEGORY) && (modInfo->hasFlag(ModInfo::FLAG_FOREIGN))) { @@ -476,6 +492,7 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role) ModInfo::Ptr info = ModInfo::getByIndex(modID); IModList::ModStates oldState = state(modID); + bool result = false; emit aboutToChangeData(); @@ -493,7 +510,13 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role) } else if (role == Qt::EditRole) { switch (index.column()) { case COL_NAME: { - result = renameMod(modID, value.toString()); + auto flags = info->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + result = renameMod(modID, value.toString() + "_separator"); + } + else + result = renameMod(modID, value.toString()); } break; case COL_PRIORITY: { bool ok = false; -- cgit v1.3.1 From dce6507dad1ff7d76a5c0497d516c79bacd08477 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 15:04:50 +0100 Subject: Added Color costumization for Separators. --- src/mainwindow.cpp | 28 +++++++++++++++++++++++++++- src/mainwindow.h | 1 + src/modinfo.h | 11 +++++++++++ src/modinforegular.cpp | 13 +++++++++++++ src/modinforegular.h | 7 +++++++ src/modlist.cpp | 6 +++++- 6 files changed, 64 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index bc25ab70..438ba037 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -154,6 +154,8 @@ along with Mod Organizer. If not, see . #include #include #include +#include +#include #include #include @@ -2868,6 +2870,26 @@ void MainWindow::createSeparator_clicked() m_OrganizerCore.refreshModList(); } +void MainWindow::setColor_clicked() +{ + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + QColor color = QColorDialog::getColor(modInfo->getColor(),this); + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + for (QModelIndex idx : selection->selectedRows()) { + ModInfo::Ptr info = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt()); + auto flags = info->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + info->setColor(color); + } + } + } + else { + modInfo->setColor(color); + } +} + void MainWindow::createModFromOverwrite() { GuessedValue name; @@ -3608,7 +3630,7 @@ QMenu *MainWindow::modListContextMenu() menu->addAction(tr("Create empty mod"), this, SLOT(createEmptyMod_clicked())); - menu->addAction(tr("Create separator"), this, SLOT(createSeparator_clicked())); + menu->addAction(tr("Create Separator"), this, SLOT(createSeparator_clicked())); menu->addSeparator(); @@ -3655,8 +3677,12 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked())); menu->addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()){ + menu->addSeparator(); menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); + menu->addSeparator(); + menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); + menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { // nop, nothing to do with this mod } else { diff --git a/src/mainwindow.h b/src/mainwindow.h index 78d374e6..02e368d7 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -408,6 +408,7 @@ private slots: void restoreBackup_clicked(); void renameMod_clicked(); void removeMod_clicked(); + void setColor_clicked(); void backupMod_clicked(); void reinstallMod_clicked(); void endorse_clicked(); diff --git a/src/modinfo.h b/src/modinfo.h index 9f6c2fbc..235fb50c 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -31,6 +31,7 @@ class QDir; #include #include #include +#include #include @@ -524,6 +525,16 @@ public: */ virtual QStringList archives() const = 0; + /* + *@return the color choosen by the user for the mod/separator + */ + virtual QColor getColor() { return QColor(); } + + /* + *@return true if the color has been set successfully. + */ + virtual void setColor(QColor color) { } + /** * @brief adds the information that a file has been installed into this mod * @param modId id of the mod installed diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 1d84e2c8..d0f56a52 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -90,6 +90,7 @@ void ModInfoRegular::readMeta() m_Validated = metaFile.value("validated", false).toBool(); m_URL = metaFile.value("url", "").toString(); m_LastNexusQuery = QDateTime::fromString(metaFile.value("lastNexusQuery", "").toString(), Qt::ISODate); + m_Color = metaFile.value("color",QColor()).value(); if (metaFile.contains("endorsed")) { if (metaFile.value("endorsed").canConvert()) { switch (metaFile.value("endorsed").toInt()) { @@ -153,6 +154,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); metaFile.setValue("converted", m_Converted); metaFile.setValue("validated", m_Validated); + metaFile.setValue("color", m_Color); if (m_EndorsedState != ENDORSED_UNKNOWN) { metaFile.setValue("endorsed", m_EndorsedState); } @@ -397,6 +399,17 @@ void ModInfoRegular::setNeverEndorse() } +void ModInfoRegular::setColor(QColor color) +{ + m_Color = color; + m_MetaInfoChanged = true; +} + +QColor ModInfoRegular::getColor() +{ + return m_Color; +} + bool ModInfoRegular::remove() { m_MetaInfoChanged = false; diff --git a/src/modinforegular.h b/src/modinforegular.h index 2f3eb941..78a6e58a 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -311,6 +311,10 @@ public: virtual QStringList archives() const; + virtual void setColor(QColor color); + + virtual QColor getColor(); + virtual void addInstalledFile(int modId, int fileId); /** @@ -355,9 +359,12 @@ private: QString m_URL; QString m_GameName; + QDateTime m_CreationTime; QDateTime m_LastNexusQuery; + QColor m_Color; + int m_NexusID; std::set> m_InstalledFileIDs; diff --git a/src/modlist.cpp b/src/modlist.cpp index 31ef9ddc..6caafeb2 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -383,12 +383,16 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } else if ((role == Qt::BackgroundRole) || (role == ViewMarkingScrollBar::DEFAULT_ROLE)) { + auto flags = modInfo->getFlags(); if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_PLUGIN) { return QColor(0, 0, 255, 64); } else if (m_Overwrite.find(modIndex) != m_Overwrite.end()) { return QColor(0, 255, 0, 64); - } else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) { + } + else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) { return QColor(255, 0, 0, 64); + } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end() && modInfo->getColor().isValid()) { + return modInfo->getColor(); } else { return QVariant(); } -- cgit v1.3.1 From 9e66799abf1e99cb507966e1780dd25fd7887df4 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 16:15:27 +0100 Subject: Fixed Separators not getting deleted while deleting multiple selected items. --- src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 438ba037..3b2dfbb2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2367,7 +2367,7 @@ void MainWindow::removeMod_clicked() continue; } mods += "
  • " + name + "
  • "; - modNames.append(name); + modNames.append(ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->name()); } if (QMessageBox::question(this, tr("Confirm"), tr("Remove the following mods?
      %1
    ").arg(mods), -- cgit v1.3.1 From ab95f78689e159722b79f991c7ef07c31cb3f958 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 17:27:34 +0100 Subject: Added Reset color option for separators and changed the bahavior of "cancel" of the color selector dialog to keep previous color. --- src/mainwindow.cpp | 26 +++++++++++++++++++++++++- src/mainwindow.h | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3b2dfbb2..74eecf06 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2873,7 +2873,29 @@ void MainWindow::createSeparator_clicked() void MainWindow::setColor_clicked() { ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); - QColor color = QColorDialog::getColor(modInfo->getColor(),this); + QColor color = QColorDialog::getColor(modInfo->getColor(), this); + if (!color.isValid()) + return; + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + for (QModelIndex idx : selection->selectedRows()) { + ModInfo::Ptr info = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt()); + auto flags = info->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + info->setColor(color); + } + } + } + else { + modInfo->setColor(color); + } +} + +void MainWindow::resetColor_clicked() +{ + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + QColor color = QColor(); QItemSelectionModel *selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { for (QModelIndex idx : selection->selectedRows()) { @@ -3682,6 +3704,8 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); + if(info->getColor().isValid()) + menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { // nop, nothing to do with this mod diff --git a/src/mainwindow.h b/src/mainwindow.h index 02e368d7..53db447a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -409,6 +409,7 @@ private slots: void renameMod_clicked(); void removeMod_clicked(); void setColor_clicked(); + void resetColor_clicked(); void backupMod_clicked(); void reinstallMod_clicked(); void endorse_clicked(); -- cgit v1.3.1 From 63a66c87546baeadb70f60184a96970efb00e56a Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 19:11:44 +0100 Subject: Added VS2015 and Skyrim Stylesheets, courtesy of chintsu! --- src/stylesheets/skyrim.qss | 635 +++++++++++++++++ src/stylesheets/skyrim/arrow-down.png | Bin 0 -> 218 bytes src/stylesheets/skyrim/arrow-left.png | Bin 0 -> 226 bytes src/stylesheets/skyrim/arrow-right.png | Bin 0 -> 217 bytes src/stylesheets/skyrim/arrow-up.png | Bin 0 -> 219 bytes src/stylesheets/skyrim/border-image.png | Bin 0 -> 1757 bytes src/stylesheets/skyrim/border-image1.png | Bin 0 -> 199 bytes src/stylesheets/skyrim/border-image2.png | Bin 0 -> 209 bytes src/stylesheets/skyrim/branch-opened.png | Bin 0 -> 233 bytes src/stylesheets/skyrim/button-big-border.png | Bin 0 -> 897 bytes src/stylesheets/skyrim/button-border.png | Bin 0 -> 833 bytes src/stylesheets/skyrim/button-checked-border.png | Bin 0 -> 874 bytes src/stylesheets/skyrim/checkbox-alt-checked.png | Bin 0 -> 354 bytes .../skyrim/checkbox-alt-unchecked-hover.png | Bin 0 -> 454 bytes src/stylesheets/skyrim/checkbox-alt-unchecked.png | Bin 0 -> 462 bytes .../skyrim/checkbox-checked-disabled.png | Bin 0 -> 804 bytes src/stylesheets/skyrim/checkbox-checked-hover.png | Bin 0 -> 810 bytes src/stylesheets/skyrim/checkbox-checked.png | Bin 0 -> 823 bytes src/stylesheets/skyrim/checkbox-disabled.png | Bin 0 -> 570 bytes src/stylesheets/skyrim/checkbox-hover.png | Bin 0 -> 581 bytes src/stylesheets/skyrim/checkbox.png | Bin 0 -> 590 bytes src/stylesheets/skyrim/context-menu-separator.png | Bin 0 -> 166 bytes src/stylesheets/skyrim/progress-bar-border.png | Bin 0 -> 1262 bytes src/stylesheets/skyrim/progress-bar-chunk.png | Bin 0 -> 164 bytes src/stylesheets/skyrim/radio-checked.png | Bin 0 -> 353 bytes src/stylesheets/skyrim/radio-hover.png | Bin 0 -> 489 bytes src/stylesheets/skyrim/radio.png | Bin 0 -> 513 bytes src/stylesheets/skyrim/scrollbar-down.png | Bin 0 -> 546 bytes src/stylesheets/skyrim/scrollbar-horizontal.png | Bin 0 -> 172 bytes src/stylesheets/skyrim/scrollbar-left.png | Bin 0 -> 543 bytes src/stylesheets/skyrim/scrollbar-right.png | Bin 0 -> 538 bytes src/stylesheets/skyrim/scrollbar-up.png | Bin 0 -> 547 bytes src/stylesheets/skyrim/scrollbar-vertical.png | Bin 0 -> 181 bytes src/stylesheets/skyrim/separator.png | Bin 0 -> 1355 bytes src/stylesheets/skyrim/slider-border.png | Bin 0 -> 725 bytes src/stylesheets/skyrim/slider-handle.png | Bin 0 -> 380 bytes src/stylesheets/vs15 Dark-Green.qss | 747 ++++++++++++++++++++ src/stylesheets/vs15 Dark-Orange.qss | 753 +++++++++++++++++++++ src/stylesheets/vs15 Dark-Purple.qss | 753 +++++++++++++++++++++ src/stylesheets/vs15 Dark-Red.qss | 753 +++++++++++++++++++++ src/stylesheets/vs15 Dark-Yellow.qss | 753 +++++++++++++++++++++ src/stylesheets/vs15 Dark.qss | 752 ++++++++++++++++++++ src/stylesheets/vs15/branch-closed.png | Bin 0 -> 193 bytes src/stylesheets/vs15/branch-open.png | Bin 0 -> 182 bytes src/stylesheets/vs15/checkbox-check-disabled.png | Bin 0 -> 218 bytes src/stylesheets/vs15/checkbox-check.png | Bin 0 -> 229 bytes src/stylesheets/vs15/combobox-down.png | Bin 0 -> 183 bytes src/stylesheets/vs15/scrollbar-down-disabled.png | Bin 0 -> 177 bytes src/stylesheets/vs15/scrollbar-down-hover.png | Bin 0 -> 177 bytes src/stylesheets/vs15/scrollbar-down.png | Bin 0 -> 190 bytes src/stylesheets/vs15/scrollbar-left-disabled.png | Bin 0 -> 175 bytes src/stylesheets/vs15/scrollbar-left-hover.png | Bin 0 -> 175 bytes src/stylesheets/vs15/scrollbar-left.png | Bin 0 -> 188 bytes src/stylesheets/vs15/scrollbar-right-disabled.png | Bin 0 -> 178 bytes src/stylesheets/vs15/scrollbar-right-hover.png | Bin 0 -> 179 bytes src/stylesheets/vs15/scrollbar-right.png | Bin 0 -> 192 bytes src/stylesheets/vs15/scrollbar-up-disabled.png | Bin 0 -> 174 bytes src/stylesheets/vs15/scrollbar-up-hover.png | Bin 0 -> 174 bytes src/stylesheets/vs15/scrollbar-up.png | Bin 0 -> 187 bytes src/stylesheets/vs15/sort-asc.png | Bin 0 -> 173 bytes src/stylesheets/vs15/sort-desc.png | Bin 0 -> 173 bytes src/stylesheets/vs15/spinner-down.png | Bin 0 -> 174 bytes src/stylesheets/vs15/spinner-up.png | Bin 0 -> 174 bytes src/stylesheets/vs15/sub-menu-arrow-hover.png | Bin 0 -> 172 bytes src/stylesheets/vs15/sub-menu-arrow.png | Bin 0 -> 186 bytes 65 files changed, 5146 insertions(+) create mode 100644 src/stylesheets/skyrim.qss create mode 100644 src/stylesheets/skyrim/arrow-down.png create mode 100644 src/stylesheets/skyrim/arrow-left.png create mode 100644 src/stylesheets/skyrim/arrow-right.png create mode 100644 src/stylesheets/skyrim/arrow-up.png create mode 100644 src/stylesheets/skyrim/border-image.png create mode 100644 src/stylesheets/skyrim/border-image1.png create mode 100644 src/stylesheets/skyrim/border-image2.png create mode 100644 src/stylesheets/skyrim/branch-opened.png create mode 100644 src/stylesheets/skyrim/button-big-border.png create mode 100644 src/stylesheets/skyrim/button-border.png create mode 100644 src/stylesheets/skyrim/button-checked-border.png create mode 100644 src/stylesheets/skyrim/checkbox-alt-checked.png create mode 100644 src/stylesheets/skyrim/checkbox-alt-unchecked-hover.png create mode 100644 src/stylesheets/skyrim/checkbox-alt-unchecked.png create mode 100644 src/stylesheets/skyrim/checkbox-checked-disabled.png create mode 100644 src/stylesheets/skyrim/checkbox-checked-hover.png create mode 100644 src/stylesheets/skyrim/checkbox-checked.png create mode 100644 src/stylesheets/skyrim/checkbox-disabled.png create mode 100644 src/stylesheets/skyrim/checkbox-hover.png create mode 100644 src/stylesheets/skyrim/checkbox.png create mode 100644 src/stylesheets/skyrim/context-menu-separator.png create mode 100644 src/stylesheets/skyrim/progress-bar-border.png create mode 100644 src/stylesheets/skyrim/progress-bar-chunk.png create mode 100644 src/stylesheets/skyrim/radio-checked.png create mode 100644 src/stylesheets/skyrim/radio-hover.png create mode 100644 src/stylesheets/skyrim/radio.png create mode 100644 src/stylesheets/skyrim/scrollbar-down.png create mode 100644 src/stylesheets/skyrim/scrollbar-horizontal.png create mode 100644 src/stylesheets/skyrim/scrollbar-left.png create mode 100644 src/stylesheets/skyrim/scrollbar-right.png create mode 100644 src/stylesheets/skyrim/scrollbar-up.png create mode 100644 src/stylesheets/skyrim/scrollbar-vertical.png create mode 100644 src/stylesheets/skyrim/separator.png create mode 100644 src/stylesheets/skyrim/slider-border.png create mode 100644 src/stylesheets/skyrim/slider-handle.png create mode 100644 src/stylesheets/vs15 Dark-Green.qss create mode 100644 src/stylesheets/vs15 Dark-Orange.qss create mode 100644 src/stylesheets/vs15 Dark-Purple.qss create mode 100644 src/stylesheets/vs15 Dark-Red.qss create mode 100644 src/stylesheets/vs15 Dark-Yellow.qss create mode 100644 src/stylesheets/vs15 Dark.qss create mode 100644 src/stylesheets/vs15/branch-closed.png create mode 100644 src/stylesheets/vs15/branch-open.png create mode 100644 src/stylesheets/vs15/checkbox-check-disabled.png create mode 100644 src/stylesheets/vs15/checkbox-check.png create mode 100644 src/stylesheets/vs15/combobox-down.png create mode 100644 src/stylesheets/vs15/scrollbar-down-disabled.png create mode 100644 src/stylesheets/vs15/scrollbar-down-hover.png create mode 100644 src/stylesheets/vs15/scrollbar-down.png create mode 100644 src/stylesheets/vs15/scrollbar-left-disabled.png create mode 100644 src/stylesheets/vs15/scrollbar-left-hover.png create mode 100644 src/stylesheets/vs15/scrollbar-left.png create mode 100644 src/stylesheets/vs15/scrollbar-right-disabled.png create mode 100644 src/stylesheets/vs15/scrollbar-right-hover.png create mode 100644 src/stylesheets/vs15/scrollbar-right.png create mode 100644 src/stylesheets/vs15/scrollbar-up-disabled.png create mode 100644 src/stylesheets/vs15/scrollbar-up-hover.png create mode 100644 src/stylesheets/vs15/scrollbar-up.png create mode 100644 src/stylesheets/vs15/sort-asc.png create mode 100644 src/stylesheets/vs15/sort-desc.png create mode 100644 src/stylesheets/vs15/spinner-down.png create mode 100644 src/stylesheets/vs15/spinner-up.png create mode 100644 src/stylesheets/vs15/sub-menu-arrow-hover.png create mode 100644 src/stylesheets/vs15/sub-menu-arrow.png (limited to 'src') diff --git a/src/stylesheets/skyrim.qss b/src/stylesheets/skyrim.qss new file mode 100644 index 00000000..727c70af --- /dev/null +++ b/src/stylesheets/skyrim.qss @@ -0,0 +1,635 @@ +/*!************************************* + Skyrim +**************************************** + Author: chintsu_kun + Version: 2.0.0 + Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) + Url: https://github.com/nikolay-borzov/modorganizer-themes +**************************************** +*/ +QWidget { + background-color: #000; + color: #F1F1F1; } + +/* Common */ +/* fix: fo some reason applying background-color or border fixes paddings properties */ +QListView::item, +QTreeView#espList::item, +QTreeWidget#categoriesList::item { + border-width: 0; } + +* { + /* remove outline */ + outline: 0; + /* text highlight */ + selection-background-color: #000; + selection-color: white; } + +/* disabled text */ +*:disabled, +QListView::item:disabled, +*::item:selected:disabled { + color: #656565; } + +/* line heights */ +QListView::item, +QTreeWidget::item, +QTreeView::item { + padding: .3em 0; } + +/* +QTreeView#modList::item, +QTreeWidget#categoriesTree::item, +#tabConflicts QTreeWidget::item, +QListView::item, +QTreeView#espList::item, +QTreeView#treeContent::item { + padding: .3em 0; +}*/ +QAbstractItemView { + color: #C0C0C0; + background-color: #000; + alternate-background-color: #000; + border-color: #A6A8AB; } + +QAbstractItemView, +QListView, +QTreeView { + show-decoration-selected: 1; } + +QAbstractItemView::item:hover, +QListView::item:hover, +QTreeView::branch:hover, +QTreeWidget::item:hover { + color: #fff; + background-color: #121212; } + +QAbstractItemView::item:disabled:hover, +QListView::item:disabled:hover, +QTreeView::branch:disabled:hover, +QTreeWidget::item:disabled:hover { + background-color: red; } + +QAbstractItemView::item:selected:disabled, +QListView::item:selected:disabled, +QTreeView::branch:selected:disabled, +QTreeWidget::item:selected:disabled { + background-color: #121212; } + +QAbstractItemView::item:selected { + background-color: #5F5F5E; + color: #fff; } + +/* Trees and Lists #QTreeView, #QListView*/ +QTreeView::branch:selected { + background-color: #5F5F5E; } + +QTreeView::branch:closed:has-children { + image: url(./skyrim/arrow-right.png); } + +QTreeView::branch:open:has-children { + image: url(./skyrim/branch-opened.png); } + +/*QListView::item:hover { } +QListView::item:selected { }*/ +QListView::item { + color: #C0C0C0; } + +/* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ +/* Common */ +QLabel { + background-color: transparent; } + QLabel#installLabel { + font-weight: bold; } + +/* Font size */ +QLabel, +QTextEdit, +QLineEdit, +QWebView, +QComboBox, +QComboBox:editable, +QAbstractSpinBox, +QGroupBox, +QCheckBox, +QRadioButton { + font-size: 14px; } + +QTextEdit, +QLineEdit, +QWebView, +QComboBox, +QComboBox:editable, +QAbstractSpinBox { + border: none; + background-color: #141414; } + QTextEdit:hover, QTextEdit:focus, + QLineEdit:hover, + QLineEdit:focus, + QWebView:hover, + QWebView:focus, + QComboBox:hover, + QComboBox:focus, + QComboBox:editable:hover, + QComboBox:editable:focus, + QAbstractSpinBox:hover, + QAbstractSpinBox:focus { + background-color: #212121; } + +QLineEdit, +QAbstractSpinBox { + min-height: 24px; + padding: 2px; + border: none; } + +QLineEdit { + margin-top: 0; + /* clear button */ + /* increase version textfield width */ + /* fix margins on tabs pane */ } + QLineEdit QToolButton, + QLineEdit QToolButton:hover { + background: none; + margin-top: 1px; } + QLineEdit#espFilterEdit QToolButton { + margin-top: -2px; + margin-bottom: 1px; } + QLineEdit#modFilterEdit { + margin-top: 2px; } + QLineEdit#versionEdit { + max-width: 90px; } + QLineEdit#espFilterEdit { + margin: 0 0 6px 0; } + QLineEdit#downloadView { + margin: 4px 4px 0 4px; } + QLineEdit#showHiddenBox { + margin: 0 0 4px 4px; } + QLineEdit#downloadFilterEdit { + margin: 0 4px 4px 0; } + +/* Dropdowns #QComboBox*/ +QComboBox { + min-height: 20px; + padding-left: 5px; + margin: 3px 0 1px 0; + border-style: solid; } + QComboBox, QComboBox:editable { + border-width: 5px; + border-color: transparent; + border-image: url(./skyrim/border-image1.png) 6 repeat repeat; } + QComboBox:on { + background-color: #212121; } + QComboBox:editable { + padding-left: 3px; } + QComboBox::drop-down { + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; } + QComboBox::down-arrow { + image: url(./skyrim/arrow-down.png); } + QComboBox QAbstractItemView { + background-color: #000; + selection-background-color: #212121; } + +/* Toolbar */ +QToolBar { + border: none; } + QToolBar::separator { + image: url(./skyrim/separator.png); } + +QToolButton { + margin: 0 4px 0 4px; + padding: 5px; + /* need this to make background-color works*/ + border: none; + /* scrollers */ } + QToolButton:hover, QToolButton:focus { + background-color: #121212; } + QToolButton:pressed { + background-color: #5F5F5E; } + QToolButton::menu-indicator { + image: url(./skyrim/arrow-down.png); + margin: 0 4px 4px 0; } + QToolButton::menu-indicator:pressed, QToolButton::menu-indicator:open { + image: url(./skyrim/arrow-right.png); } + QTabBar QToolButton { + background-color: #000; + padding: 1px; + margin: 0; } + QTabBar QToolButton::right-arrow { + image: url(./skyrim/arrow-right.png); } + QTabBar QToolButton::left-arrow { + image: url(./skyrim/arrow-left.png); } + +/* Group Boxes #QGroupBox */ +QGroupBox { + padding: 1em .3em .3em .3em; + margin-top: .65em; + border-width: 5px; + border-color: transparent; + border-image: url(./skyrim/border-image2.png) 5 repeat repeat; } + QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 5px; + left: 10px; } + +/* LCD Count */ +QLCDNumber { + border-color: #A6A8AB; + border-style: solid; + border-width: 1px; } + +/* Buttons #QPushButton */ +QPushButton { + min-height: 18px; + padding: 2px 5px; + border-style: solid; + background-color: transparent; + border-width: 0 15px 0 15px; + border-color: transparent; + /*&:focus { }*/ + /* dialog buttons */ + /* show categories */ + /* run */ + /* unlock */ + /* mod info dialog images tab */ + /* add some space between buttons */ } + QPushButton:hover, QPushButton:checked:hover { + border-image: url(./skyrim/button-border.png) 0 15 repeat; } + QPushButton:checked { + border-image: url(./skyrim/button-checked-border.png) 0 15 repeat; } + QPushButton:disabled { + color: #656565; } + QPushButton::menu-indicator { + image: url(./skyrim/arrow-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; } + QDialog QPushButton { + font-weight: bold; + font-size: 15px; + min-width: 1.5em; + padding-left: .5em; + padding-right: .5em; } + QPushButton#displayCategoriesBtn { + min-width: 20px; } + QPushButton#startButton:hover { + border-image: url(./skyrim/button-big-border.png) 0 15 repeat; } + QPushButton#startButton:checked { + border-image: url(./skyrim/button-big-border.png) 0 15 repeat; } + QPushButton#unlockButton { + margin: 10px 20px; } + QPushButton + QPushButton { + margin: 10px 0 0 0; } + QWidget#tabImages QPushButton { + background-color: transparent; + border: none; + margin: 0 .3em; + padding: 0; } + QWidget#tabImages QPushButton:hover { + background-color: #121212; } + QDialog#QueryOverwriteDialog QPushButton { + margin-left: 0.5em; } + #ProfilesDialog QPushButton { + margin-bottom: 0.5em; } + #ProfilesDialog QPushButton#closeButton { + margin-bottom: 0; } + #EditExecutablesDialog QPushButton#addButton, + #EditExecutablesDialog QPushButton#removeButton { + margin-bottom: 0.5em; + margin-top: 1em; } + +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/*common*/ +QGroupBox::indicator, +QTreeView::indicator, +QCheckBox::indicator { + background-color: transparent; + border: none; + width: 20px; + height: 20px; } + QGroupBox::indicator:checked, QGroupBox::indicator:indeterminate, + QTreeView::indicator:checked, + QTreeView::indicator:indeterminate, + QCheckBox::indicator:checked, + QCheckBox::indicator:indeterminate { + image: url(./skyrim/checkbox-checked.png); } + QGroupBox::indicator:checked:hover, QGroupBox::indicator:indeterminate:hover, + QTreeView::indicator:checked:hover, + QTreeView::indicator:indeterminate:hover, + QCheckBox::indicator:checked:hover, + QCheckBox::indicator:indeterminate:hover { + image: url(./skyrim/checkbox-checked-hover.png); } + QGroupBox::indicator:checked:disabled, QGroupBox::indicator:indeterminate:disabled, + QTreeView::indicator:checked:disabled, + QTreeView::indicator:indeterminate:disabled, + QCheckBox::indicator:checked:disabled, + QCheckBox::indicator:indeterminate:disabled { + image: url(./skyrim/checkbox-checked-disabled.png); } + QGroupBox::indicator:unchecked, + QTreeView::indicator:unchecked, + QCheckBox::indicator:unchecked { + image: url(./skyrim/checkbox.png); } + QGroupBox::indicator:unchecked:hover, + QTreeView::indicator:unchecked:hover, + QCheckBox::indicator:unchecked:hover { + image: url(./skyrim/checkbox-hover.png); } + QGroupBox::indicator:unchecked:disabled, + QTreeView::indicator:unchecked:disabled, + QCheckBox::indicator:unchecked:disabled { + image: url(./skyrim/checkbox-disabled.png); } + +/* Checkboxes special */ +QTreeWidget#bsaList::indicator { + width: 10px; + height: 15px; } + QTreeWidget#bsaList::indicator:checked { + image: url(./skyrim/checkbox-alt-checked.png); } + QTreeWidget#bsaList::indicator:unchecked { + image: url(./skyrim/checkbox-alt-unchecked.png); } + QTreeWidget#bsaList::indicator:unchecked:hover { + image: url(./skyrim/checkbox-alt-unchecked-hover.png); } + +/* Radio buttons #QRadioButton */ +QRadioButton::indicator { + width: 16px; + height: 16px; } + QRadioButton::indicator::checked { + image: url(./skyrim/radio-checked.png); } + QRadioButton::indicator::unchecked { + image: url(./skyrim/radio.png); } + QRadioButton::indicator::unchecked:hover { + image: url(./skyrim/radio-hover.png); } + +/* Spinners #QSpinBox, #QDoubleSpinBox */ +QAbstractSpinBox { + margin: 1px; } + QAbstractSpinBox::up-button, QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; } + QAbstractSpinBox::up-button:hover, QAbstractSpinBox::down-button:hover { + background-color: #141414; } + QAbstractSpinBox::up-button { + subcontrol-position: top right; } + QAbstractSpinBox::down-button { + subcontrol-position: bottom right; } + QAbstractSpinBox::up-arrow { + image: url(./skyrim/arrow-up.png); } + QAbstractSpinBox::down-arrow { + image: url(./skyrim/arrow-down.png); } + +/* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ +/* assigning background still leaves not filled area*/ +QAbstractScrollArea::corner { + background-color: transparent; } + +QScrollBar { + background-color: transparent; + border: none; } + QScrollBar:horizontal { + height: 12px; + border: none; + margin: 0 17px 0 17px; } + QScrollBar:vertical { + width: 12px; + border: none; + margin: 17px 0 17px 0; } + QScrollBar::handle { + border: 1px solid rgba(243, 243, 243, 0.88); + background-color: rgba(255, 255, 255, 0.6); } + QScrollBar::handle:horizontal { + min-width: 32px; + margin: 1px 0 1px 0; } + QScrollBar::handle:vertical { + min-height: 32px; + margin: 0 1px 0 1px; } + QScrollBar::add-line, QScrollBar::sub-line { + background-color: transparent; + border: none; + subcontrol-origin: margin; } + QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { + width: 17px; } + QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { + height: 17px; } + QScrollBar::add-line:horizontal { + subcontrol-position: right; } + QScrollBar::add-line:vertical { + subcontrol-position: bottom; } + QScrollBar::sub-line:horizontal { + subcontrol-position: left; } + QScrollBar::sub-line:vertical { + subcontrol-position: top; } + QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: url(./skyrim/scrollbar-horizontal.png) center center repeat-x; } + QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: url(./skyrim/scrollbar-vertical.png) center center repeat-y; } + QScrollBar::up-arrow:vertical { + image: url(./skyrim/scrollbar-up.png); } + QScrollBar::down-arrow:vertical { + image: url(./skyrim/scrollbar-down.png); } + QScrollBar::right-arrow:horizontal { + image: url(./skyrim/scrollbar-right.png); } + QScrollBar::left-arrow:horizontal { + image: url(./skyrim/scrollbar-left.png); } + +/* Scroll Area #QScrollArea*/ +QScrollArea { + border-color: transparent; + border-style: solid; + border-width: 1px; } + +/* Sliders #QSlider */ +QSlider::groove:horizontal { + background: url(./skyrim/scrollbar-horizontal.png) repeat-x; + border-style: solid; + border-width: 0 17px; + border-color: transparent; + height: 12px; + margin: 0; + border-image: url(./skyrim/slider-border.png) 0 17 round; } + +QSlider::handle:horizontal { + background: url(./skyrim/slider-handle.png); + width: 18px; + height: 20px; + margin: -4px 0; + subcontrol-origin: margin; } + +/* Header Rows and Tables (Configure Mod Categories) #QTableView, #QHeaderView */ +QTableView { + gridline-color: transparent; + selection-background-color: #5F5F5E; + selection-color: #C0C0C0; } + QTableView QTableCornerButton::section { + background-color: transparent; + border-color: #A6A8AB; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView { + border: none; } + QHeaderView::section { + background-color: transparent; + border-color: #A6A8AB; + /* 17px to have some place for sort indicator */ + padding: 3px 17px 3px 5px; + border-style: solid; } + QHeaderView::section:horizontal { + border-width: 0 0 1px 0; } + QHeaderView::section:vertical { + border-width: 0 1px 0 0; } + QHeaderView::section:hover { + background: #121212; + color: #fff; } + QHeaderView::up-arrow, QHeaderView::down-arrow { + subcontrol-origin: content; + subcontrol-position: center right; + width: 7px; + height: 7px; + margin-right: 7px; } + QHeaderView::up-arrow { + image: url(./skyrim/arrow-up.png); } + QHeaderView::down-arrow { + image: url(./skyrim/arrow-down.png); } + +/* Context menus, toolbar dropdowns #QMenu */ +QMenu { + background-color: transparent; + border-width: 17px; + border-style: solid; + border-color: transparent; + border-image: url(./skyrim/border-image.png) 27 repeat repeat; } + QMenu::item, + QMenu QPushButton { + padding: 6px 20px; } + QMenu::item:selected { + background-color: #121212; } + QMenu::item:disabled { + background-color: transparent; } + QMenu::separator { + height: 3px; + margin: 1px 0; + background: url(./skyrim/context-menu-separator.png) repear-x; } + QMenu::icon { + margin: 1px; } + QMenu::right-arrow { + image: url(./skyrim/arrow-right.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: .5em; } + QMenu QPushButton { + /* cancel styles */ + border: none; + text-align: left; } + QMenu QPushButton:hover { + background-color: #121212; } + QMenu QCheckBox, + QMenu QRadioButton { + background-color: transparent; + padding: 5px 2px; } + +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +QToolTip { + background-color: transparent; + color: #C0C0C0; + padding: 0; + border-width: 17px; + border-style: solid; + border-color: transparent; + border-image: url(./skyrim/border-image.png) 27 repeat repeat; } + +SaveGameInfoWidget { + background-color: #121212; + color: #C0C0C0; } + +/* Progress Bars (Downloads) #QProgressBar */ +QProgressBar { + background-color: transparent; + color: transparent; + height: 14px; + margin: 0 10px; + border-width: 4px 21px; + border-style: solid; + border-color: transparent; + border-image: url(./skyrim/progress-bar-border.png) 4 21 repeat repeat; } + +QProgressBar::chunk { + /* + background: url(./skyrim/progress-bar-chunk.png) center center repear-x qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #95BED9, stop:0.124153 #6EB9CE, stop:0.78781 #474E86); + */ + background: url(./skyrim/progress-bar-chunk.png) center center repear-x qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #95BED9, stop:0.78781 #6EB9CE); } + +/* Right Pane and Tab Bars #QTabWidget, #QTabBar */ +QTabWidget::pane { + border-color: #A6A8AB; + top: 0; + border-width: 5px; + border-color: transparent; + border-image: url(./skyrim/border-image2.png) 5 repeat repeat; } + +QTabBar { + text-transform: uppercase; + max-height: 22px; } + QTabBar::tab { + color: #C0C0C0; + background-color: transparent; + padding: 4px .5em; + margin: 0 0 .3em 0; + border-style: solid; + border-width: 0 15px 0 15px; + border-color: transparent; } + QTabBar::tab:hover { + color: #fff; } + QTabBar::tab:selected { + color: #fff; + border-image: url(./skyrim/button-checked-border.png) 0 15 repeat; } + QTabBar::tab:disabled { + color: #656565; } + QTabBar::scroller { + width: 23px; } + +/* Border images */ +ModListView, +QTreeView, +ModListView#modList, +QTreeWidget, +QListView, +QTableView, +QDialog#LockedDialog { + border-width: 20px; + border-style: solid; + border-color: transparent; + border-image: url(./skyrim/border-image.png) 27 repeat repeat; } + +/* Special styles */ +/* increase categories tab width */ +QTreeWidget#categoriesList { + min-width: 200px; } + QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: .35em 10px; } + QTreeWidget#categoriesList::item:has-children { + background-image: url(./skyrim/arrow-right.png); } + QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./skyrim/branch-opened.png); } + +/* Dialogs width changes */ +/* increase width to prevent buttons cutting */ +QDialog#QueryOverwriteDialog { + min-width: 565px; } + +QDialog#ModInfoDialog { + min-width: 940px; } + +QDialog#BainComplexInstallerDialog { + min-width: 500px; } + +QDialog#EditExecutablesDialog { + min-width: 500px; } + +QDialog#SettingsDialog { + min-width: 670px; } diff --git a/src/stylesheets/skyrim/arrow-down.png b/src/stylesheets/skyrim/arrow-down.png new file mode 100644 index 00000000..276fd467 Binary files /dev/null and b/src/stylesheets/skyrim/arrow-down.png differ diff --git a/src/stylesheets/skyrim/arrow-left.png b/src/stylesheets/skyrim/arrow-left.png new file mode 100644 index 00000000..be707221 Binary files /dev/null and b/src/stylesheets/skyrim/arrow-left.png differ diff --git a/src/stylesheets/skyrim/arrow-right.png b/src/stylesheets/skyrim/arrow-right.png new file mode 100644 index 00000000..a5840a4c Binary files /dev/null and b/src/stylesheets/skyrim/arrow-right.png differ diff --git a/src/stylesheets/skyrim/arrow-up.png b/src/stylesheets/skyrim/arrow-up.png new file mode 100644 index 00000000..1e5e3f90 Binary files /dev/null and b/src/stylesheets/skyrim/arrow-up.png differ diff --git a/src/stylesheets/skyrim/border-image.png b/src/stylesheets/skyrim/border-image.png new file mode 100644 index 00000000..cd9450ac Binary files /dev/null and b/src/stylesheets/skyrim/border-image.png differ diff --git a/src/stylesheets/skyrim/border-image1.png b/src/stylesheets/skyrim/border-image1.png new file mode 100644 index 00000000..df68a485 Binary files /dev/null and b/src/stylesheets/skyrim/border-image1.png differ diff --git a/src/stylesheets/skyrim/border-image2.png b/src/stylesheets/skyrim/border-image2.png new file mode 100644 index 00000000..cccf739f Binary files /dev/null and b/src/stylesheets/skyrim/border-image2.png differ diff --git a/src/stylesheets/skyrim/branch-opened.png b/src/stylesheets/skyrim/branch-opened.png new file mode 100644 index 00000000..8dc7d01d Binary files /dev/null and b/src/stylesheets/skyrim/branch-opened.png differ diff --git a/src/stylesheets/skyrim/button-big-border.png b/src/stylesheets/skyrim/button-big-border.png new file mode 100644 index 00000000..f5d0ec46 Binary files /dev/null and b/src/stylesheets/skyrim/button-big-border.png differ diff --git a/src/stylesheets/skyrim/button-border.png b/src/stylesheets/skyrim/button-border.png new file mode 100644 index 00000000..158890eb Binary files /dev/null and b/src/stylesheets/skyrim/button-border.png differ diff --git a/src/stylesheets/skyrim/button-checked-border.png b/src/stylesheets/skyrim/button-checked-border.png new file mode 100644 index 00000000..7ece413b Binary files /dev/null and b/src/stylesheets/skyrim/button-checked-border.png differ diff --git a/src/stylesheets/skyrim/checkbox-alt-checked.png b/src/stylesheets/skyrim/checkbox-alt-checked.png new file mode 100644 index 00000000..3f4662c7 Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-alt-checked.png differ diff --git a/src/stylesheets/skyrim/checkbox-alt-unchecked-hover.png b/src/stylesheets/skyrim/checkbox-alt-unchecked-hover.png new file mode 100644 index 00000000..69e11fd1 Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-alt-unchecked-hover.png differ diff --git a/src/stylesheets/skyrim/checkbox-alt-unchecked.png b/src/stylesheets/skyrim/checkbox-alt-unchecked.png new file mode 100644 index 00000000..a9b51027 Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-alt-unchecked.png differ diff --git a/src/stylesheets/skyrim/checkbox-checked-disabled.png b/src/stylesheets/skyrim/checkbox-checked-disabled.png new file mode 100644 index 00000000..c5192630 Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-checked-disabled.png differ diff --git a/src/stylesheets/skyrim/checkbox-checked-hover.png b/src/stylesheets/skyrim/checkbox-checked-hover.png new file mode 100644 index 00000000..0ca3d2b2 Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-checked-hover.png differ diff --git a/src/stylesheets/skyrim/checkbox-checked.png b/src/stylesheets/skyrim/checkbox-checked.png new file mode 100644 index 00000000..68da200d Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-checked.png differ diff --git a/src/stylesheets/skyrim/checkbox-disabled.png b/src/stylesheets/skyrim/checkbox-disabled.png new file mode 100644 index 00000000..ad264e5b Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-disabled.png differ diff --git a/src/stylesheets/skyrim/checkbox-hover.png b/src/stylesheets/skyrim/checkbox-hover.png new file mode 100644 index 00000000..8e90ba6b Binary files /dev/null and b/src/stylesheets/skyrim/checkbox-hover.png differ diff --git a/src/stylesheets/skyrim/checkbox.png b/src/stylesheets/skyrim/checkbox.png new file mode 100644 index 00000000..34503819 Binary files /dev/null and b/src/stylesheets/skyrim/checkbox.png differ diff --git a/src/stylesheets/skyrim/context-menu-separator.png b/src/stylesheets/skyrim/context-menu-separator.png new file mode 100644 index 00000000..f566ca76 Binary files /dev/null and b/src/stylesheets/skyrim/context-menu-separator.png differ diff --git a/src/stylesheets/skyrim/progress-bar-border.png b/src/stylesheets/skyrim/progress-bar-border.png new file mode 100644 index 00000000..676f0de2 Binary files /dev/null and b/src/stylesheets/skyrim/progress-bar-border.png differ diff --git a/src/stylesheets/skyrim/progress-bar-chunk.png b/src/stylesheets/skyrim/progress-bar-chunk.png new file mode 100644 index 00000000..b9d31399 Binary files /dev/null and b/src/stylesheets/skyrim/progress-bar-chunk.png differ diff --git a/src/stylesheets/skyrim/radio-checked.png b/src/stylesheets/skyrim/radio-checked.png new file mode 100644 index 00000000..89022836 Binary files /dev/null and b/src/stylesheets/skyrim/radio-checked.png differ diff --git a/src/stylesheets/skyrim/radio-hover.png b/src/stylesheets/skyrim/radio-hover.png new file mode 100644 index 00000000..eda643ca Binary files /dev/null and b/src/stylesheets/skyrim/radio-hover.png differ diff --git a/src/stylesheets/skyrim/radio.png b/src/stylesheets/skyrim/radio.png new file mode 100644 index 00000000..57cd3985 Binary files /dev/null and b/src/stylesheets/skyrim/radio.png differ diff --git a/src/stylesheets/skyrim/scrollbar-down.png b/src/stylesheets/skyrim/scrollbar-down.png new file mode 100644 index 00000000..76feeeab Binary files /dev/null and b/src/stylesheets/skyrim/scrollbar-down.png differ diff --git a/src/stylesheets/skyrim/scrollbar-horizontal.png b/src/stylesheets/skyrim/scrollbar-horizontal.png new file mode 100644 index 00000000..7ebfe658 Binary files /dev/null and b/src/stylesheets/skyrim/scrollbar-horizontal.png differ diff --git a/src/stylesheets/skyrim/scrollbar-left.png b/src/stylesheets/skyrim/scrollbar-left.png new file mode 100644 index 00000000..77a60787 Binary files /dev/null and b/src/stylesheets/skyrim/scrollbar-left.png differ diff --git a/src/stylesheets/skyrim/scrollbar-right.png b/src/stylesheets/skyrim/scrollbar-right.png new file mode 100644 index 00000000..e8a67d4e Binary files /dev/null and b/src/stylesheets/skyrim/scrollbar-right.png differ diff --git a/src/stylesheets/skyrim/scrollbar-up.png b/src/stylesheets/skyrim/scrollbar-up.png new file mode 100644 index 00000000..64c9665d Binary files /dev/null and b/src/stylesheets/skyrim/scrollbar-up.png differ diff --git a/src/stylesheets/skyrim/scrollbar-vertical.png b/src/stylesheets/skyrim/scrollbar-vertical.png new file mode 100644 index 00000000..cdd5b048 Binary files /dev/null and b/src/stylesheets/skyrim/scrollbar-vertical.png differ diff --git a/src/stylesheets/skyrim/separator.png b/src/stylesheets/skyrim/separator.png new file mode 100644 index 00000000..9867bab3 Binary files /dev/null and b/src/stylesheets/skyrim/separator.png differ diff --git a/src/stylesheets/skyrim/slider-border.png b/src/stylesheets/skyrim/slider-border.png new file mode 100644 index 00000000..64ef3ebb Binary files /dev/null and b/src/stylesheets/skyrim/slider-border.png differ diff --git a/src/stylesheets/skyrim/slider-handle.png b/src/stylesheets/skyrim/slider-handle.png new file mode 100644 index 00000000..e400cd37 Binary files /dev/null and b/src/stylesheets/skyrim/slider-handle.png differ diff --git a/src/stylesheets/vs15 Dark-Green.qss b/src/stylesheets/vs15 Dark-Green.qss new file mode 100644 index 00000000..0fbcc896 --- /dev/null +++ b/src/stylesheets/vs15 Dark-Green.qss @@ -0,0 +1,747 @@ +/*!************************************* + VS15 Dark +**************************************** + Author: chintsu_kun + Version: 1.3.1 + Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) + Url: https://github.com/nikolay-borzov/modorganizer-themes +**************************************** +*/ +/* or #434346*/ +/* Main Window */ +QWidget { + background-color: #2D2D30; + color: #F1F1F1; } + QWidget::disabled { + color: #656565; } + +/* Common */ +/* FIX: For some reason applying background-color or border fixes paddings properties */ +QListView::item, +QTreeView#espList::item, +QTreeWidget#categoriesList::item { + border-width: 0; } + +/* remove outline */ +* { + outline: 0; } + +*:disabled, +QListView::item:disabled, +*::item:selected:disabled { + color: #656565; } + +/* line heights */ +/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +QTreeView#modList::item, +QTreeWidget#categoriesTree::item, +#tabConflicts QTreeWidget::item { + padding: 0.3em 0; } + +QListView::item, +QTreeView#espList::item { + padding: 0.3em; } + +/* to enable border color */ +QTreeView, +QListView, +QTextEdit, +QWebView, +QTableView { + border-style: solid; + border-width: 1px; } + +QAbstractItemView { + color: #DCDCDC; + background-color: #1E1E1E; + alternate-background-color: #262626; + border-color: #3F3F46; } + QAbstractItemView::item:selected, QAbstractItemView::item:selected:hover { + background-color: #009933; + color: #F1F1F1; } + +QAbstractItemView, +QListView, +QTreeView { + show-decoration-selected: 1; } + +QAbstractItemView::item:hover, +QListView::item:hover, +QTreeView::branch:hover, +QTreeWidget::item:hover { + background-color: rgba(0, 153, 51, 0.3); } + +QAbstractItemView::item:selected:disabled, +QListView::item:selected:disabled, +QTreeView::branch:selected:disabled, +QTreeWidget::item:selected:disabled { + background-color: rgba(0, 153, 51, 0.3); } + +QTreeView::branch:selected { + background-color: #009933; } + +QLabel { + background-color: transparent; } + +/* Left Pane & File Trees #QTreeView, #QListView*/ +QTreeView::branch:closed:has-children { + image: url(./vs15/branch-closed.png); } + +QTreeView::branch:open:has-children { + image: url(./vs15/branch-open.png); } + +/*QListView::item:hover { } +QListView::item:selected { }*/ +QListView::item { + color: #F1F1F1; } + +/* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ +/* Common */ +QTextEdit, +QWebView, +QLineEdit, +QAbstractSpinBox, +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button, +QComboBox { + background-color: #333337; + border-color: #3F3F46; } + +QLineEdit:hover, +QAbstractSpinBox:hover, +QTextEdit:hover, +QComboBox:hover, +QComboBox:editable:hover { + border-color: #009933; } + +QLineEdit:focus, +QAbstractSpinBox::focus, +QTextEdit:focus, +QComboBox:focus, +QComboBox:editable:focus, +QComboBox:on { + background-color: #3F3F46; + border-color: #009933; } + +QComboBox:on { + border-bottom-color: #3F3F46; } + +QLineEdit, +QAbstractSpinBox { + min-height: 15px; + padding: 2px; + border-style: solid; + border-width: 1px; } + +QLineEdit { + margin-top: 0; } + +/* clear button */ +QLineEdit QToolButton, +QLineEdit QToolButton:hover { + background: none; + margin-top: 1px; } + +QLineEdit#espFilterEdit QToolButton { + margin-top: -2px; + margin-bottom: 1px; } + +/* Dropdowns #QComboBox*/ +QComboBox { + min-height: 20px; + padding-left: 5px; + margin: 3px 0 1px 0; + border-style: solid; + border-width: 1px; } + QComboBox:editable { + padding-left: 3px; + /* to enable hover styles */ + background-color: transparent; } + QComboBox::drop-down { + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; + /* If you need to set style for drop down button + &:on, + &:editable:hover { + background-color: red; + } */ } + QComboBox::down-arrow { + image: url(./vs15/combobox-down.png); } + QComboBox QAbstractItemView { + background-color: #1B1B1C; + selection-background-color: #3F3F46; + border-color: #009933; + border-style: solid; + border-width: 0 1px 1px 1px; } + +/* doesn't work http://stackoverflow.com/questions/13308341/qcombobox-abstractitemviewitem*/ +/*QComboBox QAbstractItemView:item { + padding: 10px; + margin: 10px; +}*/ +/* Toolbar */ +QToolBar { + border: none; } + +QToolBar::separator { + border-left-color: #222222; + border-right-color: #46464A; + border-width: 0 1px 0 1px; + border-style: solid; + width: 0; } + +QToolButton { + margin: 0 4px 0 4px; + padding: 5px; } + QToolButton:hover, QToolButton:focus { + background-color: #3E3E40; + /* need this to make background-color works*/ + border: none; } + QToolButton:pressed { + background-color: #009933; + /* need this to make background-color works*/ + border: none; } + +/* Group Boxes #QGroupBox */ +QGroupBox { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; + padding: 1em .3em .3em .3em; + margin-top: .65em; } + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 2px; + left: 10px; } + +/* LCD Count */ +QLCDNumber { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Buttons #QPushButton */ +QPushButton { + background-color: #333337; + border-color: #3F3F46; + min-height: 18px; + padding: 2px 5px; + border-style: solid; + border-width: 1px; } + +QPushButton:hover, +QPushButton:checked, +QPushButton:focus, +QAbstractSpinBox::up-button:hover, +QAbstractSpinBox::down-button:hover { + background-color: #009933; } + +QPushButton:pressed, +QPushButton:checked:hover, +QAbstractSpinBox::up-button:pressed, +QAbstractSpinBox::down-button:pressed { + background-color: #00b33c; } + +QPushButton:disabled, +QAbstractSpinBox::up-button:disabled, +QAbstractSpinBox::down-button:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QPushButton::menu-indicator { + image: url(./vs15/combobox-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; } + +/* dialog buttons */ +/* Common */ +QDialog QPushButton, +QSlider::handle:horizontal, +QSlider::handle:vertical { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QDialog QPushButton:hover, +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover, +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #ccffdd; + border-color: #00a838; } + +QSlider::handle:horizontal:focus:!pressed, +QSlider::handle:vertical:focus:!pressed, +QDialog QPushButton:focus, +QDialog QPushButton:checked { + background-color: #DDDDDD; + border-color: #009933; } + +QDialog QPushButton:disabled, +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QDialog QPushButton { + min-width: 1.5em; + padding-left: .5em; + padding-right: .5em; } + +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/*common*/ +QGroupBox::indicator, +QTreeView::indicator, +QCheckBox::indicator, +QRadioButton::indicator { + background-color: #2D2D30; + border-color: #3F3F46; + width: 13px; + height: 13px; + border-style: solid; + border-width: 1px; } + QGroupBox::indicator:hover, + QTreeView::indicator:hover, + QCheckBox::indicator:hover, + QRadioButton::indicator:hover { + background-color: #3F3F46; + border-color: #009933; } + +QGroupBox::indicator:checked, +QTreeView::indicator:checked, +QCheckBox::indicator:checked { + image: url(./vs15/checkbox-check.png); } + +QGroupBox::indicator:disabled, +QTreeView::indicator:checked:disabled, +QCheckBox::indicator:checked:disabled { + image: url(./vs15/checkbox-check-disabled.png); } + +/* Checkboxes special */ +QTreeView#modList::indicator { + width: 15px; + height: 15px; } + +/* Radio buttons #QRadioButton */ +QRadioButton::indicator { + border-radius: 7px; } + QRadioButton::indicator::checked { + background-color: #B9B9BA; + border-width: 2px; + width: 11px; + height: 11px; } + QRadioButton::indicator::checked:hover { + border-color: #3F3F46; } + +/* Spinners #QSpinBox, #QDoubleSpinBox */ +QAbstractSpinBox { + margin: 1px; } + +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; } + +QAbstractSpinBox::up-button { + subcontrol-position: top right; } + +QAbstractSpinBox::up-arrow { + image: url(./vs15/spinner-up.png); } + +QAbstractSpinBox::down-button { + subcontrol-position: bottom right; } + +QAbstractSpinBox::down-arrow { + image: url(./vs15/spinner-down.png); } + +/* Sliders #QSlider */ +QSlider::groove:horizontal { + background-color: #3F3F46; + border: none; + height: 8px; + margin: 2px 0; } + +QSlider::handle:horizontal { + width: .5em; + height: 2em; + margin: -7px 0; + subcontrol-origin: margin; } + +/* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ +/* assigning background still leaves not filled area*/ +QAbstractScrollArea::corner { + background-color: transparent; } + +/* Horizontal */ +QScrollBar:horizontal { + height: 18px; + border: none; + margin: 0 23px 0 23px; } + +QScrollBar::handle:horizontal { + min-width: 32px; + margin: 4px 2px; } + +QScrollBar::add-line:horizontal { + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; } + +QScrollBar::sub-line:horizontal { + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; } + +/* Vertical */ +QScrollBar:vertical { + width: 20px; + border: none; + margin: 23px 0 23px 0; } + +QScrollBar::handle:vertical { + min-height: 32px; + margin: 2px 4px; } + +QScrollBar::add-line:vertical { + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; } + +QScrollBar::sub-line:vertical { + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; } + +/* Combined */ +QScrollBar { + background-color: #3E3E42; + border: none; } + +QScrollBar::handle { + background-color: #686868; } + +QScrollBar::add-line, +QScrollBar::sub-line { + background-color: #3E3E42; + border: none; } + +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { }*/ +QScrollBar::handle:hover { + background: #9E9E9E; } + +QScrollBar::handle:pressed { + background: #EFEBEF; } + +QScrollBar::handle:disabled { + background: #555558; } + +QScrollBar::add-page, +QScrollBar::sub-page { + background: transparent; } + +QScrollBar::up-arrow:vertical { + image: url(./vs15/scrollbar-up.png); } + +QScrollBar::up-arrow:vertical:hover { + image: url(./vs15/scrollbar-up-hover.png); } + +QScrollBar::up-arrow:vertical:disabled { + image: url(./vs15/scrollbar-up-disabled.png); } + +QScrollBar::right-arrow:horizontal { + image: url(./vs15/scrollbar-right.png); } + +QScrollBar::right-arrow:horizontal:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QScrollBar::right-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-right-disabled.png); } + +QScrollBar::down-arrow:vertical { + image: url(./vs15/scrollbar-down.png); } + +QScrollBar::down-arrow:vertical:hover { + image: url(./vs15/scrollbar-down-hover.png); } + +QScrollBar::down-arrow:vertical:disabled { + image: url(./vs15/scrollbar-down-disabled.png); } + +QScrollBar::left-arrow:horizontal { + image: url(./vs15/scrollbar-left.png); } + +QScrollBar::left-arrow:horizontal:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +QScrollBar::left-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-left-disabled.png); } + +/* Scroll Area #QScrollArea*/ +QScrollArea { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Header Rows and Tables (Configure Mod Categories) #QTableView, #QHeaderView */ +QTableView { + gridline-color: #3F3F46; + selection-background-color: #009933; + selection-color: #F1F1F1; } + +QTableView QTableCornerButton::section { + background: #252526; + border-color: #3F3F46; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView { + border: none; } + +QHeaderView::section { + background: #252526; + border-color: #3F3F46; + padding: 3px 5px; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView::section:hover { + background: #3E3E40; + color: #F6F6F6; } + +/*QHeaderView::section:first { }*/ +QHeaderView::section:last { + border-right: 0; } + +QHeaderView::up-arrow { + image: url(./vs15/sort-asc.png); + margin-bottom: -37px; } + +QTreeView#downloadView QHeaderView::up-arrow { + margin-bottom: -32px; } + +QHeaderView::down-arrow { + image: url(./vs15/sort-desc.png); + margin-bottom: 0; } + +/* Context menus, toolbar dropdowns #QMenu */ +QMenu { + background-color: #1A1A1C; + border-color: #333337; + border-style: solid; + border-width: 1px; + padding: 2px; } + +QMenu::item { + background: transparent; + padding: 4px 20px; } + +QMenu::item:selected { + background-color: #333334; } + +QMenu::item:disabled { + background-color: transparent; } + +QMenu::separator { + background-color: #333337; + height: 1px; + margin: 1px 0; } + +QMenu::icon { + margin: 1px; } + +QMenu::right-arrow { + image: url(./vs15/sub-menu-arrow.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: .5em; } + +QMenu QPushButton { + background-color: transparent; + border-color: #3F3F46; + margin: 1px 0 1px 0; } + +QMenu QCheckBox, +QMenu QRadioButton { + background-color: transparent; + padding: 5px 2px; } + +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +QToolTip, +SaveGameInfoWidget { + background-color: #424245; + border-color: #4D4D50; + color: #F1F1F1; + border-style: solid; + border-width: 1px; + padding: 2px; } + +/* Progress Bars (Downloads) #QProgressBar */ +QProgressBar { + background-color: #E6E6E6; + color: #000; + border-color: #BCBCBC; + text-align: center; + border-style: solid; + border-width: 1px; + margin: 0 10px; } + +QProgressBar::chunk { + background: #06B025; } + +/* Right Pane and Tab Bars #QTabWidget, #QTabBar */ +QTabWidget::pane { + border-color: #3F3F46; + border-top-color: #009933; + top: 0; + border-style: solid; + border-width: 1px; } + +QTabWidget::pane:disabled { + border-top-color: #3F3F46; } + +/*QTabWidget::tab-bar { }*/ +QTabBar::tab { + background-color: transparent; + padding: 4px 1em; + border: none; } + +QTabBar::tab:hover { + background-color: #00b33c; } + +QTabBar::tab:selected, +QTabBar::tab:selected:hover { + background-color: #009933; } + +QTabBar::tab:disabled { + background-color: transparent; + color: #656565; } + +QTabBar::tab:selected:disabled { + background-color: #3F3F46; } + +/* scrollers */ +QTabBar QToolButton { + background-color: #333337; + border-color: #3F3F46; + padding: 1px; + margin: 0; + border-style: solid; + border-width: 1px; } + +QTabBar QToolButton:hover { + border-color: #009933; + border-width: 1px; + border-style: solid; } + +QTabBar QToolButton:disabled, +QTabBar QToolButton:pressed:hover { + background-color: #333337; } + +/*QTabBar::tear { }*/ +QTabBar::scroller { + width: 23px; + background-color: red; } + +QTabBar QToolButton::right-arrow { + image: url(./vs15/scrollbar-right.png); } + +QTabBar QToolButton::right-arrow:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QTabBar QToolButton::left-arrow { + image: url(./vs15/scrollbar-left.png); } + +QTabBar QToolButton::left-arrow:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +/* Special styles */ +/* fix margins on tabs pane */ +QLineEdit#espFilterEdit { + margin: 0 0 6px 0; } + +QTreeView#downloadView { + margin: 4px 4px 0 4px; } + +QCheckBox#showHiddenBox { + margin: 0 0 4px 4px; } + +QLineEdit#downloadFilterEdit { + margin: 0 4px 4px 0; } + +QWidget#tabImages QPushButton { + background-color: transparent; + margin: 0 .3em; + padding: 0; } + +/* like dialog QPushButton*/ +QWidget#tabESPs QToolButton { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QWidget#tabESPs QToolButton:hover { + background-color: #ccffdd; + border-color: #00a838; } + +QWidget#tabESPs QToolButton:focus { + background-color: #DDDDDD; + border-color: #009933; } + +QWidget#tabESPs QToolButton:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QTreeWidget#categoriesList { + /*min-width: 225px;*/ } + +QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: .35em 10px; } + +QTreeWidget#categoriesList::item:has-children { + background-image: url(./vs15/branch-closed.png); } + +QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./vs15/branch-open.png); } + +QDialog#QueryOverwriteDialog QPushButton { + margin-left: .5em; } + +QDialog#PyCfgDialog QPushButton:hover { + background-color: #ccffdd; } + +QLineEdit#modFilterEdit { + margin-top: 2px; } + +/* highlight unchecked BSAs */ +QWidget#bsaTab QTreeWidget::indicator:unchecked { + background-color: #009933; } + +/* increase version textfield */ +QLineEdit#versionEdit { + max-width: 100px; } + +/* Dialogs width changes */ +/* increase width to prevent buttons cutting */ +QDialog#QueryOverwriteDialog { + min-width: 565px; } + +QDialog#ModInfoDialog { + min-width: 850px; } diff --git a/src/stylesheets/vs15 Dark-Orange.qss b/src/stylesheets/vs15 Dark-Orange.qss new file mode 100644 index 00000000..3a4eb86b --- /dev/null +++ b/src/stylesheets/vs15 Dark-Orange.qss @@ -0,0 +1,753 @@ +/*!************************************* + VS15 Dark +**************************************** + Author: chintsu_kun + Version: 1.3.1 + Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) + Url: https://github.com/nikolay-borzov/modorganizer-themes +**************************************** +*/ +/* or #434346*/ +/*base*/ +/*#3399FF*/ +/*#007ACC*/ +/*#1C97EA*/ +/*#3C7FB1*/ +/*#BEE6FD*/ +/* Main Window */ +QWidget { + background-color: #2D2D30; + color: #F1F1F1; } + QWidget::disabled { + color: #656565; } + +/* Common */ +/* FIX: For some reason applying background-color or border fixes paddings properties */ +QListView::item, +QTreeView#espList::item, +QTreeWidget#categoriesList::item { + border-width: 0; } + +/* remove outline */ +* { + outline: 0; } + +*:disabled, +QListView::item:disabled, +*::item:selected:disabled { + color: #656565; } + +/* line heights */ +/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +QTreeView#modList::item, +QTreeWidget#categoriesTree::item, +#tabConflicts QTreeWidget::item { + padding: 0.3em 0; } + +QListView::item, +QTreeView#espList::item { + padding: 0.3em; } + +/* to enable border color */ +QTreeView, +QListView, +QTextEdit, +QWebView, +QTableView { + border-style: solid; + border-width: 1px; } + +QAbstractItemView { + color: #DCDCDC; + background-color: #1E1E1E; + alternate-background-color: #262626; + border-color: #3F3F46; } + QAbstractItemView::item:selected, QAbstractItemView::item:selected:hover { + background-color: #CC6600; + color: #F1F1F1; } + +QAbstractItemView, +QListView, +QTreeView { + show-decoration-selected: 1; } + +QAbstractItemView::item:hover, +QListView::item:hover, +QTreeView::branch:hover, +QTreeWidget::item:hover { + background-color: rgba(204, 102, 0, 0.3); } + +QAbstractItemView::item:selected:disabled, +QListView::item:selected:disabled, +QTreeView::branch:selected:disabled, +QTreeWidget::item:selected:disabled { + background-color: rgba(204, 102, 0, 0.3); } + +QTreeView::branch:selected { + background-color: #CC6600; } + +QLabel { + background-color: transparent; } + +/* Left Pane & File Trees #QTreeView, #QListView*/ +QTreeView::branch:closed:has-children { + image: url(./vs15/branch-closed.png); } + +QTreeView::branch:open:has-children { + image: url(./vs15/branch-open.png); } + +/*QListView::item:hover { } +QListView::item:selected { }*/ +QListView::item { + color: #F1F1F1; } + +/* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ +/* Common */ +QTextEdit, +QWebView, +QLineEdit, +QAbstractSpinBox, +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button, +QComboBox { + background-color: #333337; + border-color: #3F3F46; } + +QLineEdit:hover, +QAbstractSpinBox:hover, +QTextEdit:hover, +QComboBox:hover, +QComboBox:editable:hover { + border-color: #CC6600; } + +QLineEdit:focus, +QAbstractSpinBox::focus, +QTextEdit:focus, +QComboBox:focus, +QComboBox:editable:focus, +QComboBox:on { + background-color: #3F3F46; + border-color: #CC6600; } + +QComboBox:on { + border-bottom-color: #3F3F46; } + +QLineEdit, +QAbstractSpinBox { + min-height: 15px; + padding: 2px; + border-style: solid; + border-width: 1px; } + +QLineEdit { + margin-top: 0; } + +/* clear button */ +QLineEdit QToolButton, +QLineEdit QToolButton:hover { + background: none; + margin-top: 1px; } + +QLineEdit#espFilterEdit QToolButton { + margin-top: -2px; + margin-bottom: 1px; } + +/* Dropdowns #QComboBox*/ +QComboBox { + min-height: 20px; + padding-left: 5px; + margin: 3px 0 1px 0; + border-style: solid; + border-width: 1px; } + QComboBox:editable { + padding-left: 3px; + /* to enable hover styles */ + background-color: transparent; } + QComboBox::drop-down { + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; + /* If you need to set style for drop down button + &:on, + &:editable:hover { + background-color: red; + } */ } + QComboBox::down-arrow { + image: url(./vs15/combobox-down.png); } + QComboBox QAbstractItemView { + background-color: #1B1B1C; + selection-background-color: #3F3F46; + border-color: #CC6600; + border-style: solid; + border-width: 0 1px 1px 1px; } + +/* doesn't work http://stackoverflow.com/questions/13308341/qcombobox-abstractitemviewitem*/ +/*QComboBox QAbstractItemView:item { + padding: 10px; + margin: 10px; +}*/ +/* Toolbar */ +QToolBar { + border: none; } + +QToolBar::separator { + border-left-color: #222222; + border-right-color: #46464A; + border-width: 0 1px 0 1px; + border-style: solid; + width: 0; } + +QToolButton { + margin: 0 4px 0 4px; + padding: 5px; } + QToolButton:hover, QToolButton:focus { + background-color: #3E3E40; + /* need this to make background-color works*/ + border: none; } + QToolButton:pressed { + background-color: #CC6600; + /* need this to make background-color works*/ + border: none; } + +/* Group Boxes #QGroupBox */ +QGroupBox { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; + padding: 1em .3em .3em .3em; + margin-top: .65em; } + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 2px; + left: 10px; } + +/* LCD Count */ +QLCDNumber { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Buttons #QPushButton */ +QPushButton { + background-color: #333337; + border-color: #3F3F46; + min-height: 18px; + padding: 2px 5px; + border-style: solid; + border-width: 1px; } + +QPushButton:hover, +QPushButton:checked, +QPushButton:focus, +QAbstractSpinBox::up-button:hover, +QAbstractSpinBox::down-button:hover { + background-color: #CC6600; } + +QPushButton:pressed, +QPushButton:checked:hover, +QAbstractSpinBox::up-button:pressed, +QAbstractSpinBox::down-button:pressed { + background-color: #e67300; } + +QPushButton:disabled, +QAbstractSpinBox::up-button:disabled, +QAbstractSpinBox::down-button:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QPushButton::menu-indicator { + image: url(./vs15/combobox-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; } + +/* dialog buttons */ +/* Common */ +QDialog QPushButton, +QSlider::handle:horizontal, +QSlider::handle:vertical { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QDialog QPushButton:hover, +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover, +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #ffd9b3; + border-color: #db6e00; } + +QSlider::handle:horizontal:focus:!pressed, +QSlider::handle:vertical:focus:!pressed, +QDialog QPushButton:focus, +QDialog QPushButton:checked { + background-color: #DDDDDD; + border-color: #CC6600; } + +QDialog QPushButton:disabled, +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QDialog QPushButton { + min-width: 1.5em; + padding-left: .5em; + padding-right: .5em; } + +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/*common*/ +QGroupBox::indicator, +QTreeView::indicator, +QCheckBox::indicator, +QRadioButton::indicator { + background-color: #2D2D30; + border-color: #3F3F46; + width: 13px; + height: 13px; + border-style: solid; + border-width: 1px; } + QGroupBox::indicator:hover, + QTreeView::indicator:hover, + QCheckBox::indicator:hover, + QRadioButton::indicator:hover { + background-color: #3F3F46; + border-color: #CC6600; } + +QGroupBox::indicator:checked, +QTreeView::indicator:checked, +QCheckBox::indicator:checked { + image: url(./vs15/checkbox-check.png); } + +QGroupBox::indicator:disabled, +QTreeView::indicator:checked:disabled, +QCheckBox::indicator:checked:disabled { + image: url(./vs15/checkbox-check-disabled.png); } + +/* Checkboxes special */ +QTreeView#modList::indicator { + width: 15px; + height: 15px; } + +/* Radio buttons #QRadioButton */ +QRadioButton::indicator { + border-radius: 7px; } + QRadioButton::indicator::checked { + background-color: #B9B9BA; + border-width: 2px; + width: 11px; + height: 11px; } + QRadioButton::indicator::checked:hover { + border-color: #3F3F46; } + +/* Spinners #QSpinBox, #QDoubleSpinBox */ +QAbstractSpinBox { + margin: 1px; } + +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; } + +QAbstractSpinBox::up-button { + subcontrol-position: top right; } + +QAbstractSpinBox::up-arrow { + image: url(./vs15/spinner-up.png); } + +QAbstractSpinBox::down-button { + subcontrol-position: bottom right; } + +QAbstractSpinBox::down-arrow { + image: url(./vs15/spinner-down.png); } + +/* Sliders #QSlider */ +QSlider::groove:horizontal { + background-color: #3F3F46; + border: none; + height: 8px; + margin: 2px 0; } + +QSlider::handle:horizontal { + width: .5em; + height: 2em; + margin: -7px 0; + subcontrol-origin: margin; } + +/* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ +/* assigning background still leaves not filled area*/ +QAbstractScrollArea::corner { + background-color: transparent; } + +/* Horizontal */ +QScrollBar:horizontal { + height: 18px; + border: none; + margin: 0 23px 0 23px; } + +QScrollBar::handle:horizontal { + min-width: 32px; + margin: 4px 2px; } + +QScrollBar::add-line:horizontal { + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; } + +QScrollBar::sub-line:horizontal { + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; } + +/* Vertical */ +QScrollBar:vertical { + width: 20px; + border: none; + margin: 23px 0 23px 0; } + +QScrollBar::handle:vertical { + min-height: 32px; + margin: 2px 4px; } + +QScrollBar::add-line:vertical { + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; } + +QScrollBar::sub-line:vertical { + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; } + +/* Combined */ +QScrollBar { + background-color: #3E3E42; + border: none; } + +QScrollBar::handle { + background-color: #686868; } + +QScrollBar::add-line, +QScrollBar::sub-line { + background-color: #3E3E42; + border: none; } + +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { }*/ +QScrollBar::handle:hover { + background: #9E9E9E; } + +QScrollBar::handle:pressed { + background: #EFEBEF; } + +QScrollBar::handle:disabled { + background: #555558; } + +QScrollBar::add-page, +QScrollBar::sub-page { + background: transparent; } + +QScrollBar::up-arrow:vertical { + image: url(./vs15/scrollbar-up.png); } + +QScrollBar::up-arrow:vertical:hover { + image: url(./vs15/scrollbar-up-hover.png); } + +QScrollBar::up-arrow:vertical:disabled { + image: url(./vs15/scrollbar-up-disabled.png); } + +QScrollBar::right-arrow:horizontal { + image: url(./vs15/scrollbar-right.png); } + +QScrollBar::right-arrow:horizontal:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QScrollBar::right-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-right-disabled.png); } + +QScrollBar::down-arrow:vertical { + image: url(./vs15/scrollbar-down.png); } + +QScrollBar::down-arrow:vertical:hover { + image: url(./vs15/scrollbar-down-hover.png); } + +QScrollBar::down-arrow:vertical:disabled { + image: url(./vs15/scrollbar-down-disabled.png); } + +QScrollBar::left-arrow:horizontal { + image: url(./vs15/scrollbar-left.png); } + +QScrollBar::left-arrow:horizontal:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +QScrollBar::left-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-left-disabled.png); } + +/* Scroll Area #QScrollArea*/ +QScrollArea { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Header Rows and Tables (Configure Mod Categories) #QTableView, #QHeaderView */ +QTableView { + gridline-color: #3F3F46; + selection-background-color: #CC6600; + selection-color: #F1F1F1; } + +QTableView QTableCornerButton::section { + background: #252526; + border-color: #3F3F46; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView { + border: none; } + +QHeaderView::section { + background: #252526; + border-color: #3F3F46; + padding: 3px 5px; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView::section:hover { + background: #3E3E40; + color: #F6F6F6; } + +/*QHeaderView::section:first { }*/ +QHeaderView::section:last { + border-right: 0; } + +QHeaderView::up-arrow { + image: url(./vs15/sort-asc.png); + margin-bottom: -37px; } + +QTreeView#downloadView QHeaderView::up-arrow { + margin-bottom: -32px; } + +QHeaderView::down-arrow { + image: url(./vs15/sort-desc.png); + margin-bottom: 0; } + +/* Context menus, toolbar dropdowns #QMenu */ +QMenu { + background-color: #1A1A1C; + border-color: #333337; + border-style: solid; + border-width: 1px; + padding: 2px; } + +QMenu::item { + background: transparent; + padding: 4px 20px; } + +QMenu::item:selected { + background-color: #333334; } + +QMenu::item:disabled { + background-color: transparent; } + +QMenu::separator { + background-color: #333337; + height: 1px; + margin: 1px 0; } + +QMenu::icon { + margin: 1px; } + +QMenu::right-arrow { + image: url(./vs15/sub-menu-arrow.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: .5em; } + +QMenu QPushButton { + background-color: transparent; + border-color: #3F3F46; + margin: 1px 0 1px 0; } + +QMenu QCheckBox, +QMenu QRadioButton { + background-color: transparent; + padding: 5px 2px; } + +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +QToolTip, +SaveGameInfoWidget { + background-color: #424245; + border-color: #4D4D50; + color: #F1F1F1; + border-style: solid; + border-width: 1px; + padding: 2px; } + +/* Progress Bars (Downloads) #QProgressBar */ +QProgressBar { + background-color: #E6E6E6; + color: #000; + border-color: #BCBCBC; + text-align: center; + border-style: solid; + border-width: 1px; + margin: 0 10px; } + +QProgressBar::chunk { + background: #06B025; } + +/* Right Pane and Tab Bars #QTabWidget, #QTabBar */ +QTabWidget::pane { + border-color: #3F3F46; + border-top-color: #CC6600; + top: 0; + border-style: solid; + border-width: 1px; } + +QTabWidget::pane:disabled { + border-top-color: #3F3F46; } + +/*QTabWidget::tab-bar { }*/ +QTabBar::tab { + background-color: transparent; + padding: 4px 1em; + border: none; } + +QTabBar::tab:hover { + background-color: #e67300; } + +QTabBar::tab:selected, +QTabBar::tab:selected:hover { + background-color: #CC6600; } + +QTabBar::tab:disabled { + background-color: transparent; + color: #656565; } + +QTabBar::tab:selected:disabled { + background-color: #3F3F46; } + +/* scrollers */ +QTabBar QToolButton { + background-color: #333337; + border-color: #3F3F46; + padding: 1px; + margin: 0; + border-style: solid; + border-width: 1px; } + +QTabBar QToolButton:hover { + border-color: #CC6600; + border-width: 1px; + border-style: solid; } + +QTabBar QToolButton:disabled, +QTabBar QToolButton:pressed:hover { + background-color: #333337; } + +/*QTabBar::tear { }*/ +QTabBar::scroller { + width: 23px; + background-color: red; } + +QTabBar QToolButton::right-arrow { + image: url(./vs15/scrollbar-right.png); } + +QTabBar QToolButton::right-arrow:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QTabBar QToolButton::left-arrow { + image: url(./vs15/scrollbar-left.png); } + +QTabBar QToolButton::left-arrow:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +/* Special styles */ +/* fix margins on tabs pane */ +QLineEdit#espFilterEdit { + margin: 0 0 6px 0; } + +QTreeView#downloadView { + margin: 4px 4px 0 4px; } + +QCheckBox#showHiddenBox { + margin: 0 0 4px 4px; } + +QLineEdit#downloadFilterEdit { + margin: 0 4px 4px 0; } + +QWidget#tabImages QPushButton { + background-color: transparent; + margin: 0 .3em; + padding: 0; } + +/* like dialog QPushButton*/ +QWidget#tabESPs QToolButton { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QWidget#tabESPs QToolButton:hover { + background-color: #ffd9b3; + border-color: #db6e00; } + +QWidget#tabESPs QToolButton:focus { + background-color: #DDDDDD; + border-color: #CC6600; } + +QWidget#tabESPs QToolButton:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QTreeWidget#categoriesList { + /*min-width: 225px;*/ } + +QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: .35em 10px; } + +QTreeWidget#categoriesList::item:has-children { + background-image: url(./vs15/branch-closed.png); } + +QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./vs15/branch-open.png); } + +QDialog#QueryOverwriteDialog QPushButton { + margin-left: .5em; } + +QDialog#PyCfgDialog QPushButton:hover { + background-color: #ffd9b3; } + +QLineEdit#modFilterEdit { + margin-top: 2px; } + +/* highlight unchecked BSAs */ +QWidget#bsaTab QTreeWidget::indicator:unchecked { + background-color: #CC6600; } + +/* increase version textfield */ +QLineEdit#versionEdit { + max-width: 100px; } + +/* Dialogs width changes */ +/* increase width to prevent buttons cutting */ +QDialog#QueryOverwriteDialog { + min-width: 565px; } + +QDialog#ModInfoDialog { + min-width: 850px; } diff --git a/src/stylesheets/vs15 Dark-Purple.qss b/src/stylesheets/vs15 Dark-Purple.qss new file mode 100644 index 00000000..c186ae55 --- /dev/null +++ b/src/stylesheets/vs15 Dark-Purple.qss @@ -0,0 +1,753 @@ +/*!************************************* + VS15 Dark +**************************************** + Author: chintsu_kun + Version: 1.3.1 + Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) + Url: https://github.com/nikolay-borzov/modorganizer-themes +**************************************** +*/ +/* or #434346*/ +/*base*/ +/*#3399FF*/ +/*#007ACC*/ +/*#1C97EA*/ +/*#3C7FB1*/ +/*#BEE6FD*/ +/* Main Window */ +QWidget { + background-color: #2D2D30; + color: #F1F1F1; } + QWidget::disabled { + color: #656565; } + +/* Common */ +/* FIX: For some reason applying background-color or border fixes paddings properties */ +QListView::item, +QTreeView#espList::item, +QTreeWidget#categoriesList::item { + border-width: 0; } + +/* remove outline */ +* { + outline: 0; } + +*:disabled, +QListView::item:disabled, +*::item:selected:disabled { + color: #656565; } + +/* line heights */ +/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +QTreeView#modList::item, +QTreeWidget#categoriesTree::item, +#tabConflicts QTreeWidget::item { + padding: 0.3em 0; } + +QListView::item, +QTreeView#espList::item { + padding: 0.3em; } + +/* to enable border color */ +QTreeView, +QListView, +QTextEdit, +QWebView, +QTableView { + border-style: solid; + border-width: 1px; } + +QAbstractItemView { + color: #DCDCDC; + background-color: #1E1E1E; + alternate-background-color: #262626; + border-color: #3F3F46; } + QAbstractItemView::item:selected, QAbstractItemView::item:selected:hover { + background-color: #7E2AD2; + color: #F1F1F1; } + +QAbstractItemView, +QListView, +QTreeView { + show-decoration-selected: 1; } + +QAbstractItemView::item:hover, +QListView::item:hover, +QTreeView::branch:hover, +QTreeWidget::item:hover { + background-color: rgba(126, 42, 210, 0.3); } + +QAbstractItemView::item:selected:disabled, +QListView::item:selected:disabled, +QTreeView::branch:selected:disabled, +QTreeWidget::item:selected:disabled { + background-color: rgba(126, 42, 210, 0.3); } + +QTreeView::branch:selected { + background-color: #7E2AD2; } + +QLabel { + background-color: transparent; } + +/* Left Pane & File Trees #QTreeView, #QListView*/ +QTreeView::branch:closed:has-children { + image: url(./vs15/branch-closed.png); } + +QTreeView::branch:open:has-children { + image: url(./vs15/branch-open.png); } + +/*QListView::item:hover { } +QListView::item:selected { }*/ +QListView::item { + color: #F1F1F1; } + +/* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ +/* Common */ +QTextEdit, +QWebView, +QLineEdit, +QAbstractSpinBox, +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button, +QComboBox { + background-color: #333337; + border-color: #3F3F46; } + +QLineEdit:hover, +QAbstractSpinBox:hover, +QTextEdit:hover, +QComboBox:hover, +QComboBox:editable:hover { + border-color: #7E2AD2; } + +QLineEdit:focus, +QAbstractSpinBox::focus, +QTextEdit:focus, +QComboBox:focus, +QComboBox:editable:focus, +QComboBox:on { + background-color: #3F3F46; + border-color: #7E2AD2; } + +QComboBox:on { + border-bottom-color: #3F3F46; } + +QLineEdit, +QAbstractSpinBox { + min-height: 15px; + padding: 2px; + border-style: solid; + border-width: 1px; } + +QLineEdit { + margin-top: 0; } + +/* clear button */ +QLineEdit QToolButton, +QLineEdit QToolButton:hover { + background: none; + margin-top: 1px; } + +QLineEdit#espFilterEdit QToolButton { + margin-top: -2px; + margin-bottom: 1px; } + +/* Dropdowns #QComboBox*/ +QComboBox { + min-height: 20px; + padding-left: 5px; + margin: 3px 0 1px 0; + border-style: solid; + border-width: 1px; } + QComboBox:editable { + padding-left: 3px; + /* to enable hover styles */ + background-color: transparent; } + QComboBox::drop-down { + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; + /* If you need to set style for drop down button + &:on, + &:editable:hover { + background-color: red; + } */ } + QComboBox::down-arrow { + image: url(./vs15/combobox-down.png); } + QComboBox QAbstractItemView { + background-color: #1B1B1C; + selection-background-color: #3F3F46; + border-color: #7E2AD2; + border-style: solid; + border-width: 0 1px 1px 1px; } + +/* doesn't work http://stackoverflow.com/questions/13308341/qcombobox-abstractitemviewitem*/ +/*QComboBox QAbstractItemView:item { + padding: 10px; + margin: 10px; +}*/ +/* Toolbar */ +QToolBar { + border: none; } + +QToolBar::separator { + border-left-color: #222222; + border-right-color: #46464A; + border-width: 0 1px 0 1px; + border-style: solid; + width: 0; } + +QToolButton { + margin: 0 4px 0 4px; + padding: 5px; } + QToolButton:hover, QToolButton:focus { + background-color: #3E3E40; + /* need this to make background-color works*/ + border: none; } + QToolButton:pressed { + background-color: #7E2AD2; + /* need this to make background-color works*/ + border: none; } + +/* Group Boxes #QGroupBox */ +QGroupBox { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; + padding: 1em .3em .3em .3em; + margin-top: .65em; } + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 2px; + left: 10px; } + +/* LCD Count */ +QLCDNumber { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Buttons #QPushButton */ +QPushButton { + background-color: #333337; + border-color: #3F3F46; + min-height: 18px; + padding: 2px 5px; + border-style: solid; + border-width: 1px; } + +QPushButton:hover, +QPushButton:checked, +QPushButton:focus, +QAbstractSpinBox::up-button:hover, +QAbstractSpinBox::down-button:hover { + background-color: #7E2AD2; } + +QPushButton:pressed, +QPushButton:checked:hover, +QAbstractSpinBox::up-button:pressed, +QAbstractSpinBox::down-button:pressed { + background-color: #8b3dd8; } + +QPushButton:disabled, +QAbstractSpinBox::up-button:disabled, +QAbstractSpinBox::down-button:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QPushButton::menu-indicator { + image: url(./vs15/combobox-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; } + +/* dialog buttons */ +/* Common */ +QDialog QPushButton, +QSlider::handle:horizontal, +QSlider::handle:vertical { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QDialog QPushButton:hover, +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover, +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #e4d2f6; + border-color: #8635d7; } + +QSlider::handle:horizontal:focus:!pressed, +QSlider::handle:vertical:focus:!pressed, +QDialog QPushButton:focus, +QDialog QPushButton:checked { + background-color: #DDDDDD; + border-color: #7E2AD2; } + +QDialog QPushButton:disabled, +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QDialog QPushButton { + min-width: 1.5em; + padding-left: .5em; + padding-right: .5em; } + +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/*common*/ +QGroupBox::indicator, +QTreeView::indicator, +QCheckBox::indicator, +QRadioButton::indicator { + background-color: #2D2D30; + border-color: #3F3F46; + width: 13px; + height: 13px; + border-style: solid; + border-width: 1px; } + QGroupBox::indicator:hover, + QTreeView::indicator:hover, + QCheckBox::indicator:hover, + QRadioButton::indicator:hover { + background-color: #3F3F46; + border-color: #7E2AD2; } + +QGroupBox::indicator:checked, +QTreeView::indicator:checked, +QCheckBox::indicator:checked { + image: url(./vs15/checkbox-check.png); } + +QGroupBox::indicator:disabled, +QTreeView::indicator:checked:disabled, +QCheckBox::indicator:checked:disabled { + image: url(./vs15/checkbox-check-disabled.png); } + +/* Checkboxes special */ +QTreeView#modList::indicator { + width: 15px; + height: 15px; } + +/* Radio buttons #QRadioButton */ +QRadioButton::indicator { + border-radius: 7px; } + QRadioButton::indicator::checked { + background-color: #B9B9BA; + border-width: 2px; + width: 11px; + height: 11px; } + QRadioButton::indicator::checked:hover { + border-color: #3F3F46; } + +/* Spinners #QSpinBox, #QDoubleSpinBox */ +QAbstractSpinBox { + margin: 1px; } + +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; } + +QAbstractSpinBox::up-button { + subcontrol-position: top right; } + +QAbstractSpinBox::up-arrow { + image: url(./vs15/spinner-up.png); } + +QAbstractSpinBox::down-button { + subcontrol-position: bottom right; } + +QAbstractSpinBox::down-arrow { + image: url(./vs15/spinner-down.png); } + +/* Sliders #QSlider */ +QSlider::groove:horizontal { + background-color: #3F3F46; + border: none; + height: 8px; + margin: 2px 0; } + +QSlider::handle:horizontal { + width: .5em; + height: 2em; + margin: -7px 0; + subcontrol-origin: margin; } + +/* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ +/* assigning background still leaves not filled area*/ +QAbstractScrollArea::corner { + background-color: transparent; } + +/* Horizontal */ +QScrollBar:horizontal { + height: 18px; + border: none; + margin: 0 23px 0 23px; } + +QScrollBar::handle:horizontal { + min-width: 32px; + margin: 4px 2px; } + +QScrollBar::add-line:horizontal { + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; } + +QScrollBar::sub-line:horizontal { + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; } + +/* Vertical */ +QScrollBar:vertical { + width: 20px; + border: none; + margin: 23px 0 23px 0; } + +QScrollBar::handle:vertical { + min-height: 32px; + margin: 2px 4px; } + +QScrollBar::add-line:vertical { + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; } + +QScrollBar::sub-line:vertical { + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; } + +/* Combined */ +QScrollBar { + background-color: #3E3E42; + border: none; } + +QScrollBar::handle { + background-color: #686868; } + +QScrollBar::add-line, +QScrollBar::sub-line { + background-color: #3E3E42; + border: none; } + +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { }*/ +QScrollBar::handle:hover { + background: #9E9E9E; } + +QScrollBar::handle:pressed { + background: #EFEBEF; } + +QScrollBar::handle:disabled { + background: #555558; } + +QScrollBar::add-page, +QScrollBar::sub-page { + background: transparent; } + +QScrollBar::up-arrow:vertical { + image: url(./vs15/scrollbar-up.png); } + +QScrollBar::up-arrow:vertical:hover { + image: url(./vs15/scrollbar-up-hover.png); } + +QScrollBar::up-arrow:vertical:disabled { + image: url(./vs15/scrollbar-up-disabled.png); } + +QScrollBar::right-arrow:horizontal { + image: url(./vs15/scrollbar-right.png); } + +QScrollBar::right-arrow:horizontal:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QScrollBar::right-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-right-disabled.png); } + +QScrollBar::down-arrow:vertical { + image: url(./vs15/scrollbar-down.png); } + +QScrollBar::down-arrow:vertical:hover { + image: url(./vs15/scrollbar-down-hover.png); } + +QScrollBar::down-arrow:vertical:disabled { + image: url(./vs15/scrollbar-down-disabled.png); } + +QScrollBar::left-arrow:horizontal { + image: url(./vs15/scrollbar-left.png); } + +QScrollBar::left-arrow:horizontal:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +QScrollBar::left-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-left-disabled.png); } + +/* Scroll Area #QScrollArea*/ +QScrollArea { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Header Rows and Tables (Configure Mod Categories) #QTableView, #QHeaderView */ +QTableView { + gridline-color: #3F3F46; + selection-background-color: #7E2AD2; + selection-color: #F1F1F1; } + +QTableView QTableCornerButton::section { + background: #252526; + border-color: #3F3F46; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView { + border: none; } + +QHeaderView::section { + background: #252526; + border-color: #3F3F46; + padding: 3px 5px; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView::section:hover { + background: #3E3E40; + color: #F6F6F6; } + +/*QHeaderView::section:first { }*/ +QHeaderView::section:last { + border-right: 0; } + +QHeaderView::up-arrow { + image: url(./vs15/sort-asc.png); + margin-bottom: -37px; } + +QTreeView#downloadView QHeaderView::up-arrow { + margin-bottom: -32px; } + +QHeaderView::down-arrow { + image: url(./vs15/sort-desc.png); + margin-bottom: 0; } + +/* Context menus, toolbar dropdowns #QMenu */ +QMenu { + background-color: #1A1A1C; + border-color: #333337; + border-style: solid; + border-width: 1px; + padding: 2px; } + +QMenu::item { + background: transparent; + padding: 4px 20px; } + +QMenu::item:selected { + background-color: #333334; } + +QMenu::item:disabled { + background-color: transparent; } + +QMenu::separator { + background-color: #333337; + height: 1px; + margin: 1px 0; } + +QMenu::icon { + margin: 1px; } + +QMenu::right-arrow { + image: url(./vs15/sub-menu-arrow.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: .5em; } + +QMenu QPushButton { + background-color: transparent; + border-color: #3F3F46; + margin: 1px 0 1px 0; } + +QMenu QCheckBox, +QMenu QRadioButton { + background-color: transparent; + padding: 5px 2px; } + +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +QToolTip, +SaveGameInfoWidget { + background-color: #424245; + border-color: #4D4D50; + color: #F1F1F1; + border-style: solid; + border-width: 1px; + padding: 2px; } + +/* Progress Bars (Downloads) #QProgressBar */ +QProgressBar { + background-color: #E6E6E6; + color: #000; + border-color: #BCBCBC; + text-align: center; + border-style: solid; + border-width: 1px; + margin: 0 10px; } + +QProgressBar::chunk { + background: #06B025; } + +/* Right Pane and Tab Bars #QTabWidget, #QTabBar */ +QTabWidget::pane { + border-color: #3F3F46; + border-top-color: #7E2AD2; + top: 0; + border-style: solid; + border-width: 1px; } + +QTabWidget::pane:disabled { + border-top-color: #3F3F46; } + +/*QTabWidget::tab-bar { }*/ +QTabBar::tab { + background-color: transparent; + padding: 4px 1em; + border: none; } + +QTabBar::tab:hover { + background-color: #8b3dd8; } + +QTabBar::tab:selected, +QTabBar::tab:selected:hover { + background-color: #7E2AD2; } + +QTabBar::tab:disabled { + background-color: transparent; + color: #656565; } + +QTabBar::tab:selected:disabled { + background-color: #3F3F46; } + +/* scrollers */ +QTabBar QToolButton { + background-color: #333337; + border-color: #3F3F46; + padding: 1px; + margin: 0; + border-style: solid; + border-width: 1px; } + +QTabBar QToolButton:hover { + border-color: #7E2AD2; + border-width: 1px; + border-style: solid; } + +QTabBar QToolButton:disabled, +QTabBar QToolButton:pressed:hover { + background-color: #333337; } + +/*QTabBar::tear { }*/ +QTabBar::scroller { + width: 23px; + background-color: red; } + +QTabBar QToolButton::right-arrow { + image: url(./vs15/scrollbar-right.png); } + +QTabBar QToolButton::right-arrow:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QTabBar QToolButton::left-arrow { + image: url(./vs15/scrollbar-left.png); } + +QTabBar QToolButton::left-arrow:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +/* Special styles */ +/* fix margins on tabs pane */ +QLineEdit#espFilterEdit { + margin: 0 0 6px 0; } + +QTreeView#downloadView { + margin: 4px 4px 0 4px; } + +QCheckBox#showHiddenBox { + margin: 0 0 4px 4px; } + +QLineEdit#downloadFilterEdit { + margin: 0 4px 4px 0; } + +QWidget#tabImages QPushButton { + background-color: transparent; + margin: 0 .3em; + padding: 0; } + +/* like dialog QPushButton*/ +QWidget#tabESPs QToolButton { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QWidget#tabESPs QToolButton:hover { + background-color: #e4d2f6; + border-color: #8635d7; } + +QWidget#tabESPs QToolButton:focus { + background-color: #DDDDDD; + border-color: #7E2AD2; } + +QWidget#tabESPs QToolButton:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QTreeWidget#categoriesList { + /*min-width: 225px;*/ } + +QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: .35em 10px; } + +QTreeWidget#categoriesList::item:has-children { + background-image: url(./vs15/branch-closed.png); } + +QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./vs15/branch-open.png); } + +QDialog#QueryOverwriteDialog QPushButton { + margin-left: .5em; } + +QDialog#PyCfgDialog QPushButton:hover { + background-color: #e4d2f6; } + +QLineEdit#modFilterEdit { + margin-top: 2px; } + +/* highlight unchecked BSAs */ +QWidget#bsaTab QTreeWidget::indicator:unchecked { + background-color: #7E2AD2; } + +/* increase version textfield */ +QLineEdit#versionEdit { + max-width: 100px; } + +/* Dialogs width changes */ +/* increase width to prevent buttons cutting */ +QDialog#QueryOverwriteDialog { + min-width: 565px; } + +QDialog#ModInfoDialog { + min-width: 850px; } diff --git a/src/stylesheets/vs15 Dark-Red.qss b/src/stylesheets/vs15 Dark-Red.qss new file mode 100644 index 00000000..18ef91f0 --- /dev/null +++ b/src/stylesheets/vs15 Dark-Red.qss @@ -0,0 +1,753 @@ +/*!************************************* + VS15 Dark +**************************************** + Author: chintsu_kun + Version: 1.3.1 + Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) + Url: https://github.com/nikolay-borzov/modorganizer-themes +**************************************** +*/ +/* or #434346*/ +/*base*/ +/*#3399FF*/ +/*#007ACC*/ +/*#1C97EA*/ +/*#3C7FB1*/ +/*#BEE6FD*/ +/* Main Window */ +QWidget { + background-color: #2D2D30; + color: #F1F1F1; } + QWidget::disabled { + color: #656565; } + +/* Common */ +/* FIX: For some reason applying background-color or border fixes paddings properties */ +QListView::item, +QTreeView#espList::item, +QTreeWidget#categoriesList::item { + border-width: 0; } + +/* remove outline */ +* { + outline: 0; } + +*:disabled, +QListView::item:disabled, +*::item:selected:disabled { + color: #656565; } + +/* line heights */ +/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +QTreeView#modList::item, +QTreeWidget#categoriesTree::item, +#tabConflicts QTreeWidget::item { + padding: 0.3em 0; } + +QListView::item, +QTreeView#espList::item { + padding: 0.3em; } + +/* to enable border color */ +QTreeView, +QListView, +QTextEdit, +QWebView, +QTableView { + border-style: solid; + border-width: 1px; } + +QAbstractItemView { + color: #DCDCDC; + background-color: #1E1E1E; + alternate-background-color: #262626; + border-color: #3F3F46; } + QAbstractItemView::item:selected, QAbstractItemView::item:selected:hover { + background-color: #990000; + color: #F1F1F1; } + +QAbstractItemView, +QListView, +QTreeView { + show-decoration-selected: 1; } + +QAbstractItemView::item:hover, +QListView::item:hover, +QTreeView::branch:hover, +QTreeWidget::item:hover { + background-color: rgba(153, 0, 0, 0.3); } + +QAbstractItemView::item:selected:disabled, +QListView::item:selected:disabled, +QTreeView::branch:selected:disabled, +QTreeWidget::item:selected:disabled { + background-color: rgba(153, 0, 0, 0.3); } + +QTreeView::branch:selected { + background-color: #990000; } + +QLabel { + background-color: transparent; } + +/* Left Pane & File Trees #QTreeView, #QListView*/ +QTreeView::branch:closed:has-children { + image: url(./vs15/branch-closed.png); } + +QTreeView::branch:open:has-children { + image: url(./vs15/branch-open.png); } + +/*QListView::item:hover { } +QListView::item:selected { }*/ +QListView::item { + color: #F1F1F1; } + +/* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ +/* Common */ +QTextEdit, +QWebView, +QLineEdit, +QAbstractSpinBox, +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button, +QComboBox { + background-color: #333337; + border-color: #3F3F46; } + +QLineEdit:hover, +QAbstractSpinBox:hover, +QTextEdit:hover, +QComboBox:hover, +QComboBox:editable:hover { + border-color: #990000; } + +QLineEdit:focus, +QAbstractSpinBox::focus, +QTextEdit:focus, +QComboBox:focus, +QComboBox:editable:focus, +QComboBox:on { + background-color: #3F3F46; + border-color: #990000; } + +QComboBox:on { + border-bottom-color: #3F3F46; } + +QLineEdit, +QAbstractSpinBox { + min-height: 15px; + padding: 2px; + border-style: solid; + border-width: 1px; } + +QLineEdit { + margin-top: 0; } + +/* clear button */ +QLineEdit QToolButton, +QLineEdit QToolButton:hover { + background: none; + margin-top: 1px; } + +QLineEdit#espFilterEdit QToolButton { + margin-top: -2px; + margin-bottom: 1px; } + +/* Dropdowns #QComboBox*/ +QComboBox { + min-height: 20px; + padding-left: 5px; + margin: 3px 0 1px 0; + border-style: solid; + border-width: 1px; } + QComboBox:editable { + padding-left: 3px; + /* to enable hover styles */ + background-color: transparent; } + QComboBox::drop-down { + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; + /* If you need to set style for drop down button + &:on, + &:editable:hover { + background-color: red; + } */ } + QComboBox::down-arrow { + image: url(./vs15/combobox-down.png); } + QComboBox QAbstractItemView { + background-color: #1B1B1C; + selection-background-color: #3F3F46; + border-color: #990000; + border-style: solid; + border-width: 0 1px 1px 1px; } + +/* doesn't work http://stackoverflow.com/questions/13308341/qcombobox-abstractitemviewitem*/ +/*QComboBox QAbstractItemView:item { + padding: 10px; + margin: 10px; +}*/ +/* Toolbar */ +QToolBar { + border: none; } + +QToolBar::separator { + border-left-color: #222222; + border-right-color: #46464A; + border-width: 0 1px 0 1px; + border-style: solid; + width: 0; } + +QToolButton { + margin: 0 4px 0 4px; + padding: 5px; } + QToolButton:hover, QToolButton:focus { + background-color: #3E3E40; + /* need this to make background-color works*/ + border: none; } + QToolButton:pressed { + background-color: #990000; + /* need this to make background-color works*/ + border: none; } + +/* Group Boxes #QGroupBox */ +QGroupBox { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; + padding: 1em .3em .3em .3em; + margin-top: .65em; } + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 2px; + left: 10px; } + +/* LCD Count */ +QLCDNumber { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Buttons #QPushButton */ +QPushButton { + background-color: #333337; + border-color: #3F3F46; + min-height: 18px; + padding: 2px 5px; + border-style: solid; + border-width: 1px; } + +QPushButton:hover, +QPushButton:checked, +QPushButton:focus, +QAbstractSpinBox::up-button:hover, +QAbstractSpinBox::down-button:hover { + background-color: #990000; } + +QPushButton:pressed, +QPushButton:checked:hover, +QAbstractSpinBox::up-button:pressed, +QAbstractSpinBox::down-button:pressed { + background-color: #b30000; } + +QPushButton:disabled, +QAbstractSpinBox::up-button:disabled, +QAbstractSpinBox::down-button:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QPushButton::menu-indicator { + image: url(./vs15/combobox-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; } + +/* dialog buttons */ +/* Common */ +QDialog QPushButton, +QSlider::handle:horizontal, +QSlider::handle:vertical { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QDialog QPushButton:hover, +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover, +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #ffcccc; + border-color: #a80000; } + +QSlider::handle:horizontal:focus:!pressed, +QSlider::handle:vertical:focus:!pressed, +QDialog QPushButton:focus, +QDialog QPushButton:checked { + background-color: #DDDDDD; + border-color: #990000; } + +QDialog QPushButton:disabled, +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QDialog QPushButton { + min-width: 1.5em; + padding-left: .5em; + padding-right: .5em; } + +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/*common*/ +QGroupBox::indicator, +QTreeView::indicator, +QCheckBox::indicator, +QRadioButton::indicator { + background-color: #2D2D30; + border-color: #3F3F46; + width: 13px; + height: 13px; + border-style: solid; + border-width: 1px; } + QGroupBox::indicator:hover, + QTreeView::indicator:hover, + QCheckBox::indicator:hover, + QRadioButton::indicator:hover { + background-color: #3F3F46; + border-color: #990000; } + +QGroupBox::indicator:checked, +QTreeView::indicator:checked, +QCheckBox::indicator:checked { + image: url(./vs15/checkbox-check.png); } + +QGroupBox::indicator:disabled, +QTreeView::indicator:checked:disabled, +QCheckBox::indicator:checked:disabled { + image: url(./vs15/checkbox-check-disabled.png); } + +/* Checkboxes special */ +QTreeView#modList::indicator { + width: 15px; + height: 15px; } + +/* Radio buttons #QRadioButton */ +QRadioButton::indicator { + border-radius: 7px; } + QRadioButton::indicator::checked { + background-color: #B9B9BA; + border-width: 2px; + width: 11px; + height: 11px; } + QRadioButton::indicator::checked:hover { + border-color: #3F3F46; } + +/* Spinners #QSpinBox, #QDoubleSpinBox */ +QAbstractSpinBox { + margin: 1px; } + +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; } + +QAbstractSpinBox::up-button { + subcontrol-position: top right; } + +QAbstractSpinBox::up-arrow { + image: url(./vs15/spinner-up.png); } + +QAbstractSpinBox::down-button { + subcontrol-position: bottom right; } + +QAbstractSpinBox::down-arrow { + image: url(./vs15/spinner-down.png); } + +/* Sliders #QSlider */ +QSlider::groove:horizontal { + background-color: #3F3F46; + border: none; + height: 8px; + margin: 2px 0; } + +QSlider::handle:horizontal { + width: .5em; + height: 2em; + margin: -7px 0; + subcontrol-origin: margin; } + +/* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ +/* assigning background still leaves not filled area*/ +QAbstractScrollArea::corner { + background-color: transparent; } + +/* Horizontal */ +QScrollBar:horizontal { + height: 18px; + border: none; + margin: 0 23px 0 23px; } + +QScrollBar::handle:horizontal { + min-width: 32px; + margin: 4px 2px; } + +QScrollBar::add-line:horizontal { + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; } + +QScrollBar::sub-line:horizontal { + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; } + +/* Vertical */ +QScrollBar:vertical { + width: 20px; + border: none; + margin: 23px 0 23px 0; } + +QScrollBar::handle:vertical { + min-height: 32px; + margin: 2px 4px; } + +QScrollBar::add-line:vertical { + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; } + +QScrollBar::sub-line:vertical { + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; } + +/* Combined */ +QScrollBar { + background-color: #3E3E42; + border: none; } + +QScrollBar::handle { + background-color: #686868; } + +QScrollBar::add-line, +QScrollBar::sub-line { + background-color: #3E3E42; + border: none; } + +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { }*/ +QScrollBar::handle:hover { + background: #9E9E9E; } + +QScrollBar::handle:pressed { + background: #EFEBEF; } + +QScrollBar::handle:disabled { + background: #555558; } + +QScrollBar::add-page, +QScrollBar::sub-page { + background: transparent; } + +QScrollBar::up-arrow:vertical { + image: url(./vs15/scrollbar-up.png); } + +QScrollBar::up-arrow:vertical:hover { + image: url(./vs15/scrollbar-up-hover.png); } + +QScrollBar::up-arrow:vertical:disabled { + image: url(./vs15/scrollbar-up-disabled.png); } + +QScrollBar::right-arrow:horizontal { + image: url(./vs15/scrollbar-right.png); } + +QScrollBar::right-arrow:horizontal:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QScrollBar::right-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-right-disabled.png); } + +QScrollBar::down-arrow:vertical { + image: url(./vs15/scrollbar-down.png); } + +QScrollBar::down-arrow:vertical:hover { + image: url(./vs15/scrollbar-down-hover.png); } + +QScrollBar::down-arrow:vertical:disabled { + image: url(./vs15/scrollbar-down-disabled.png); } + +QScrollBar::left-arrow:horizontal { + image: url(./vs15/scrollbar-left.png); } + +QScrollBar::left-arrow:horizontal:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +QScrollBar::left-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-left-disabled.png); } + +/* Scroll Area #QScrollArea*/ +QScrollArea { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Header Rows and Tables (Configure Mod Categories) #QTableView, #QHeaderView */ +QTableView { + gridline-color: #3F3F46; + selection-background-color: #990000; + selection-color: #F1F1F1; } + +QTableView QTableCornerButton::section { + background: #252526; + border-color: #3F3F46; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView { + border: none; } + +QHeaderView::section { + background: #252526; + border-color: #3F3F46; + padding: 3px 5px; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView::section:hover { + background: #3E3E40; + color: #F6F6F6; } + +/*QHeaderView::section:first { }*/ +QHeaderView::section:last { + border-right: 0; } + +QHeaderView::up-arrow { + image: url(./vs15/sort-asc.png); + margin-bottom: -37px; } + +QTreeView#downloadView QHeaderView::up-arrow { + margin-bottom: -32px; } + +QHeaderView::down-arrow { + image: url(./vs15/sort-desc.png); + margin-bottom: 0; } + +/* Context menus, toolbar dropdowns #QMenu */ +QMenu { + background-color: #1A1A1C; + border-color: #333337; + border-style: solid; + border-width: 1px; + padding: 2px; } + +QMenu::item { + background: transparent; + padding: 4px 20px; } + +QMenu::item:selected { + background-color: #333334; } + +QMenu::item:disabled { + background-color: transparent; } + +QMenu::separator { + background-color: #333337; + height: 1px; + margin: 1px 0; } + +QMenu::icon { + margin: 1px; } + +QMenu::right-arrow { + image: url(./vs15/sub-menu-arrow.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: .5em; } + +QMenu QPushButton { + background-color: transparent; + border-color: #3F3F46; + margin: 1px 0 1px 0; } + +QMenu QCheckBox, +QMenu QRadioButton { + background-color: transparent; + padding: 5px 2px; } + +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +QToolTip, +SaveGameInfoWidget { + background-color: #424245; + border-color: #4D4D50; + color: #F1F1F1; + border-style: solid; + border-width: 1px; + padding: 2px; } + +/* Progress Bars (Downloads) #QProgressBar */ +QProgressBar { + background-color: #E6E6E6; + color: #000; + border-color: #BCBCBC; + text-align: center; + border-style: solid; + border-width: 1px; + margin: 0 10px; } + +QProgressBar::chunk { + background: #06B025; } + +/* Right Pane and Tab Bars #QTabWidget, #QTabBar */ +QTabWidget::pane { + border-color: #3F3F46; + border-top-color: #990000; + top: 0; + border-style: solid; + border-width: 1px; } + +QTabWidget::pane:disabled { + border-top-color: #3F3F46; } + +/*QTabWidget::tab-bar { }*/ +QTabBar::tab { + background-color: transparent; + padding: 4px 1em; + border: none; } + +QTabBar::tab:hover { + background-color: #b30000; } + +QTabBar::tab:selected, +QTabBar::tab:selected:hover { + background-color: #990000; } + +QTabBar::tab:disabled { + background-color: transparent; + color: #656565; } + +QTabBar::tab:selected:disabled { + background-color: #3F3F46; } + +/* scrollers */ +QTabBar QToolButton { + background-color: #333337; + border-color: #3F3F46; + padding: 1px; + margin: 0; + border-style: solid; + border-width: 1px; } + +QTabBar QToolButton:hover { + border-color: #990000; + border-width: 1px; + border-style: solid; } + +QTabBar QToolButton:disabled, +QTabBar QToolButton:pressed:hover { + background-color: #333337; } + +/*QTabBar::tear { }*/ +QTabBar::scroller { + width: 23px; + background-color: red; } + +QTabBar QToolButton::right-arrow { + image: url(./vs15/scrollbar-right.png); } + +QTabBar QToolButton::right-arrow:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QTabBar QToolButton::left-arrow { + image: url(./vs15/scrollbar-left.png); } + +QTabBar QToolButton::left-arrow:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +/* Special styles */ +/* fix margins on tabs pane */ +QLineEdit#espFilterEdit { + margin: 0 0 6px 0; } + +QTreeView#downloadView { + margin: 4px 4px 0 4px; } + +QCheckBox#showHiddenBox { + margin: 0 0 4px 4px; } + +QLineEdit#downloadFilterEdit { + margin: 0 4px 4px 0; } + +QWidget#tabImages QPushButton { + background-color: transparent; + margin: 0 .3em; + padding: 0; } + +/* like dialog QPushButton*/ +QWidget#tabESPs QToolButton { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QWidget#tabESPs QToolButton:hover { + background-color: #ffcccc; + border-color: #a80000; } + +QWidget#tabESPs QToolButton:focus { + background-color: #DDDDDD; + border-color: #990000; } + +QWidget#tabESPs QToolButton:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QTreeWidget#categoriesList { + /*min-width: 225px;*/ } + +QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: .35em 10px; } + +QTreeWidget#categoriesList::item:has-children { + background-image: url(./vs15/branch-closed.png); } + +QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./vs15/branch-open.png); } + +QDialog#QueryOverwriteDialog QPushButton { + margin-left: .5em; } + +QDialog#PyCfgDialog QPushButton:hover { + background-color: #ffcccc; } + +QLineEdit#modFilterEdit { + margin-top: 2px; } + +/* highlight unchecked BSAs */ +QWidget#bsaTab QTreeWidget::indicator:unchecked { + background-color: #990000; } + +/* increase version textfield */ +QLineEdit#versionEdit { + max-width: 100px; } + +/* Dialogs width changes */ +/* increase width to prevent buttons cutting */ +QDialog#QueryOverwriteDialog { + min-width: 565px; } + +QDialog#ModInfoDialog { + min-width: 850px; } diff --git a/src/stylesheets/vs15 Dark-Yellow.qss b/src/stylesheets/vs15 Dark-Yellow.qss new file mode 100644 index 00000000..e7976e42 --- /dev/null +++ b/src/stylesheets/vs15 Dark-Yellow.qss @@ -0,0 +1,753 @@ +/*!************************************* + VS15 Dark +**************************************** + Author: chintsu_kun + Version: 1.3.1 + Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) + Url: https://github.com/nikolay-borzov/modorganizer-themes +**************************************** +*/ +/* or #434346*/ +/*base*/ +/*#3399FF*/ +/*#007ACC*/ +/*#1C97EA*/ +/*#3C7FB1*/ +/*#BEE6FD*/ +/* Main Window */ +QWidget { + background-color: #2D2D30; + color: #F1F1F1; } + QWidget::disabled { + color: #656565; } + +/* Common */ +/* FIX: For some reason applying background-color or border fixes paddings properties */ +QListView::item, +QTreeView#espList::item, +QTreeWidget#categoriesList::item { + border-width: 0; } + +/* remove outline */ +* { + outline: 0; } + +*:disabled, +QListView::item:disabled, +*::item:selected:disabled { + color: #656565; } + +/* line heights */ +/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +QTreeView#modList::item, +QTreeWidget#categoriesTree::item, +#tabConflicts QTreeWidget::item { + padding: 0.3em 0; } + +QListView::item, +QTreeView#espList::item { + padding: 0.3em; } + +/* to enable border color */ +QTreeView, +QListView, +QTextEdit, +QWebView, +QTableView { + border-style: solid; + border-width: 1px; } + +QAbstractItemView { + color: #DCDCDC; + background-color: #1E1E1E; + alternate-background-color: #262626; + border-color: #3F3F46; } + QAbstractItemView::item:selected, QAbstractItemView::item:selected:hover { + background-color: #9A9A00; + color: #F1F1F1; } + +QAbstractItemView, +QListView, +QTreeView { + show-decoration-selected: 1; } + +QAbstractItemView::item:hover, +QListView::item:hover, +QTreeView::branch:hover, +QTreeWidget::item:hover { + background-color: rgba(154, 154, 0, 0.3); } + +QAbstractItemView::item:selected:disabled, +QListView::item:selected:disabled, +QTreeView::branch:selected:disabled, +QTreeWidget::item:selected:disabled { + background-color: rgba(154, 154, 0, 0.3); } + +QTreeView::branch:selected { + background-color: #9A9A00; } + +QLabel { + background-color: transparent; } + +/* Left Pane & File Trees #QTreeView, #QListView*/ +QTreeView::branch:closed:has-children { + image: url(./vs15/branch-closed.png); } + +QTreeView::branch:open:has-children { + image: url(./vs15/branch-open.png); } + +/*QListView::item:hover { } +QListView::item:selected { }*/ +QListView::item { + color: #F1F1F1; } + +/* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ +/* Common */ +QTextEdit, +QWebView, +QLineEdit, +QAbstractSpinBox, +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button, +QComboBox { + background-color: #333337; + border-color: #3F3F46; } + +QLineEdit:hover, +QAbstractSpinBox:hover, +QTextEdit:hover, +QComboBox:hover, +QComboBox:editable:hover { + border-color: #9A9A00; } + +QLineEdit:focus, +QAbstractSpinBox::focus, +QTextEdit:focus, +QComboBox:focus, +QComboBox:editable:focus, +QComboBox:on { + background-color: #3F3F46; + border-color: #9A9A00; } + +QComboBox:on { + border-bottom-color: #3F3F46; } + +QLineEdit, +QAbstractSpinBox { + min-height: 15px; + padding: 2px; + border-style: solid; + border-width: 1px; } + +QLineEdit { + margin-top: 0; } + +/* clear button */ +QLineEdit QToolButton, +QLineEdit QToolButton:hover { + background: none; + margin-top: 1px; } + +QLineEdit#espFilterEdit QToolButton { + margin-top: -2px; + margin-bottom: 1px; } + +/* Dropdowns #QComboBox*/ +QComboBox { + min-height: 20px; + padding-left: 5px; + margin: 3px 0 1px 0; + border-style: solid; + border-width: 1px; } + QComboBox:editable { + padding-left: 3px; + /* to enable hover styles */ + background-color: transparent; } + QComboBox::drop-down { + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; + /* If you need to set style for drop down button + &:on, + &:editable:hover { + background-color: red; + } */ } + QComboBox::down-arrow { + image: url(./vs15/combobox-down.png); } + QComboBox QAbstractItemView { + background-color: #1B1B1C; + selection-background-color: #3F3F46; + border-color: #9A9A00; + border-style: solid; + border-width: 0 1px 1px 1px; } + +/* doesn't work http://stackoverflow.com/questions/13308341/qcombobox-abstractitemviewitem*/ +/*QComboBox QAbstractItemView:item { + padding: 10px; + margin: 10px; +}*/ +/* Toolbar */ +QToolBar { + border: none; } + +QToolBar::separator { + border-left-color: #222222; + border-right-color: #46464A; + border-width: 0 1px 0 1px; + border-style: solid; + width: 0; } + +QToolButton { + margin: 0 4px 0 4px; + padding: 5px; } + QToolButton:hover, QToolButton:focus { + background-color: #3E3E40; + /* need this to make background-color works*/ + border: none; } + QToolButton:pressed { + background-color: #9A9A00; + /* need this to make background-color works*/ + border: none; } + +/* Group Boxes #QGroupBox */ +QGroupBox { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; + padding: 1em .3em .3em .3em; + margin-top: .65em; } + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 2px; + left: 10px; } + +/* LCD Count */ +QLCDNumber { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Buttons #QPushButton */ +QPushButton { + background-color: #333337; + border-color: #3F3F46; + min-height: 18px; + padding: 2px 5px; + border-style: solid; + border-width: 1px; } + +QPushButton:hover, +QPushButton:checked, +QPushButton:focus, +QAbstractSpinBox::up-button:hover, +QAbstractSpinBox::down-button:hover { + background-color: #9A9A00; } + +QPushButton:pressed, +QPushButton:checked:hover, +QAbstractSpinBox::up-button:pressed, +QAbstractSpinBox::down-button:pressed { + background-color: #b4b400; } + +QPushButton:disabled, +QAbstractSpinBox::up-button:disabled, +QAbstractSpinBox::down-button:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QPushButton::menu-indicator { + image: url(./vs15/combobox-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; } + +/* dialog buttons */ +/* Common */ +QDialog QPushButton, +QSlider::handle:horizontal, +QSlider::handle:vertical { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QDialog QPushButton:hover, +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover, +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #ffffe7; + border-color: #a9a900; } + +QSlider::handle:horizontal:focus:!pressed, +QSlider::handle:vertical:focus:!pressed, +QDialog QPushButton:focus, +QDialog QPushButton:checked { + background-color: #DDDDDD; + border-color: #9A9A00; } + +QDialog QPushButton:disabled, +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QDialog QPushButton { + min-width: 1.5em; + padding-left: .5em; + padding-right: .5em; } + +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/*common*/ +QGroupBox::indicator, +QTreeView::indicator, +QCheckBox::indicator, +QRadioButton::indicator { + background-color: #2D2D30; + border-color: #3F3F46; + width: 13px; + height: 13px; + border-style: solid; + border-width: 1px; } + QGroupBox::indicator:hover, + QTreeView::indicator:hover, + QCheckBox::indicator:hover, + QRadioButton::indicator:hover { + background-color: #3F3F46; + border-color: #9A9A00; } + +QGroupBox::indicator:checked, +QTreeView::indicator:checked, +QCheckBox::indicator:checked { + image: url(./vs15/checkbox-check.png); } + +QGroupBox::indicator:disabled, +QTreeView::indicator:checked:disabled, +QCheckBox::indicator:checked:disabled { + image: url(./vs15/checkbox-check-disabled.png); } + +/* Checkboxes special */ +QTreeView#modList::indicator { + width: 15px; + height: 15px; } + +/* Radio buttons #QRadioButton */ +QRadioButton::indicator { + border-radius: 7px; } + QRadioButton::indicator::checked { + background-color: #B9B9BA; + border-width: 2px; + width: 11px; + height: 11px; } + QRadioButton::indicator::checked:hover { + border-color: #3F3F46; } + +/* Spinners #QSpinBox, #QDoubleSpinBox */ +QAbstractSpinBox { + margin: 1px; } + +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; } + +QAbstractSpinBox::up-button { + subcontrol-position: top right; } + +QAbstractSpinBox::up-arrow { + image: url(./vs15/spinner-up.png); } + +QAbstractSpinBox::down-button { + subcontrol-position: bottom right; } + +QAbstractSpinBox::down-arrow { + image: url(./vs15/spinner-down.png); } + +/* Sliders #QSlider */ +QSlider::groove:horizontal { + background-color: #3F3F46; + border: none; + height: 8px; + margin: 2px 0; } + +QSlider::handle:horizontal { + width: .5em; + height: 2em; + margin: -7px 0; + subcontrol-origin: margin; } + +/* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ +/* assigning background still leaves not filled area*/ +QAbstractScrollArea::corner { + background-color: transparent; } + +/* Horizontal */ +QScrollBar:horizontal { + height: 18px; + border: none; + margin: 0 23px 0 23px; } + +QScrollBar::handle:horizontal { + min-width: 32px; + margin: 4px 2px; } + +QScrollBar::add-line:horizontal { + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; } + +QScrollBar::sub-line:horizontal { + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; } + +/* Vertical */ +QScrollBar:vertical { + width: 20px; + border: none; + margin: 23px 0 23px 0; } + +QScrollBar::handle:vertical { + min-height: 32px; + margin: 2px 4px; } + +QScrollBar::add-line:vertical { + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; } + +QScrollBar::sub-line:vertical { + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; } + +/* Combined */ +QScrollBar { + background-color: #3E3E42; + border: none; } + +QScrollBar::handle { + background-color: #686868; } + +QScrollBar::add-line, +QScrollBar::sub-line { + background-color: #3E3E42; + border: none; } + +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { }*/ +QScrollBar::handle:hover { + background: #9E9E9E; } + +QScrollBar::handle:pressed { + background: #EFEBEF; } + +QScrollBar::handle:disabled { + background: #555558; } + +QScrollBar::add-page, +QScrollBar::sub-page { + background: transparent; } + +QScrollBar::up-arrow:vertical { + image: url(./vs15/scrollbar-up.png); } + +QScrollBar::up-arrow:vertical:hover { + image: url(./vs15/scrollbar-up-hover.png); } + +QScrollBar::up-arrow:vertical:disabled { + image: url(./vs15/scrollbar-up-disabled.png); } + +QScrollBar::right-arrow:horizontal { + image: url(./vs15/scrollbar-right.png); } + +QScrollBar::right-arrow:horizontal:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QScrollBar::right-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-right-disabled.png); } + +QScrollBar::down-arrow:vertical { + image: url(./vs15/scrollbar-down.png); } + +QScrollBar::down-arrow:vertical:hover { + image: url(./vs15/scrollbar-down-hover.png); } + +QScrollBar::down-arrow:vertical:disabled { + image: url(./vs15/scrollbar-down-disabled.png); } + +QScrollBar::left-arrow:horizontal { + image: url(./vs15/scrollbar-left.png); } + +QScrollBar::left-arrow:horizontal:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +QScrollBar::left-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-left-disabled.png); } + +/* Scroll Area #QScrollArea*/ +QScrollArea { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Header Rows and Tables (Configure Mod Categories) #QTableView, #QHeaderView */ +QTableView { + gridline-color: #3F3F46; + selection-background-color: #9A9A00; + selection-color: #F1F1F1; } + +QTableView QTableCornerButton::section { + background: #252526; + border-color: #3F3F46; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView { + border: none; } + +QHeaderView::section { + background: #252526; + border-color: #3F3F46; + padding: 3px 5px; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView::section:hover { + background: #3E3E40; + color: #F6F6F6; } + +/*QHeaderView::section:first { }*/ +QHeaderView::section:last { + border-right: 0; } + +QHeaderView::up-arrow { + image: url(./vs15/sort-asc.png); + margin-bottom: -37px; } + +QTreeView#downloadView QHeaderView::up-arrow { + margin-bottom: -32px; } + +QHeaderView::down-arrow { + image: url(./vs15/sort-desc.png); + margin-bottom: 0; } + +/* Context menus, toolbar dropdowns #QMenu */ +QMenu { + background-color: #1A1A1C; + border-color: #333337; + border-style: solid; + border-width: 1px; + padding: 2px; } + +QMenu::item { + background: transparent; + padding: 4px 20px; } + +QMenu::item:selected { + background-color: #333334; } + +QMenu::item:disabled { + background-color: transparent; } + +QMenu::separator { + background-color: #333337; + height: 1px; + margin: 1px 0; } + +QMenu::icon { + margin: 1px; } + +QMenu::right-arrow { + image: url(./vs15/sub-menu-arrow.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: .5em; } + +QMenu QPushButton { + background-color: transparent; + border-color: #3F3F46; + margin: 1px 0 1px 0; } + +QMenu QCheckBox, +QMenu QRadioButton { + background-color: transparent; + padding: 5px 2px; } + +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +QToolTip, +SaveGameInfoWidget { + background-color: #424245; + border-color: #4D4D50; + color: #F1F1F1; + border-style: solid; + border-width: 1px; + padding: 2px; } + +/* Progress Bars (Downloads) #QProgressBar */ +QProgressBar { + background-color: #E6E6E6; + color: #000; + border-color: #BCBCBC; + text-align: center; + border-style: solid; + border-width: 1px; + margin: 0 10px; } + +QProgressBar::chunk { + background: #06B025; } + +/* Right Pane and Tab Bars #QTabWidget, #QTabBar */ +QTabWidget::pane { + border-color: #3F3F46; + border-top-color: #9A9A00; + top: 0; + border-style: solid; + border-width: 1px; } + +QTabWidget::pane:disabled { + border-top-color: #3F3F46; } + +/*QTabWidget::tab-bar { }*/ +QTabBar::tab { + background-color: transparent; + padding: 4px 1em; + border: none; } + +QTabBar::tab:hover { + background-color: #b4b400; } + +QTabBar::tab:selected, +QTabBar::tab:selected:hover { + background-color: #9A9A00; } + +QTabBar::tab:disabled { + background-color: transparent; + color: #656565; } + +QTabBar::tab:selected:disabled { + background-color: #3F3F46; } + +/* scrollers */ +QTabBar QToolButton { + background-color: #333337; + border-color: #3F3F46; + padding: 1px; + margin: 0; + border-style: solid; + border-width: 1px; } + +QTabBar QToolButton:hover { + border-color: #9A9A00; + border-width: 1px; + border-style: solid; } + +QTabBar QToolButton:disabled, +QTabBar QToolButton:pressed:hover { + background-color: #333337; } + +/*QTabBar::tear { }*/ +QTabBar::scroller { + width: 23px; + background-color: red; } + +QTabBar QToolButton::right-arrow { + image: url(./vs15/scrollbar-right.png); } + +QTabBar QToolButton::right-arrow:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QTabBar QToolButton::left-arrow { + image: url(./vs15/scrollbar-left.png); } + +QTabBar QToolButton::left-arrow:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +/* Special styles */ +/* fix margins on tabs pane */ +QLineEdit#espFilterEdit { + margin: 0 0 6px 0; } + +QTreeView#downloadView { + margin: 4px 4px 0 4px; } + +QCheckBox#showHiddenBox { + margin: 0 0 4px 4px; } + +QLineEdit#downloadFilterEdit { + margin: 0 4px 4px 0; } + +QWidget#tabImages QPushButton { + background-color: transparent; + margin: 0 .3em; + padding: 0; } + +/* like dialog QPushButton*/ +QWidget#tabESPs QToolButton { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QWidget#tabESPs QToolButton:hover { + background-color: #ffffe7; + border-color: #a9a900; } + +QWidget#tabESPs QToolButton:focus { + background-color: #DDDDDD; + border-color: #9A9A00; } + +QWidget#tabESPs QToolButton:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QTreeWidget#categoriesList { + /*min-width: 225px;*/ } + +QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: .35em 10px; } + +QTreeWidget#categoriesList::item:has-children { + background-image: url(./vs15/branch-closed.png); } + +QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./vs15/branch-open.png); } + +QDialog#QueryOverwriteDialog QPushButton { + margin-left: .5em; } + +QDialog#PyCfgDialog QPushButton:hover { + background-color: #ffffe7; } + +QLineEdit#modFilterEdit { + margin-top: 2px; } + +/* highlight unchecked BSAs */ +QWidget#bsaTab QTreeWidget::indicator:unchecked { + background-color: #9A9A00; } + +/* increase version textfield */ +QLineEdit#versionEdit { + max-width: 100px; } + +/* Dialogs width changes */ +/* increase width to prevent buttons cutting */ +QDialog#QueryOverwriteDialog { + min-width: 565px; } + +QDialog#ModInfoDialog { + min-width: 850px; } diff --git a/src/stylesheets/vs15 Dark.qss b/src/stylesheets/vs15 Dark.qss new file mode 100644 index 00000000..a88a7edf --- /dev/null +++ b/src/stylesheets/vs15 Dark.qss @@ -0,0 +1,752 @@ +/*!************************************* + VS15 Dark +**************************************** + Author: chintsu_kun + Version: 1.3.1 + Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) + Url: https://github.com/nikolay-borzov/modorganizer-themes +**************************************** +*/ +/* or #434346*/ +/*base*/ +/*$color-text-box-border-focus: #3399FF; = $color-input-border-focus*/ +/*$color-text-box-border-hover: #007ACC; = $color-input-border-hover*/ +/*$color-combo-box-hover-border: #007ACC;*/ +/*$color-check-box-hover-border: #007ACC; = $color-input-border-hover*/ +/* Main Window */ +QWidget { + background-color: #2D2D30; + color: #F1F1F1; } + QWidget::disabled { + color: #656565; } + +/* Common */ +/* FIX: For some reason applying background-color or border fixes paddings properties */ +QListView::item, +QTreeView#espList::item, +QTreeWidget#categoriesList::item { + border-width: 0; } + +/* remove outline */ +* { + outline: 0; } + +*:disabled, +QListView::item:disabled, +*::item:selected:disabled { + color: #656565; } + +/* line heights */ +/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +QTreeView#modList::item, +QTreeWidget#categoriesTree::item, +#tabConflicts QTreeWidget::item { + padding: 0.3em 0; } + +QListView::item, +QTreeView#espList::item { + padding: 0.3em; } + +/* to enable border color */ +QTreeView, +QListView, +QTextEdit, +QWebView, +QTableView { + border-style: solid; + border-width: 1px; } + +QAbstractItemView { + color: #DCDCDC; + background-color: #1E1E1E; + alternate-background-color: #262626; + border-color: #3F3F46; } + QAbstractItemView::item:selected, QAbstractItemView::item:selected:hover { + background-color: #3399FF; + color: #F1F1F1; } + +QAbstractItemView, +QListView, +QTreeView { + show-decoration-selected: 1; } + +QAbstractItemView::item:hover, +QListView::item:hover, +QTreeView::branch:hover, +QTreeWidget::item:hover { + background-color: rgba(51, 153, 255, 0.3); } + +QAbstractItemView::item:selected:disabled, +QListView::item:selected:disabled, +QTreeView::branch:selected:disabled, +QTreeWidget::item:selected:disabled { + background-color: rgba(51, 153, 255, 0.3); } + +QTreeView::branch:selected { + background-color: #3399FF; } + +QLabel { + background-color: transparent; } + +/* Left Pane & File Trees #QTreeView, #QListView*/ +QTreeView::branch:closed:has-children { + image: url(./vs15/branch-closed.png); } + +QTreeView::branch:open:has-children { + image: url(./vs15/branch-open.png); } + +/*QListView::item:hover { } +QListView::item:selected { }*/ +QListView::item { + color: #F1F1F1; } + +/* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ +/* Common */ +QTextEdit, +QWebView, +QLineEdit, +QAbstractSpinBox, +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button, +QComboBox { + background-color: #333337; + border-color: #3F3F46; } + +QLineEdit:hover, +QAbstractSpinBox:hover, +QTextEdit:hover, +QComboBox:hover, +QComboBox:editable:hover { + border-color: #007ACC; } + +QLineEdit:focus, +QAbstractSpinBox::focus, +QTextEdit:focus, +QComboBox:focus, +QComboBox:editable:focus, +QComboBox:on { + background-color: #3F3F46; + border-color: #3399FF; } + +QComboBox:on { + border-bottom-color: #3F3F46; } + +QLineEdit, +QAbstractSpinBox { + min-height: 15px; + padding: 2px; + border-style: solid; + border-width: 1px; } + +QLineEdit { + margin-top: 0; } + +/* clear button */ +QLineEdit QToolButton, +QLineEdit QToolButton:hover { + background: none; + margin-top: 1px; } + +QLineEdit#espFilterEdit QToolButton { + margin-top: -2px; + margin-bottom: 1px; } + +/* Dropdowns #QComboBox*/ +QComboBox { + min-height: 20px; + padding-left: 5px; + margin: 3px 0 1px 0; + border-style: solid; + border-width: 1px; } + QComboBox:editable { + padding-left: 3px; + /* to enable hover styles */ + background-color: transparent; } + QComboBox::drop-down { + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; + /* If you need to set style for drop down button + &:on, + &:editable:hover { + background-color: red; + } */ } + QComboBox::down-arrow { + image: url(./vs15/combobox-down.png); } + QComboBox QAbstractItemView { + background-color: #1B1B1C; + selection-background-color: #3F3F46; + border-color: #3399FF; + border-style: solid; + border-width: 0 1px 1px 1px; } + +/* doesn't work http://stackoverflow.com/questions/13308341/qcombobox-abstractitemviewitem*/ +/*QComboBox QAbstractItemView:item { + padding: 10px; + margin: 10px; +}*/ +/* Toolbar */ +QToolBar { + border: none; } + +QToolBar::separator { + border-left-color: #222222; + border-right-color: #46464A; + border-width: 0 1px 0 1px; + border-style: solid; + width: 0; } + +QToolButton { + margin: 0 4px 0 4px; + padding: 5px; } + QToolButton:hover, QToolButton:focus { + background-color: #3E3E40; + /* need this to make background-color works*/ + border: none; } + QToolButton:pressed { + background-color: #3399FF; + /* need this to make background-color works*/ + border: none; } + +/* Group Boxes #QGroupBox */ +QGroupBox { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; + padding: 1em .3em .3em .3em; + margin-top: .65em; } + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 2px; + left: 10px; } + +/* LCD Count */ +QLCDNumber { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Buttons #QPushButton */ +QPushButton { + background-color: #333337; + border-color: #3F3F46; + min-height: 18px; + padding: 2px 5px; + border-style: solid; + border-width: 1px; } + +QPushButton:hover, +QPushButton:checked, +QPushButton:focus, +QAbstractSpinBox::up-button:hover, +QAbstractSpinBox::down-button:hover { + background-color: #007ACC; } + +QPushButton:pressed, +QPushButton:checked:hover, +QAbstractSpinBox::up-button:pressed, +QAbstractSpinBox::down-button:pressed { + background-color: #1C97EA; } + +QPushButton:disabled, +QAbstractSpinBox::up-button:disabled, +QAbstractSpinBox::down-button:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QPushButton::menu-indicator { + image: url(./vs15/combobox-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; } + +/* dialog buttons */ +/* Common */ +QDialog QPushButton, +QSlider::handle:horizontal, +QSlider::handle:vertical { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QDialog QPushButton:hover, +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover, +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + background-color: #BEE6FD; + border-color: #3C7FB1; } + +QSlider::handle:horizontal:focus:!pressed, +QSlider::handle:vertical:focus:!pressed, +QDialog QPushButton:focus, +QDialog QPushButton:checked { + background-color: #DDDDDD; + border-color: #3399FF; } + +QDialog QPushButton:disabled, +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QDialog QPushButton { + min-width: 1.5em; + padding-left: .5em; + padding-right: .5em; } + +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/*common*/ +QGroupBox::indicator, +QTreeView::indicator, +QCheckBox::indicator, +QRadioButton::indicator { + background-color: #2D2D30; + border-color: #3F3F46; + width: 13px; + height: 13px; + border-style: solid; + border-width: 1px; } + QGroupBox::indicator:hover, + QTreeView::indicator:hover, + QCheckBox::indicator:hover, + QRadioButton::indicator:hover { + background-color: #3F3F46; + border-color: #007ACC; } + +QGroupBox::indicator:checked, +QTreeView::indicator:checked, +QCheckBox::indicator:checked { + image: url(./vs15/checkbox-check.png); } + +QGroupBox::indicator:disabled, +QTreeView::indicator:checked:disabled, +QCheckBox::indicator:checked:disabled { + image: url(./vs15/checkbox-check-disabled.png); } + +/* Checkboxes special */ +QTreeView#modList::indicator { + width: 15px; + height: 15px; } + +/* Radio buttons #QRadioButton */ +QRadioButton::indicator { + border-radius: 7px; } + QRadioButton::indicator::checked { + background-color: #B9B9BA; + border-width: 2px; + width: 11px; + height: 11px; } + QRadioButton::indicator::checked:hover { + border-color: #3F3F46; } + +/* Spinners #QSpinBox, #QDoubleSpinBox */ +QAbstractSpinBox { + margin: 1px; } + +QAbstractSpinBox::up-button, +QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; } + +QAbstractSpinBox::up-button { + subcontrol-position: top right; } + +QAbstractSpinBox::up-arrow { + image: url(./vs15/spinner-up.png); } + +QAbstractSpinBox::down-button { + subcontrol-position: bottom right; } + +QAbstractSpinBox::down-arrow { + image: url(./vs15/spinner-down.png); } + +/* Sliders #QSlider */ +QSlider::groove:horizontal { + background-color: #3F3F46; + border: none; + height: 8px; + margin: 2px 0; } + +QSlider::handle:horizontal { + width: .5em; + height: 2em; + margin: -7px 0; + subcontrol-origin: margin; } + +/* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ +/* assigning background still leaves not filled area*/ +QAbstractScrollArea::corner { + background-color: transparent; } + +/* Horizontal */ +QScrollBar:horizontal { + height: 18px; + border: none; + margin: 0 23px 0 23px; } + +QScrollBar::handle:horizontal { + min-width: 32px; + margin: 4px 2px; } + +QScrollBar::add-line:horizontal { + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; } + +QScrollBar::sub-line:horizontal { + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; } + +/* Vertical */ +QScrollBar:vertical { + width: 20px; + border: none; + margin: 23px 0 23px 0; } + +QScrollBar::handle:vertical { + min-height: 32px; + margin: 2px 4px; } + +QScrollBar::add-line:vertical { + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; } + +QScrollBar::sub-line:vertical { + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; } + +/* Combined */ +QScrollBar { + background-color: #3E3E42; + border: none; } + +QScrollBar::handle { + background-color: #686868; } + +QScrollBar::add-line, +QScrollBar::sub-line { + background-color: #3E3E42; + border: none; } + +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { }*/ +QScrollBar::handle:hover { + background: #9E9E9E; } + +QScrollBar::handle:pressed { + background: #EFEBEF; } + +QScrollBar::handle:disabled { + background: #555558; } + +QScrollBar::add-page, +QScrollBar::sub-page { + background: transparent; } + +QScrollBar::up-arrow:vertical { + image: url(./vs15/scrollbar-up.png); } + +QScrollBar::up-arrow:vertical:hover { + image: url(./vs15/scrollbar-up-hover.png); } + +QScrollBar::up-arrow:vertical:disabled { + image: url(./vs15/scrollbar-up-disabled.png); } + +QScrollBar::right-arrow:horizontal { + image: url(./vs15/scrollbar-right.png); } + +QScrollBar::right-arrow:horizontal:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QScrollBar::right-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-right-disabled.png); } + +QScrollBar::down-arrow:vertical { + image: url(./vs15/scrollbar-down.png); } + +QScrollBar::down-arrow:vertical:hover { + image: url(./vs15/scrollbar-down-hover.png); } + +QScrollBar::down-arrow:vertical:disabled { + image: url(./vs15/scrollbar-down-disabled.png); } + +QScrollBar::left-arrow:horizontal { + image: url(./vs15/scrollbar-left.png); } + +QScrollBar::left-arrow:horizontal:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +QScrollBar::left-arrow:horizontal:disabled { + image: url(./vs15/scrollbar-left-disabled.png); } + +/* Scroll Area #QScrollArea*/ +QScrollArea { + border-color: #3F3F46; + border-style: solid; + border-width: 1px; } + +/* Header Rows and Tables (Configure Mod Categories) #QTableView, #QHeaderView */ +QTableView { + gridline-color: #3F3F46; + selection-background-color: #3399FF; + selection-color: #F1F1F1; } + +QTableView QTableCornerButton::section { + background: #252526; + border-color: #3F3F46; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView { + border: none; } + +QHeaderView::section { + background: #252526; + border-color: #3F3F46; + padding: 3px 5px; + border-style: solid; + border-width: 0 1px 1px 0; } + +QHeaderView::section:hover { + background: #3E3E40; + color: #F6F6F6; } + +/*QHeaderView::section:first { }*/ +QHeaderView::section:last { + border-right: 0; } + +QHeaderView::up-arrow { + image: url(./vs15/sort-asc.png); + margin-bottom: -37px; } + +QTreeView#downloadView QHeaderView::up-arrow { + margin-bottom: -32px; } + +QHeaderView::down-arrow { + image: url(./vs15/sort-desc.png); + margin-bottom: 0; } + +/* Context menus, toolbar dropdowns #QMenu */ +QMenu { + background-color: #1A1A1C; + border-color: #333337; + border-style: solid; + border-width: 1px; + padding: 2px; } + +QMenu::item { + background: transparent; + padding: 4px 20px; } + +QMenu::item:selected { + background-color: #333334; } + +QMenu::item:disabled { + background-color: transparent; } + +QMenu::separator { + background-color: #333337; + height: 1px; + margin: 1px 0; } + +QMenu::icon { + margin: 1px; } + +QMenu::right-arrow { + image: url(./vs15/sub-menu-arrow.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: .5em; } + +QMenu QPushButton { + background-color: transparent; + border-color: #3F3F46; + margin: 1px 0 1px 0; } + +QMenu QCheckBox, +QMenu QRadioButton { + background-color: transparent; + padding: 5px 2px; } + +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +QToolTip, +SaveGameInfoWidget { + background-color: #424245; + border-color: #4D4D50; + color: #F1F1F1; + border-style: solid; + border-width: 1px; + padding: 2px; } + +/* Progress Bars (Downloads) #QProgressBar */ +QProgressBar { + background-color: #E6E6E6; + color: #000; + border-color: #BCBCBC; + text-align: center; + border-style: solid; + border-width: 1px; + margin: 0 10px; } + +QProgressBar::chunk { + background: #06B025; } + +/* Right Pane and Tab Bars #QTabWidget, #QTabBar */ +QTabWidget::pane { + border-color: #3F3F46; + border-top-color: #007ACC; + top: 0; + border-style: solid; + border-width: 1px; } + +QTabWidget::pane:disabled { + border-top-color: #3F3F46; } + +/*QTabWidget::tab-bar { }*/ +QTabBar::tab { + background-color: transparent; + padding: 4px 1em; + border: none; } + +QTabBar::tab:hover { + background-color: #1C97EA; } + +QTabBar::tab:selected, +QTabBar::tab:selected:hover { + background-color: #007ACC; } + +QTabBar::tab:disabled { + background-color: transparent; + color: #656565; } + +QTabBar::tab:selected:disabled { + background-color: #3F3F46; } + +/* scrollers */ +QTabBar QToolButton { + background-color: #333337; + border-color: #3F3F46; + padding: 1px; + margin: 0; + border-style: solid; + border-width: 1px; } + +QTabBar QToolButton:hover { + border-color: #007ACC; + border-width: 1px; + border-style: solid; } + +QTabBar QToolButton:disabled, +QTabBar QToolButton:pressed:hover { + background-color: #333337; } + +/*QTabBar::tear { }*/ +QTabBar::scroller { + width: 23px; + background-color: red; } + +QTabBar QToolButton::right-arrow { + image: url(./vs15/scrollbar-right.png); } + +QTabBar QToolButton::right-arrow:hover { + image: url(./vs15/scrollbar-right-hover.png); } + +QTabBar QToolButton::left-arrow { + image: url(./vs15/scrollbar-left.png); } + +QTabBar QToolButton::left-arrow:hover { + image: url(./vs15/scrollbar-left-hover.png); } + +/* Special styles */ +/* fix margins on tabs pane */ +QLineEdit#espFilterEdit { + margin: 0 0 6px 0; } + +QTreeView#downloadView { + margin: 4px 4px 0 4px; } + +QCheckBox#showHiddenBox { + margin: 0 0 4px 4px; } + +QLineEdit#downloadFilterEdit { + margin: 0 4px 4px 0; } + +QWidget#tabImages QPushButton { + background-color: transparent; + margin: 0 .3em; + padding: 0; } + +/* like dialog QPushButton*/ +QWidget#tabESPs QToolButton { + color: #000000; + background-color: #DDDDDD; + border-color: #707070; + border-style: solid; + border-width: 1px; } + +QWidget#tabESPs QToolButton:hover { + background-color: #BEE6FD; + border-color: #3C7FB1; } + +QWidget#tabESPs QToolButton:focus { + background-color: #DDDDDD; + border-color: #3399FF; } + +QWidget#tabESPs QToolButton:disabled { + background-color: #333337; + border-color: #3F3F46; } + +QTreeWidget#categoriesList { + /*min-width: 225px;*/ } + +QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: .35em 10px; } + +QTreeWidget#categoriesList::item:has-children { + background-image: url(./vs15/branch-closed.png); } + +QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./vs15/branch-open.png); } + +QDialog#QueryOverwriteDialog QPushButton { + margin-left: .5em; } + +QDialog#PyCfgDialog QPushButton:hover { + background-color: #BEE6FD; } + +QLineEdit#modFilterEdit { + margin-top: 2px; } + +/* highlight unchecked BSAs */ +QWidget#bsaTab QTreeWidget::indicator:unchecked { + background-color: #3399FF; } + +/* increase version textfield */ +QLineEdit#versionEdit { + max-width: 100px; } + +/* Dialogs width changes */ +/* increase width to prevent buttons cutting */ +QDialog#QueryOverwriteDialog { + min-width: 565px; } + +QDialog#ModInfoDialog { + min-width: 850px; } diff --git a/src/stylesheets/vs15/branch-closed.png b/src/stylesheets/vs15/branch-closed.png new file mode 100644 index 00000000..98d50524 Binary files /dev/null and b/src/stylesheets/vs15/branch-closed.png differ diff --git a/src/stylesheets/vs15/branch-open.png b/src/stylesheets/vs15/branch-open.png new file mode 100644 index 00000000..7b5d0fb3 Binary files /dev/null and b/src/stylesheets/vs15/branch-open.png differ diff --git a/src/stylesheets/vs15/checkbox-check-disabled.png b/src/stylesheets/vs15/checkbox-check-disabled.png new file mode 100644 index 00000000..f0385f13 Binary files /dev/null and b/src/stylesheets/vs15/checkbox-check-disabled.png differ diff --git a/src/stylesheets/vs15/checkbox-check.png b/src/stylesheets/vs15/checkbox-check.png new file mode 100644 index 00000000..ab72eeb5 Binary files /dev/null and b/src/stylesheets/vs15/checkbox-check.png differ diff --git a/src/stylesheets/vs15/combobox-down.png b/src/stylesheets/vs15/combobox-down.png new file mode 100644 index 00000000..ab4cae95 Binary files /dev/null and b/src/stylesheets/vs15/combobox-down.png differ diff --git a/src/stylesheets/vs15/scrollbar-down-disabled.png b/src/stylesheets/vs15/scrollbar-down-disabled.png new file mode 100644 index 00000000..fe6a465b Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-down-disabled.png differ diff --git a/src/stylesheets/vs15/scrollbar-down-hover.png b/src/stylesheets/vs15/scrollbar-down-hover.png new file mode 100644 index 00000000..ad2e28c5 Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-down-hover.png differ diff --git a/src/stylesheets/vs15/scrollbar-down.png b/src/stylesheets/vs15/scrollbar-down.png new file mode 100644 index 00000000..fcc3e6a2 Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-down.png differ diff --git a/src/stylesheets/vs15/scrollbar-left-disabled.png b/src/stylesheets/vs15/scrollbar-left-disabled.png new file mode 100644 index 00000000..46dc794c Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-left-disabled.png differ diff --git a/src/stylesheets/vs15/scrollbar-left-hover.png b/src/stylesheets/vs15/scrollbar-left-hover.png new file mode 100644 index 00000000..af1e4327 Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-left-hover.png differ diff --git a/src/stylesheets/vs15/scrollbar-left.png b/src/stylesheets/vs15/scrollbar-left.png new file mode 100644 index 00000000..b742b229 Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-left.png differ diff --git a/src/stylesheets/vs15/scrollbar-right-disabled.png b/src/stylesheets/vs15/scrollbar-right-disabled.png new file mode 100644 index 00000000..f61615a2 Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-right-disabled.png differ diff --git a/src/stylesheets/vs15/scrollbar-right-hover.png b/src/stylesheets/vs15/scrollbar-right-hover.png new file mode 100644 index 00000000..62d9993d Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-right-hover.png differ diff --git a/src/stylesheets/vs15/scrollbar-right.png b/src/stylesheets/vs15/scrollbar-right.png new file mode 100644 index 00000000..05eb173d Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-right.png differ diff --git a/src/stylesheets/vs15/scrollbar-up-disabled.png b/src/stylesheets/vs15/scrollbar-up-disabled.png new file mode 100644 index 00000000..2797ef8e Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-up-disabled.png differ diff --git a/src/stylesheets/vs15/scrollbar-up-hover.png b/src/stylesheets/vs15/scrollbar-up-hover.png new file mode 100644 index 00000000..2c34ab89 Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-up-hover.png differ diff --git a/src/stylesheets/vs15/scrollbar-up.png b/src/stylesheets/vs15/scrollbar-up.png new file mode 100644 index 00000000..23b3d6de Binary files /dev/null and b/src/stylesheets/vs15/scrollbar-up.png differ diff --git a/src/stylesheets/vs15/sort-asc.png b/src/stylesheets/vs15/sort-asc.png new file mode 100644 index 00000000..b1e01fd8 Binary files /dev/null and b/src/stylesheets/vs15/sort-asc.png differ diff --git a/src/stylesheets/vs15/sort-desc.png b/src/stylesheets/vs15/sort-desc.png new file mode 100644 index 00000000..6cb891b1 Binary files /dev/null and b/src/stylesheets/vs15/sort-desc.png differ diff --git a/src/stylesheets/vs15/spinner-down.png b/src/stylesheets/vs15/spinner-down.png new file mode 100644 index 00000000..78307209 Binary files /dev/null and b/src/stylesheets/vs15/spinner-down.png differ diff --git a/src/stylesheets/vs15/spinner-up.png b/src/stylesheets/vs15/spinner-up.png new file mode 100644 index 00000000..a635a518 Binary files /dev/null and b/src/stylesheets/vs15/spinner-up.png differ diff --git a/src/stylesheets/vs15/sub-menu-arrow-hover.png b/src/stylesheets/vs15/sub-menu-arrow-hover.png new file mode 100644 index 00000000..81ef4aeb Binary files /dev/null and b/src/stylesheets/vs15/sub-menu-arrow-hover.png differ diff --git a/src/stylesheets/vs15/sub-menu-arrow.png b/src/stylesheets/vs15/sub-menu-arrow.png new file mode 100644 index 00000000..0357366b Binary files /dev/null and b/src/stylesheets/vs15/sub-menu-arrow.png differ -- cgit v1.3.1 From c1d90b131b72d4f756a70cd4b6faf766c9a11c82 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 30 Oct 2018 20:44:01 -0500 Subject: Add modinfoseparator to CMakeLists.txt --- src/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9ae193fe..372b9519 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -37,6 +37,7 @@ SET(organizer_SRCS modinfoforeign.cpp modinfooverwrite.cpp modinforegular.cpp + modinfoseparator.cpp modinfowithconflictinfo.cpp messagedialog.cpp mainwindow.cpp @@ -128,6 +129,7 @@ SET(organizer_HDRS modinfoforeign.h modinfooverwrite.h modinforegular.h + modinfoseparator.h modinfowithconflictinfo.h messagedialog.h mainwindow.h -- cgit v1.3.1 From 6056202ead2cb80bebf4b9b07bd418c1a000bce3 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 31 Oct 2018 00:52:32 -0500 Subject: Fix crash when 7-zip fails to extract a file A thread is spun off to handle the extraction while the main thread handles the progress bar updates. Previously, a dialog was spawned in the thread when an error in 7-zip occurred. Now, the thread will terminate and pass the error message back to the main thread who will spawn the dialog. --- src/installationmanager.cpp | 6 +++++- src/installationmanager.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 5c8b6897..64e58358 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -451,7 +451,7 @@ void InstallationManager::updateProgressFile(QString const &fileName) void InstallationManager::report7ZipError(QString const &errorMessage) { - reportError(errorMessage); + m_ErrorMessage = errorMessage; m_ArchiveHandler->cancel(); } @@ -608,7 +608,11 @@ bool InstallationManager::doInstall(GuessedValue &modName, QString game } while (!future.isFinished()); if (!future.result()) { if (m_ArchiveHandler->getLastError() == Archive::ERROR_EXTRACT_CANCELLED) { + if (!m_ErrorMessage.isEmpty()) { + throw MyException(QString("extracting failed (%1)").arg(m_ErrorMessage)); + } else { return false; + } } else { throw MyException(QString("extracting failed (%1)").arg(m_ArchiveHandler->getLastError())); } diff --git a/src/installationmanager.h b/src/installationmanager.h index 5160d137..7c43b4e2 100644 --- a/src/installationmanager.h +++ b/src/installationmanager.h @@ -212,6 +212,7 @@ private: Archive *m_ArchiveHandler; QString m_CurrentFile; + QString m_ErrorMessage; QProgressDialog *m_InstallationProgress { nullptr }; int m_Progress; -- cgit v1.3.1 From eb26120332433c73716531e6eaae798aeae33c1b Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 31 Oct 2018 14:53:24 -0500 Subject: Add send to top/bottom options for the mod list --- src/mainwindow.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++---------- src/mainwindow.h | 2 ++ src/modlist.h | 3 +-- 3 files changed, 51 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 74eecf06..24def4ef 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2652,7 +2652,7 @@ void MainWindow::modOpenPrev(int tab) ModInfo::Ptr mod = ModInfo::getByIndex(m_ContextRow); std::vector flags = mod->getFlags(); if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || - (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end())) { // skip overwrite and backups and separators modOpenPrev(tab); @@ -3686,6 +3686,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu = new QMenu(this); allMods->setTitle(tr("All Mods")); menu->addMenu(allMods); + menu->addSeparator(); ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); std::vector flags = info->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) { @@ -3699,38 +3700,43 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked())); menu->addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()){ - menu->addSeparator(); menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); + menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); + menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addSeparator(); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); if(info->getColor().isValid()) menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { - // nop, nothing to do with this mod + menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); + menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); } else { QMenu *addRemoveCategoriesMenu = new QMenu(tr("Change Categories")); populateMenuCategories(addRemoveCategoriesMenu, 0); connect(addRemoveCategoriesMenu, SIGNAL(aboutToHide()), this, SLOT(addRemoveCategories_MenuHandler())); addMenuAsPushButton(menu, addRemoveCategoriesMenu); - //Removed as it was redundant, just making the categories look more complicated. - /* + //Removed as it was redundant, just making the categories look more complicated. + /* QMenu *replaceCategoriesMenu = new QMenu(tr("Replace Categories")); populateMenuCategories(replaceCategoriesMenu, 0); connect(replaceCategoriesMenu, SIGNAL(aboutToHide()), this, SLOT(replaceCategories_MenuHandler())); addMenuAsPushButton(menu, replaceCategoriesMenu); - */ + */ QMenu *primaryCategoryMenu = new QMenu(tr("Primary Category")); connect(primaryCategoryMenu, SIGNAL(aboutToShow()), this, SLOT(addPrimaryCategoryCandidates())); addMenuAsPushButton(menu, primaryCategoryMenu); menu->addSeparator(); + if (info->downgradeAvailable()) { menu->addAction(tr("Change versioning scheme"), this, SLOT(changeVersioningScheme())); } + if (info->updateAvailable() || info->downgradeAvailable()) { if (info->updateIgnored()) { menu->addAction(tr("Un-ignore update"), this, SLOT(unignoreUpdate())); @@ -3746,13 +3752,17 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addSeparator(); + menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); + menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_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->addAction(tr("Create Backup"), this, SLOT(backupMod_clicked())); - - menu->addSeparator(); + menu->addSeparator(); if (info->getNexusID() > 0) { switch (info->endorsedState()) { @@ -3774,7 +3784,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) } } - menu->addSeparator(); + menu->addSeparator(); std::vector flags = info->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_INVALID) != flags.end()) { @@ -5566,3 +5576,31 @@ void MainWindow::on_clearFiltersButton_clicked() { deselectFilters(); } + +void MainWindow::sendModToTop_clicked() +{ + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + std::vector modsToMove; + for (QModelIndex idx : selection->selectedRows()) { + modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); + } + m_OrganizerCore.modList()->changeModPriority(modsToMove, 0); + } else { + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, 0); + } +} + +void MainWindow::sendModToBottom_clicked() +{ + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + std::vector modsToMove; + for (QModelIndex idx : selection->selectedRows()) { + modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); + } + m_OrganizerCore.modList()->changeModPriority(modsToMove, INT_MAX); + } else { + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, INT_MAX); + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 53db447a..923a8330 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -423,6 +423,8 @@ private slots: void information_clicked(); void enableSelectedMods_clicked(); void disableSelectedMods_clicked(); + void sendModToTop_clicked(); + void sendModToBottom_clicked(); // savegame context menu void deleteSavegame_clicked(); void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets); diff --git a/src/modlist.h b/src/modlist.h index 15376ed5..caad8c61 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -106,6 +106,7 @@ public: static QString getColumnName(int column); void changeModPriority(int sourceIndex, int newPriority); + void changeModPriority(std::vector sourceIndices, int newPriority); void setOverwriteMarkers(const std::set &overwrite, const std::set &overwritten); void setPluginContainer(PluginContainer *pluginContainer); @@ -266,8 +267,6 @@ private: bool testValid(const QString &modDir); - void changeModPriority(std::vector sourceIndices, int newPriority); - QVariant getOverwriteData(int column, int role) const; QString getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const; -- cgit v1.3.1 From 5de173ba1ae9531aaca0c0f022a2b0dae1c09250 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 31 Oct 2018 17:05:05 -0500 Subject: Add send to top/bottom options for the plugin list --- src/mainwindow.cpp | 15 ++++++++++ src/mainwindow.h | 2 ++ src/pluginlist.cpp | 88 +++++++++++++++++++++++++++++++++++++----------------- src/pluginlist.h | 12 ++++++++ 4 files changed, 90 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 24def4ef..d279da91 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4341,6 +4341,16 @@ void MainWindow::disableSelectedPlugins_clicked() m_OrganizerCore.pluginList()->disableSelected(ui->espList->selectionModel()); } +void MainWindow::sendSelectedPluginsToTop_clicked() +{ + m_OrganizerCore.pluginList()->sendToTop(ui->espList->selectionModel()); +} + +void MainWindow::sendSelectedPluginsToBottom_clicked() +{ + m_OrganizerCore.pluginList()->sendToBottom(ui->espList->selectionModel()); +} + void MainWindow::enableSelectedMods_clicked() { @@ -4966,6 +4976,11 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addAction(tr("Enable all"), m_OrganizerCore.pluginList(), SLOT(enableAll())); menu.addAction(tr("Disable all"), m_OrganizerCore.pluginList(), SLOT(disableAll())); + menu.addSeparator(); + + menu.addAction(tr("Send to top"), this, SLOT(sendSelectedPluginsToTop_clicked())); + menu.addAction(tr("Send to bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + QItemSelection currentSelection = ui->espList->selectionModel()->selection(); bool hasLocked = false; bool hasUnlocked = false; diff --git a/src/mainwindow.h b/src/mainwindow.h index 923a8330..9dee2953 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -439,6 +439,8 @@ private slots: // pluginlist context menu void enableSelectedPlugins_clicked(); void disableSelectedPlugins_clicked(); + void sendSelectedPluginsToTop_clicked(); + void sendSelectedPluginsToBottom_clicked(); void linkToolbar(); void linkDesktop(); diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 18e40a6e..4097ba98 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -289,21 +289,26 @@ void PluginList::enableESP(const QString &name, bool enable) } } +int PluginList::findPluginByPriority(int priority) +{ + for (int i = 0; i < m_ESPs.size(); i++ ) { + if (m_ESPs[i].m_Priority == priority) { + return i; + } + } + qCritical(QString("No plugin with priority %1").arg(priority).toLocal8Bit()); + return -1; +} + void PluginList::enableSelected(const QItemSelectionModel *selectionModel) { - if (selectionModel->hasSelection()){ + 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; - } + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_Enabled) { + m_ESPs[rowIndex].m_Enabled = true; + dirty = true; } } if (dirty) emit writePluginsList(); @@ -312,18 +317,13 @@ void PluginList::enableSelected(const QItemSelectionModel *selectionModel) void PluginList::disableSelected(const QItemSelectionModel *selectionModel) { - if (selectionModel->hasSelection()){ + 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; - } + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_ForceEnabled && m_ESPs[rowIndex].m_Enabled) { + m_ESPs[rowIndex].m_Enabled = false; + dirty = true; } } if (dirty) emit writePluginsList(); @@ -356,6 +356,40 @@ void PluginList::disableAll() } } +void PluginList::sendToTop(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()) { + std::vector pluginsToMove; + for (auto row: selectionModel->selectedRows(COL_PRIORITY)) { + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_ForceEnabled) { + pluginsToMove.push_back(rowIndex); + } + } + if (pluginsToMove.size()) { + changePluginPriority(pluginsToMove, 0); + emit SIGNAL(displayPlugin(0)); + } + } +} + +void PluginList::sendToBottom(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()) { + std::vector pluginsToMove; + for (auto row: selectionModel->selectedRows(COL_PRIORITY)) { + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_ForceEnabled) { + pluginsToMove.push_back(rowIndex); + } + } + if (pluginsToMove.size()) { + changePluginPriority(pluginsToMove, INT_MAX); + emit SIGNAL(displayPlugin(INT_MAX)); + } + } +} + bool PluginList::isEnabled(const QString &name) { @@ -1092,6 +1126,12 @@ void PluginList::setPluginPriority(int row, int &newPriority) { int newPriorityTemp = newPriority; + // enforce valid range + if (newPriorityTemp < 0) + newPriorityTemp = 0; + else if (newPriorityTemp >= static_cast(m_ESPsByPriority.size())) + newPriorityTemp = static_cast(m_ESPsByPriority.size()) - 1; + if (!m_ESPs[row].m_IsMaster && !m_ESPs[row].m_IsLight) { // don't allow esps to be moved above esms while ((newPriorityTemp < static_cast(m_ESPsByPriority.size() - 1)) && @@ -1113,12 +1153,6 @@ void PluginList::setPluginPriority(int row, int &newPriority) } } - // enforce valid range - if (newPriorityTemp < 0) - newPriorityTemp = 0; - else if (newPriorityTemp >= static_cast(m_ESPsByPriority.size())) - newPriorityTemp = static_cast(m_ESPsByPriority.size()) - 1; - try { int oldPriority = m_ESPs.at(row).m_Priority; if (newPriorityTemp > oldPriority) { diff --git a/src/pluginlist.h b/src/pluginlist.h index 03d6426a..009c9153 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -264,6 +264,16 @@ public slots: **/ void disableAll(); + /** + * @brief moves selected plugins to the top (lowest priority) + **/ + void sendToTop(const QItemSelectionModel *selectionModel); + + /** + * @brief moves selected plugins to the bottom (highest priority) + **/ + void sendToBottom(const QItemSelectionModel *selectionModel); + /** * @brief The currently managed game has changed * @param gamePlugin @@ -340,6 +350,8 @@ private: void fixPriorities(); + int findPluginByPriority(int priority); + private: std::vector m_ESPs; -- cgit v1.3.1 From 122744454c9befc06b582a8f0feb03bfbb85aa71 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 31 Oct 2018 20:00:20 -0500 Subject: Improve changing mod and plugin priorities --- src/modlist.cpp | 44 +++++++++++++++++++++++-------- src/organizercore.cpp | 6 +++-- src/pluginlist.cpp | 32 ++++++++++++++++++----- src/profile.cpp | 71 ++++++++++++++++++++++++--------------------------- src/profile.h | 6 +++-- 5 files changed, 100 insertions(+), 59 deletions(-) (limited to 'src') diff --git a/src/modlist.cpp b/src/modlist.cpp index 6caafeb2..7b57eeda 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -654,26 +654,48 @@ void ModList::changeModPriority(std::vector sourceIndices, int newPriority) emit layoutAboutToBeChanged(); Profile *profile = m_Profile; - // sort rows to insert by their old priority (ascending) and insert them move them in that order + + // sort the moving mods by ascending priorities std::sort(sourceIndices.begin(), sourceIndices.end(), - [profile](const int &LHS, const int &RHS) { - return profile->getModPriority(LHS) < profile->getModPriority(RHS); - }); + [profile](const int &LHS, const int &RHS) { + return profile->getModPriority(LHS) > profile->getModPriority(RHS); + }); - // odd stuff: if any of the dragged sources has priority lower than the destination then the - // target idx is that of the row BELOW the dropped location, otherwise it's the one above. why? + // move mods that are decreasing in priority for (std::vector::const_iterator iter = sourceIndices.begin(); iter != sourceIndices.end(); ++iter) { - if (profile->getModPriority(*iter) < newPriority) { + int oldPriority = profile->getModPriority(*iter); + if (oldPriority > newPriority) { + profile->setModPriority(*iter, newPriority); + m_ModMoved(ModInfo::getByIndex(*iter)->name(), oldPriority, newPriority); + } + } + + // sort the moving mods by descending priorities + std::sort(sourceIndices.begin(), sourceIndices.end(), + [profile](const int &LHS, const int &RHS) { + return profile->getModPriority(LHS) < profile->getModPriority(RHS); + }); + + // if at least one mod is increasing in priority, the target index is + // that of the row BELOW the dropped location, otherwise it's the one above + for (std::vector::const_iterator iter = sourceIndices.begin(); + iter != sourceIndices.end(); ++iter) { + int oldPriority = profile->getModPriority(*iter); + if (oldPriority < newPriority) { --newPriority; break; } } + + // move mods that are increasing in priority for (std::vector::const_iterator iter = sourceIndices.begin(); - iter != sourceIndices.end(); ++iter) { - int oldPriority = m_Profile->getModPriority(*iter); - m_Profile->setModPriority(*iter, newPriority); - m_ModMoved(ModInfo::getByIndex(*iter)->name(), oldPriority, newPriority); + iter != sourceIndices.end(); ++iter) { + int oldPriority = profile->getModPriority(*iter); + if (oldPriority < newPriority) { + profile->setModPriority(*iter, newPriority); + m_ModMoved(ModInfo::getByIndex(*iter)->name(), oldPriority, newPriority); + } } emit layoutChanged(); diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 5c85e323..1fafd4c1 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1183,7 +1183,9 @@ ModList *OrganizerCore::modList() QStringList OrganizerCore::modsSortedByProfilePriority() const { QStringList res; - for (unsigned int i = 0; i < currentProfile()->numRegularMods(); ++i) { + for (int i = currentProfile()->getPriorityMinimum(); + i < currentProfile()->getPriorityMinimum() + currentProfile()->numRegularMods(); + ++i) { int modIndex = currentProfile()->modIndexByPriority(i); res.push_back(ModInfo::getByIndex(modIndex)->name()); } @@ -2304,4 +2306,4 @@ std::vector OrganizerCore::fileMapping( result.insert(result.end(), subRes.begin(), subRes.end()); } return result; -} \ No newline at end of file +} diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 4097ba98..8f714afd 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -1183,17 +1183,35 @@ void PluginList::setPluginPriority(int row, int &newPriority) void PluginList::changePluginPriority(std::vector rows, int newPriority) { ChangeBracket layoutChange(this); - // sort rows to insert by their old priority (ascending) and insert them move them in that order const std::vector &esp = m_ESPs; + + int minPriority = INT_MAX; + int maxPriority = INT_MIN; + + // don't try to move plugins before force-enabled plugins + for (std::vector::const_iterator iter = m_ESPs.begin(); + iter != m_ESPs.end(); ++iter) { + if (iter->m_ForceEnabled) { + newPriority = std::max(newPriority, iter->m_Priority+1); + } + maxPriority = std::max(maxPriority, iter->m_Priority+1); + minPriority = std::min(minPriority, iter->m_Priority); + } + + // limit the new priority to existing priorities + newPriority = std::min(newPriority, maxPriority); + newPriority = std::max(newPriority, minPriority); + + // sort the moving plugins by ascending priorities std::sort(rows.begin(), rows.end(), - [&esp](const int &LHS, const int &RHS) { - return esp[LHS].m_Priority < esp[RHS].m_Priority; - }); + [&esp](const int &LHS, const int &RHS) { + return esp[LHS].m_Priority < esp[RHS].m_Priority; + }); - // odd stuff: if any of the dragged sources has priority lower than the destination then the - // target idx is that of the row BELOW the dropped location, otherwise it's the one above. why? + // if at least on plugin is increasing in priority, the target index is + // that of the row BELOW the dropped location, otherwise it's the one above for (std::vector::const_iterator iter = rows.begin(); - iter != rows.end(); ++iter) { + iter != rows.end(); ++iter) { if (m_ESPs[*iter].m_Priority < newPriority) { --newPriority; break; diff --git a/src/profile.cpp b/src/profile.cpp index 7f10bd02..00818d0b 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -184,9 +184,10 @@ void Profile::doWriteModlist() return; } - for (int i = static_cast(m_ModStatus.size()) - 1; i >= 0; --i) { + for (std::map::const_reverse_iterator iter = m_ModIndexByPriority.crbegin(); iter != m_ModIndexByPriority.crend(); iter++ ) { + //qDebug(QString("write mod %1 to priority %2").arg(iter->first).arg(iter->second).toLocal8Bit()); // the priority order was inverted on load so it has to be inverted again - unsigned int index = m_ModIndexByPriority[i]; + unsigned int index = iter->second; if (index != UINT_MAX) { ModInfo::Ptr modInfo = ModInfo::getByIndex(index); std::vector flags = modInfo->getFlags(); @@ -223,9 +224,9 @@ void Profile::createTweakedIniFile() return; } - for (unsigned int i = 0; i < m_ModStatus.size(); ++i) { + for (int i = getPriorityMinimum(); i < getPriorityMinimum() + (int)numRegularMods(); ++i) { unsigned int idx = modIndexByPriority(i); - if ((idx != UINT_MAX) && m_ModStatus[idx].m_Enabled) { + if (m_ModStatus[idx].m_Enabled) { ModInfo::Ptr modInfo = ModInfo::getByIndex(idx); mergeTweaks(modInfo, tweakedIni); } @@ -454,18 +455,14 @@ void Profile::updateIndices() { m_NumRegularMods = 0; m_ModIndexByPriority.clear(); - m_ModIndexByPriority.resize(m_ModStatus.size(), UINT_MAX); for (unsigned int i = 0; i < m_ModStatus.size(); ++i) { int priority = m_ModStatus[i].m_Priority; - if (priority < 0) { + if (priority == INT_MIN) { // don't assign this to mapping at all, it's probably the overwrite mod continue; - } else if (priority >= static_cast(m_ModIndexByPriority.size())) { - qCritical("invalid priority %d for mod", priority); - continue; } else { ++m_NumRegularMods; - m_ModIndexByPriority.at(priority) = i; + m_ModIndexByPriority[priority] = i; } } } @@ -474,11 +471,10 @@ void Profile::updateIndices() std::vector > Profile::getActiveMods() { std::vector > result; - for (std::vector::const_iterator iter = m_ModIndexByPriority.begin(); - iter != m_ModIndexByPriority.end(); ++iter) { - if ((*iter != UINT_MAX) && m_ModStatus[*iter].m_Enabled) { - ModInfo::Ptr modInfo = ModInfo::getByIndex(*iter); - result.push_back(std::make_tuple(modInfo->internalName(), modInfo->absolutePath(), m_ModStatus[*iter].m_Priority)); + for (std::map::const_iterator iter = m_ModIndexByPriority.begin(); iter != m_ModIndexByPriority.end(); iter++ ) { + if ((iter->second != UINT_MAX) && m_ModStatus[iter->second].m_Enabled) { + ModInfo::Ptr modInfo = ModInfo::getByIndex(iter->second); + result.push_back(std::make_tuple(modInfo->internalName(), modInfo->absolutePath(), m_ModStatus[iter->second].m_Priority)); } } @@ -496,13 +492,13 @@ std::vector > Profile::getActiveMods() } -unsigned int Profile::modIndexByPriority(unsigned int priority) const +unsigned int Profile::modIndexByPriority(int priority) const { - if (priority >= m_ModStatus.size()) { + try { + return m_ModIndexByPriority.at(priority); + } catch (std::out_of_range) { throw MyException(tr("invalid priority %1").arg(priority)); } - - return m_ModIndexByPriority[priority]; } @@ -552,30 +548,26 @@ void Profile::setModPriority(unsigned int index, int &newPriority) return; } - int newPriorityTemp = - (std::max)(0, (std::min)(static_cast(m_ModStatus.size()) - 1, - newPriority)); + int oldPriority = m_ModStatus.at(index).m_Priority; + int lastPriority = INT_MIN; - // don't try to place below overwrite - while ((m_ModIndexByPriority.at(newPriorityTemp) >= m_ModStatus.size()) || - m_ModStatus.at(m_ModIndexByPriority.at(newPriorityTemp)).m_Overwrite) { - --newPriorityTemp; + if (newPriority == oldPriority) { + // nothing to do + return; } - int oldPriority = m_ModStatus.at(index).m_Priority; - if (newPriorityTemp > oldPriority) { - // priority is higher than the old, so the gap we left is in lower priorities - for (int i = oldPriority + 1; i <= newPriorityTemp; ++i) { - --m_ModStatus.at(m_ModIndexByPriority.at(i)).m_Priority; + for (std::map::iterator iter = m_ModIndexByPriority.begin(); iter != m_ModIndexByPriority.end(); iter++) { + if (newPriority < oldPriority && iter->first >= newPriority && iter->first < oldPriority) { + m_ModStatus.at(iter->second).m_Priority += 1; } - } else { - for (int i = newPriorityTemp; i < oldPriority; ++i) { - ++m_ModStatus.at(m_ModIndexByPriority.at(i)).m_Priority; + else if (newPriority > oldPriority && iter->first <= newPriority && iter->first > oldPriority) { + m_ModStatus.at(iter->second).m_Priority -= 1; } - ++newPriority; + lastPriority = std::max(lastPriority, iter->first); } - m_ModStatus.at(index).m_Priority = newPriorityTemp; + newPriority = std::min(newPriority, lastPriority); + m_ModStatus.at(index).m_Priority = std::min(newPriority, lastPriority); updateIndices(); m_ModListWriter.write(); @@ -839,4 +831,9 @@ void Profile::storeSetting(const QString §ion, const QString &name, void Profile::removeSetting(const QString §ion, const QString &name) { m_Settings->remove(section + "/" + name); -} \ No newline at end of file +} + +int Profile::getPriorityMinimum() const +{ + return m_ModIndexByPriority.begin()->first; +} diff --git a/src/profile.h b/src/profile.h index 1fcad046..9ddd5b89 100644 --- a/src/profile.h +++ b/src/profile.h @@ -247,7 +247,7 @@ public: * @return the index of the mod * @throw std::exception an exception is thrown if there is no mod with the specified priority **/ - unsigned int modIndexByPriority(unsigned int priority) const; + unsigned int modIndexByPriority(int priority) const; /** * @brief enable or disable a mod @@ -294,6 +294,8 @@ public: const QVariant &value); void removeSetting(const QString §ion, const QString &name); + int getPriorityMinimum() const; + signals: /** @@ -347,7 +349,7 @@ private: mutable QByteArray m_LastModlistHash; std::vector m_ModStatus; - std::vector m_ModIndexByPriority; + std::map m_ModIndexByPriority; unsigned int m_NumRegularMods; MOBase::DelayedFileWriter m_ModListWriter; -- cgit v1.3.1 From 73842ee245a09fe4ead0e1a2a5f778d89f0a8039 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Thu, 1 Nov 2018 16:20:53 +0100 Subject: Added ability to change color of conflict and plugin highlighting from the settings. --- src/modlist.cpp | 6 +- src/organizer_en.ts | 1417 ++++++++++++++++++++++++++---------------------- src/pluginlist.cpp | 2 +- src/settings.cpp | 86 ++- src/settings.h | 18 +- src/settingsdialog.cpp | 104 ++++ src/settingsdialog.h | 27 + src/settingsdialog.ui | 88 ++- 8 files changed, 1065 insertions(+), 683 deletions(-) (limited to 'src') diff --git a/src/modlist.cpp b/src/modlist.cpp index 7b57eeda..3f8fa0c0 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -385,12 +385,12 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const || (role == ViewMarkingScrollBar::DEFAULT_ROLE)) { auto flags = modInfo->getFlags(); if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_PLUGIN) { - return QColor(0, 0, 255, 64); + return Settings::instance().modlistContainsPluginColor(); } else if (m_Overwrite.find(modIndex) != m_Overwrite.end()) { - return QColor(0, 255, 0, 64); + return Settings::instance().modlistOverwrittenLooseColor(); } else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) { - return QColor(255, 0, 0, 64); + return Settings::instance().modlistOverwritingLooseColor(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end() && modInfo->getColor().isValid()) { return modInfo->getColor(); } else { diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 9a7e0713..3d2f1744 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1386,58 +1386,58 @@ p, li { white-space: pre-wrap; } - + File format "%1" not supported - + None of the available installer plugins were able to handle that archive. This is likely due to a corrupted or incompatible download or unrecognized archive format. - + no error - + 7z.dll not found - + 7z.dll isn't valid - + archive not found - + failed to open archive - + unsupported archive type - + internal library error - + archive invalid - + unknown archive error @@ -1534,47 +1534,47 @@ This is likely due to a corrupted or incompatible download or unrecognized archi MainWindow - + Categories - + Clear - + If checked, only mods that match all selected categories are displayed. - + And - + If checked, all mods that match at least one of the selected categories are displayed. - + Or - + Profile - + Pick a module collection - + <!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; } @@ -1584,77 +1584,77 @@ p, li { white-space: pre-wrap; } - + Open list options... - + Refresh list. This is usually not necessary unless you modified data outside the program. - + Show Open Folders menu... - - + + Restore Backup... - - - + + + Create Backup - + List of available mods. - + This is a list of installed mods. Use the checkboxes to activate/deactivate mods and drag & drop mods to change their "installation" orders. - + Filter - + Clear all Filters - + No groups - + Nexus IDs - - - + + + Namefilter - + Pick a program to run. - + <!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; } @@ -1664,12 +1664,12 @@ p, li { white-space: pre-wrap; } - + Run program - + <!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; } @@ -1678,17 +1678,17 @@ p, li { white-space: pre-wrap; } - + Run - + Create a shortcut in your start menu or on the desktop to the specified program - + <!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; } @@ -1697,27 +1697,27 @@ p, li { white-space: pre-wrap; } - + Shortcut - + Plugins - + Sort - + List of available esp/esm files - + <!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; } @@ -1726,27 +1726,27 @@ p, li { white-space: pre-wrap; } - + Archives - + <html><head/><body><p>BSAs / BA2s are bundles of game assets (textures, scripts, etc.). By default, the engine loads these bundles in a separate step from loose files. <p>Their load order is specified by the priority of the corresponding plugin (right pane, plugins tab).</p><p>If there is a matching plugin, the game will load them no matter what.</p></body></html> - + <html><head/><body><p>Currently detected archives. (<a href="#"><span style=" text-decoration: underline; color:#0000ff;">What is an archive?</span></a>)</p></body></html> - + List of available BS Archives. Archives not checked here are not managed by MO and ignore installation order. - + BSA files are archives (comparable to .zip files) that contain data assets (meshes, textures, ...) to be used by the game. As such they "compete" with loose files in your data directory over which is loaded. By default, BSAs that share their base name with an enabled ESP (i.e. plugin.esp and plugin.bsa) are automatically loaded and will have precedence over all loose files, the installation order you set up to the left is then ignored! @@ -1754,61 +1754,61 @@ p, li { white-space: pre-wrap; } - + Data - + refresh data-directory overview - + Refresh the overview. This may take a moment. - - - - + + + + Refresh - + This is an overview of your data directory as visible to the game (and tools). - + File - + Mod - - + + Filter the above list so that only conflicts are displayed. - + Show only conflicts - + Saves - + <!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; } @@ -1819,160 +1819,160 @@ p, li { white-space: pre-wrap; } - + Downloads - + Refresh downloads view - + This is a list of mods you downloaded from Nexus. Double click one to install it. You can also drag an archive into here. - + Show Hidden - + Tool Bar - + Install Mod - + Install &Mod - + Install a new mod from an archive - + Ctrl+M - + Profiles - + &Profiles - + Configure Profiles - + Ctrl+P - + Executables - + &Executables - + Configure the executables that can be started through Mod Organizer - + Ctrl+E - - + + Tools - + &Tools - + Ctrl+I - + Settings - + &Settings - + Configure settings and workarounds - + Ctrl+S - + Nexus - + Search nexus network for more mods - + Ctrl+N - - + + Update - + Mod Organizer is up-to-date - - + + No Problems - + This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. !Work in progress! @@ -1980,758 +1980,813 @@ Right now this has very limited functionality - - + + Help - + Ctrl+H - + Endorse MO - - + + Endorse Mod Organizer - + Copy Log to Clipboard - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + + Create Separator... + + + + + This will create a new separator. +Please enter a name: + + + + + A separator 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 - + + Create Separator + + + + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - + + Rename Separator... + + + + + Remove Separator... + + + + + + + Send to Top + + + + + + + Send to Bottom + + + + + Select Color... + + + + + Reset Color + + + + Change Categories - + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2739,12 +2794,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2752,319 +2807,329 @@ 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 - + + Send to top + + + + + Send to bottom + + + + 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 @@ -3081,82 +3146,82 @@ You can also use online editors and converters instead. ModInfo - + Plugins - + Textures - + Meshes - + Bethesda Archive - + UI Changes - + Sound Effects - + Scripts - + Script Extender - + Script Extender Files - + SkyProc Tools - + MCM Data - + INI files - + ModGroup files - + invalid content type %1 - + invalid mod index %1 - + remove: invalid mod index %1 @@ -3481,273 +3546,273 @@ p, li { white-space: pre-wrap; } - + &Delete - + &Rename - + &Hide - + &Unhide - + &Open - + &New Folder - + Save changes? - + Save changes to "%1"? - + File Exists - + A file with that name exists, please enter a new one - + failed to move file - + failed to create directory "optional" - - + + Info requested, please wait - + Main - + Update - + Optional - + Old - + Misc - + Unknown - + Current Version: %1 - + No update available - + (description incomplete, please visit nexus) - + <a href="%1">Visit on Nexus</a> - + Failed to delete %1 - - - - + + + + Confirm - - + + Are sure you want to delete "%1"? - - + + Are sure you want to delete the selected files? - - + + New Folder - + Failed to create "%1" - - + + 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? - - + + failed to rename %1 to %2 - + There already is a visible version of this file. Replace it? - + Select binary - + Binary - + file not found: %1 - + failed to generate preview for %1 - + Sorry - + Sorry, can't preview anything. This function currently does not support extracting from bsas. - + Un-Hide - + Hide - - + + Open/Execute - - + + Preview - + Name - + Please enter a name - - + + Error - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3786,272 +3851,285 @@ p, li { white-space: pre-wrap; } ModInfoRegular - - + + failed to write %1/meta.ini: error %2 - + %1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory - + Categories: <br> + + ModInfoSeparator + + + This is a Separator + + + ModList - + Game Plugins (ESP/ESM/ESL) - + Interface - + Meshes - + Bethesda Archive - + Scripts (Papyrus) - + Script Extender Plugin - + SkyProc Patcher - + Sound or Music - + Textures - + MCM Configuration - + INI files - + ModGroup files - + This entry contains files that have been created inside the virtual data tree (i.e. by the construction kit) - + Backup - + + Separator + + + + No valid game data - + Not endorsed yet - + Overwrites files - + Overwritten files - + Overwrites & Overwritten - + Redundant - + Alternate game source - + Non-MO - + invalid - + 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><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table> - + Time this mod was installed @@ -4225,123 +4303,123 @@ p, li { white-space: pre-wrap; } - + Executable "%1" not found - + Start Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? - + Error - + Windows Event Log Error - + The Windows Event Log service is disabled and/or not running. This prevents USVFS from running properly. Your mods may not be working in the executable that you are launching. Note that you may have to restart MO and/or your PC after the service is fixed. Continue launching %1? - + No profile set - + Failed to refresh list of esps: %1 - + Multiple esps/esls activated, please check that they don't conflict. - + Download? - + A download has been started but no installed page plugin recognizes it. If you download anyway no information (i.e. version) will be associated with the download. Continue? - + failed to update mod list: %1 - - + + login successful - + Login failed - + Login failed, try again? - + login failed: %1. Download will not be associated with an account - + login failed: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + MO1 "Script Extender" load mechanism has left hook.dll in your game folder - - + + Description missing - + <a href="%1">hook.dll</a> has been found in your game folder (right click to copy the full path). This is most likely a leftover of setting the ModOrganizer 1 load mechanism to "Script Extender", in which case you must remove this file either by changing the load mechanism in ModOrganizer 1 or manually removing the file, otherwise the game is likely to crash and burn. - + failed to save load order: %1 - + The designated write target "%1" is not enabled. @@ -4514,68 +4592,68 @@ Continue? - + 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 @@ -4647,56 +4725,56 @@ p, li { white-space: pre-wrap; } - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - + failed to open %1 - + "%1" is missing or inaccessible - - - - - + + + + + invalid index %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) @@ -5302,7 +5380,7 @@ If the folder was still in use, restart MO and try again. - + Mod Organizer @@ -5317,18 +5395,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 @@ -5364,12 +5442,12 @@ If the folder was still in use, restart MO and try again. - + failed to access %1 - + failed to set file time %1 @@ -5379,12 +5457,12 @@ If the folder was still in use, restart MO and try again. - + Script Extender - + Proxy DLL @@ -5588,28 +5666,28 @@ Select Show Details option to see the full change-log. Settings - + Failed - + Sorry, failed to start the helper application - - + + attempt to store setting for unknown plugin "%1" - + Error - + Failed to create "%1", you may not have the necessary permission. path remains unchanged. @@ -5686,136 +5764,167 @@ If you use pre-releases, never contact me directly by e-mail or via private mess + Colors + + + + + Plugin is Contained in selected Mod + + + + + Reset Colors + + + + If checked, the download interface will be more compact. - + Compact Download Interface - + If checked, the download list will display meta information instead of file names. - + Download Meta Information - + Reset stored information from dialogs. - + + Mod Contains selected Plugin + Is contained in selected Mod + + + + This will make all dialogs show up again where you checked the "Remember selection"-box. - + Reset Dialogs - - + + Modify the categories available to arrange your mods. - + Configure Mod Categories - + + Is overwriting (loose files) + + + + + Is overwritten (loose files) + + + + Paths - - - + + + ... - + Caches - + Overwrite - - + + Directory where downloads are stored. - + Downloads - + Profiles - + Directory where mods are stored. - + Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don't exist in the new location (with the same name). - + Mods - + Managed Game - + Base Directory - + Use %BASE_DIR% to refer to the Base Directory. - + Important: All directories have to be writeable! - - + + Nexus - + Allows automatic log-in when the Nexus-Page for the game is clicked. - + <!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; } @@ -5824,144 +5933,144 @@ p, li { white-space: pre-wrap; } - + If checked and if correct credentials are entered below, log-in to Nexus (for browsing and downloading) is automatic. - + Automatically Log-In to Nexus - - + + Username - - + + Password - + Remove cache and cookies. Forces a new login. - + Clear Cache - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - + Associate with "Download with manager" links - + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) - + Steam - + If you save your steam user ID and password here, they will be used when logging into steam. Note, however, your password will be stored unencrypted, so make sure your computer is secure. - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Blacklisted Plugins (use <del> to remove): - + Workarounds - + Steam App ID - + The Steam AppID for your game - + <!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; } @@ -5977,17 +6086,17 @@ p, li { white-space: pre-wrap; } - + Load Mechanism - + Select loading mechanism. See help for details. - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -5998,17 +6107,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6017,44 +6126,44 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - + Hide inactive ESPs/ESMs - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - + Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content. - + By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods. However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly. @@ -6062,44 +6171,44 @@ If you disable this feature, MO will only display official DLCs this way. Please - + Display mods installed outside MO - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! - + Back-date BSAs - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - + Diagnostics - + Log Level - + Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log". "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6107,37 +6216,37 @@ For the other games this is not a sufficient replacement for AI! - + Debug - + Info (recommended) - + Warning - + Error - + Crash Dumps - + Decides which type of crash dumps are collected when injected processes crash. - + Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6148,37 +6257,37 @@ For the other games this is not a sufficient replacement for AI! - + None - + Mini (recommended) - + Data - + Full - + Max Dumps To Keep - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6186,12 +6295,12 @@ For the other games this is not a sufficient replacement for AI! - + Hint: right click link and copy link location - + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. @@ -6201,52 +6310,52 @@ For the other games this is not a sufficient replacement for AI! - + Confirm - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? - + Select base directory - + Select download directory - + Select mod directory - + Select cache directory - + Select profiles directory - + Select overwrite directory - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 8f714afd..d56a4bde 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -936,7 +936,7 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const } else if (role == Qt::BackgroundRole || (role == ViewMarkingScrollBar::DEFAULT_ROLE)) { if (m_ESPs[index].m_ModSelected) { - return QColor(0, 0, 255, 64); + return Settings::instance().pluginListContainedColor(); } else { return QVariant(); } diff --git a/src/settings.cpp b/src/settings.cpp index 2dbca0eb..0ecbaa23 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -50,6 +50,8 @@ along with Mod Organizer. If not, see . #include #include #include +#include +#include #include // for Qt::UserRole, etc #include // for qDebug, qWarning @@ -62,6 +64,7 @@ along with Mod Organizer. If not, see . #include #include // for pair, make_pair + using namespace MOBase; template @@ -189,6 +192,14 @@ QString Settings::deObfuscate(const QString &password) return QString::fromUtf8(buffer.constData()); } +QColor Settings::getIdealTextColor(const QColor& rBackgroundColor) +{ + const int THRESHOLD = 105; + int BackgroundDelta = (rBackgroundColor.red() * 0.299) + (rBackgroundColor.green() * 0.587) + (rBackgroundColor.blue() * 0.114); + return QColor((255 - BackgroundDelta < THRESHOLD) ? Qt::black : Qt::white); +} + + bool Settings::hideUncheckedPlugins() const { return m_Settings.value("Settings/hide_unchecked_plugins", false).toBool(); @@ -355,6 +366,26 @@ int Settings::crashDumpsMax() const return m_Settings.value("Settings/crash_dumps_max", 5).toInt(); } +QColor Settings::modlistOverwrittenLooseColor() const +{ + return m_Settings.value("Settings/overwrittenLooseFilesColor", QColor(0, 255, 0, 64)).value(); +} + +QColor Settings::modlistOverwritingLooseColor() const +{ + return m_Settings.value("Settings/overwritingLooseFilesColor", QColor(255, 0, 0, 64)).value(); +} + +QColor Settings::modlistContainsPluginColor() const +{ + return m_Settings.value("Settings/containsPluginColor", QColor(0, 0, 255, 64)).value(); +} + +QColor Settings::pluginListContainedColor() const +{ + return m_Settings.value("Settings/containedColor", QColor(0, 0, 255, 64)).value(); +} + void Settings::setNexusLogin(QString username, QString password) { m_Settings.setValue("Settings/nexus_login", true); @@ -587,13 +618,14 @@ void Settings::resetDialogs() QuestionBoxMemory::resetDialogs(); } - void Settings::query(PluginContainer *pluginContainer, QWidget *parent) { SettingsDialog dialog(pluginContainer, parent); connect(&dialog, SIGNAL(resetDialogs()), this, SLOT(resetDialogs())); + connect(&dialog, SIGNAL(resetColorSettings()), this, SLOT(resetColorSettings())); + std::vector> tabs; tabs.push_back(std::unique_ptr(new GeneralTab(this, dialog))); @@ -658,6 +690,10 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog) , m_compactBox(m_dialog.findChild("compactBox")) , m_showMetaBox(m_dialog.findChild("showMetaBox")) , m_usePrereleaseBox(m_dialog.findChild("usePrereleaseBox")) + , m_overwritingBtn(m_dialog.findChild("overwritingBtn")) + , m_overwrittenBtn(m_dialog.findChild("overwrittenBtn")) + , m_containsBtn(m_dialog.findChild("containsBtn")) + , m_containedBtn(m_dialog.findChild("containedBtn")) { // FIXME I think 'addLanguages' lives in here not in parent m_parent->addLanguages(m_languageBox); @@ -685,6 +721,50 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog) m_styleBox->setCurrentIndex(currentID); } } + /* verision using palette only works with fusion theme for some stupid reason... + m_overwritingBtn->setAutoFillBackground(true); + m_overwrittenBtn->setAutoFillBackground(true); + m_containsBtn->setAutoFillBackground(true); + m_containedBtn->setAutoFillBackground(true); + m_overwritingBtn->setPalette(QPalette(m_parent->modlistOverwritingLooseColor())); + m_overwrittenBtn->setPalette(QPalette(m_parent->modlistOverwrittenLooseColor())); + m_containsBtn->setPalette(QPalette(m_parent->modlistContainsPluginColor())); + m_containedBtn->setPalette(QPalette(m_parent->pluginListContainedColor())); + QPalette palette1 = m_overwritingBtn->palette(); + QPalette palette2 = m_overwrittenBtn->palette(); + QPalette palette3 = m_containsBtn->palette(); + QPalette palette4 = m_containedBtn->palette(); + palette1.setColor(QPalette::Background, m_parent->modlistOverwritingLooseColor()); + palette2.setColor(QPalette::Background, m_parent->modlistOverwrittenLooseColor()); + palette3.setColor(QPalette::Background, m_parent->modlistContainsPluginColor()); + palette4.setColor(QPalette::Background, m_parent->pluginListContainedColor()); + m_overwritingBtn->setPalette(palette1); + m_overwrittenBtn->setPalette(palette2); + m_containsBtn->setPalette(palette3); + m_containedBtn->setPalette(palette4); + */ + + //version with stylesheet + QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); + + + m_overwritingBtn->setStyleSheet(COLOR_STYLE.arg( + m_parent->modlistOverwritingLooseColor().name()).arg(getIdealTextColor( + m_parent->modlistOverwritingLooseColor()).name())); + m_overwrittenBtn->setStyleSheet(COLOR_STYLE.arg( + m_parent->modlistOverwrittenLooseColor().name()).arg(getIdealTextColor( + m_parent->modlistOverwrittenLooseColor()).name())); + m_containsBtn->setStyleSheet(COLOR_STYLE.arg( + m_parent->modlistContainsPluginColor().name()).arg(getIdealTextColor( + m_parent->modlistContainsPluginColor()).name())); + m_containedBtn->setStyleSheet(COLOR_STYLE.arg( + m_parent->pluginListContainedColor().name()).arg(getIdealTextColor( + m_parent->pluginListContainedColor()).name())); + + m_dialog.setOverwritingColor(m_parent->modlistOverwritingLooseColor()); + m_dialog.setOverwrittenColor(m_parent->modlistOverwrittenLooseColor()); + m_dialog.setContainsColor(m_parent->modlistContainsPluginColor()); + m_dialog.setContainedColor(m_parent->pluginListContainedColor()); m_compactBox->setChecked(m_parent->compactDownloads()); m_showMetaBox->setChecked(m_parent->metaDownloads()); @@ -707,6 +787,10 @@ void Settings::GeneralTab::update() emit m_parent->styleChanged(newStyle); } + m_Settings.setValue("Settings/overwritingLooseFilesColor", m_dialog.getOverwritingColor()); + m_Settings.setValue("Settings/overwrittenLooseFilesColor", m_dialog.getOverwrittenColor()); + m_Settings.setValue("Settings/containsPluginColor", m_dialog.getContainsColor()); + m_Settings.setValue("Settings/containedColor", m_dialog.getContainedColor()); m_Settings.setValue("Settings/compact_downloads", m_compactBox->isChecked()); m_Settings.setValue("Settings/meta_downloads", m_showMetaBox->isChecked()); m_Settings.setValue("Settings/use_prereleases", m_usePrereleaseBox->isChecked()); diff --git a/src/settings.h b/src/settings.h index c49edfcb..8fe053e8 100644 --- a/src/settings.h +++ b/src/settings.h @@ -29,6 +29,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include //for uint @@ -42,6 +43,7 @@ class QSpinBox; class QListWidget; class QWidget; class QLabel; +class QPushButton; struct ServerInfo; @@ -217,6 +219,15 @@ public: */ int crashDumpsMax() const; + QColor modlistOverwrittenLooseColor() const; + + QColor modlistOverwritingLooseColor() const; + + QColor modlistContainsPluginColor() const; + + QColor pluginListContainedColor() const; + + /** * @brief set the nexus login information * @@ -346,7 +357,8 @@ public: public slots: void managedGameChanged(MOBase::IPluginGame const *gamePlugin); - +public: + static QColor getIdealTextColor(const QColor& rBackgroundColor); private: static QString obfuscate(const QString &password); @@ -387,6 +399,10 @@ private: QCheckBox *m_compactBox; QCheckBox *m_showMetaBox; QCheckBox *m_usePrereleaseBox; + QPushButton *m_overwritingBtn; + QPushButton *m_overwrittenBtn; + QPushButton *m_containsBtn; + QPushButton *m_containedBtn; }; class PathsTab : public SettingsTab diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 058d082a..7f484830 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -33,6 +33,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #define WIN32_LEAN_AND_MEAN #include @@ -177,6 +178,109 @@ void SettingsDialog::on_browseOverwriteDirBtn_clicked() } } +void SettingsDialog::on_containsBtn_clicked() +{ + QColor result = QColorDialog::getColor(m_ContainsColor, this); + if (result.isValid()) { + m_ContainsColor = result; + + QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); + ui->containsBtn->setStyleSheet(COLOR_STYLE.arg( + result.name()).arg(Settings::getIdealTextColor( + result).name())); + + /*ui->containsBtn->setAutoFillBackground(true); + ui->containsBtn->setPalette(QPalette(result)); + QPalette palette = ui->containsBtn->palette(); + palette.setColor(QPalette::Background, result); + ui->containsBtn->setPalette(palette);*/ + } +} + +void SettingsDialog::on_containedBtn_clicked() +{ + QColor result = QColorDialog::getColor(m_ContainedColor, this); + if (result.isValid()) { + m_ContainedColor = result; + + QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); + ui->containedBtn->setStyleSheet(COLOR_STYLE.arg( + result.name()).arg(Settings::getIdealTextColor( + result).name())); + + /*ui->containedBtn->setAutoFillBackground(true); + ui->containedBtn->setPalette(QPalette(result)); + QPalette palette = ui->containedBtn->palette(); + palette.setColor(QPalette::Background, result); + ui->containedBtn->setPalette(palette);*/ + } +} + +void SettingsDialog::on_overwrittenBtn_clicked() +{ + QColor result = QColorDialog::getColor(m_OverwrittenColor, this); + if (result.isValid()) { + m_OverwrittenColor = result; + + QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); + ui->overwrittenBtn->setStyleSheet(COLOR_STYLE.arg( + result.name()).arg(Settings::getIdealTextColor( + result).name())); + + /*ui->overwrittenBtn->setAutoFillBackground(true); + ui->overwrittenBtn->setPalette(QPalette(result)); + QPalette palette = ui->overwrittenBtn->palette(); + palette.setColor(QPalette::Background, result); + ui->overwrittenBtn->setPalette(palette);*/ + } +} + +void SettingsDialog::on_overwritingBtn_clicked() +{ + QColor result = QColorDialog::getColor(m_OverwritingColor, this); + if (result.isValid()) { + m_OverwritingColor = result; + + QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); + ui->overwritingBtn->setStyleSheet(COLOR_STYLE.arg( + result.name()).arg(Settings::getIdealTextColor( + result).name())); + + /*ui->overwritingBtn->setAutoFillBackground(true); + ui->overwritingBtn->setPalette(QPalette(result)); + QPalette palette = ui->overwritingBtn->palette(); + palette.setColor(QPalette::Background, result); + ui->overwritingBtn->setPalette(palette);*/ + } +} + +void SettingsDialog::on_resetColorsBtn_clicked() +{ + m_OverwritingColor = QColor(255, 0, 0, 64); + m_OverwrittenColor = QColor(0, 255, 0, 64); + m_ContainsColor = QColor(0, 0, 255, 64); + m_ContainedColor = QColor(0, 0, 255, 64); + + QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); + + ui->overwritingBtn->setStyleSheet(COLOR_STYLE.arg( + QColor(255, 0, 0, 64).name()).arg(Settings::getIdealTextColor( + QColor(255, 0, 0, 64)).name())); + + ui->overwrittenBtn->setStyleSheet(COLOR_STYLE.arg( + QColor(0, 255, 0, 64).name()).arg(Settings::getIdealTextColor( + QColor(0, 255, 0, 64)).name())); + + ui->containsBtn->setStyleSheet(COLOR_STYLE.arg( + QColor(0, 0, 255, 64).name()).arg(Settings::getIdealTextColor( + QColor(0, 0, 255, 64)).name())); + + ui->containedBtn->setStyleSheet(COLOR_STYLE.arg( + QColor(0, 0, 255, 64).name()).arg(Settings::getIdealTextColor( + QColor(0, 0, 255, 64)).name())); + +} + void SettingsDialog::on_resetDialogsButton_clicked() { if (QMessageBox::question(this, tr("Confirm?"), diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 2e270131..c678ec78 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -56,6 +56,18 @@ private: void storeSettings(QListWidgetItem *pluginItem); +public: + + QColor getOverwritingColor() { return m_OverwritingColor; } + QColor getOverwrittenColor() { return m_OverwrittenColor; } + QColor getContainsColor() { return m_ContainsColor; } + QColor getContainedColor() { return m_ContainedColor; } + + void setOverwritingColor(QColor col) { m_OverwritingColor = col; } + void setOverwrittenColor(QColor col) { m_OverwrittenColor = col; } + void setContainsColor(QColor col) { m_ContainsColor = col; } + void setContainedColor(QColor col) { m_ContainedColor = col; } + private slots: void on_loginCheckBox_toggled(bool checked); @@ -85,9 +97,24 @@ private slots: void on_browseProfilesDirBtn_clicked(); + void on_overwritingBtn_clicked(); + + void on_overwrittenBtn_clicked(); + + void on_containsBtn_clicked(); + + void on_containedBtn_clicked(); + + void on_resetColorsBtn_clicked(); + private: Ui::SettingsDialog *ui; PluginContainer *m_PluginContainer; + + QColor m_OverwritingColor; + QColor m_OverwrittenColor; + QColor m_ContainsColor; + QColor m_ContainedColor; }; diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 05814091..4d6535dc 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -92,28 +92,65 @@ If you use pre-releases, never contact me directly by e-mail or via private mess User interface - - - - - If checked, the download interface will be more compact. - - - Compact Download Interface + + + + + Colors + + + + + Mod Contains selected Plugin + + + + + + + Plugin is Contained in selected Mod + + + + + + + Reset Colors + + + + + + + Is overwritten (loose files) + + + + + + + Is overwriting (loose files) + + + + - - + + - If checked, the download list will display meta information instead of file names. + Modify the categories available to arrange your mods. + + + Modify the categories available to arrange your mods. - Download Meta Information + Configure Mod Categories - + @@ -132,7 +169,17 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - + + + + If checked, the download interface will be more compact. + + + Compact Download Interface + + + + Qt::Vertical @@ -145,16 +192,13 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - - + + - Modify the categories available to arrange your mods. - - - Modify the categories available to arrange your mods. + If checked, the download list will display meta information instead of file names. - Configure Mod Categories + Download Meta Information @@ -1217,8 +1261,6 @@ For the other games this is not a sufficient replacement for AI! logLevelBox usePrereleaseBox compactBox - showMetaBox - resetDialogsButton categoriesBtn baseDirEdit browseBaseDirBtn -- cgit v1.3.1 From 6323a348da0e34a86d2a10c45fe9c77daafb17b9 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Thu, 1 Nov 2018 16:29:38 +0100 Subject: Fixed missing category selection for separators. --- src/mainwindow.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index d279da91..5e4bb86f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3700,6 +3700,15 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked())); menu->addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()){ + menu->addSeparator(); + QMenu *addRemoveCategoriesMenu = new QMenu(tr("Change Categories")); + populateMenuCategories(addRemoveCategoriesMenu, 0); + connect(addRemoveCategoriesMenu, SIGNAL(aboutToHide()), this, SLOT(addRemoveCategories_MenuHandler())); + addMenuAsPushButton(menu, addRemoveCategoriesMenu); + QMenu *primaryCategoryMenu = new QMenu(tr("Primary Category")); + connect(primaryCategoryMenu, SIGNAL(aboutToShow()), this, SLOT(addPrimaryCategoryCandidates())); + addMenuAsPushButton(menu, primaryCategoryMenu); + menu->addSeparator(); menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); @@ -3719,14 +3728,6 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) connect(addRemoveCategoriesMenu, SIGNAL(aboutToHide()), this, SLOT(addRemoveCategories_MenuHandler())); addMenuAsPushButton(menu, addRemoveCategoriesMenu); - //Removed as it was redundant, just making the categories look more complicated. - /* - QMenu *replaceCategoriesMenu = new QMenu(tr("Replace Categories")); - populateMenuCategories(replaceCategoriesMenu, 0); - connect(replaceCategoriesMenu, SIGNAL(aboutToHide()), this, SLOT(replaceCategories_MenuHandler())); - addMenuAsPushButton(menu, replaceCategoriesMenu); - */ - QMenu *primaryCategoryMenu = new QMenu(tr("Primary Category")); connect(primaryCategoryMenu, SIGNAL(aboutToShow()), this, SLOT(addPrimaryCategoryCandidates())); addMenuAsPushButton(menu, primaryCategoryMenu); -- cgit v1.3.1 From 2c53f9d934c27bf3d0414d5bb355dfde52cc4d73 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Thu, 1 Nov 2018 16:35:02 +0100 Subject: Cleaned up leftover from color customizzation. --- src/settings.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/settings.cpp b/src/settings.cpp index 0ecbaa23..7d9fb7c0 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -624,8 +624,6 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent) connect(&dialog, SIGNAL(resetDialogs()), this, SLOT(resetDialogs())); - connect(&dialog, SIGNAL(resetColorSettings()), this, SLOT(resetColorSettings())); - std::vector> tabs; tabs.push_back(std::unique_ptr(new GeneralTab(this, dialog))); -- cgit v1.3.1 From 3dbfba91e1618e6cdf3ed5ce7ff7955376df03eb Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 1 Nov 2018 14:51:14 -0500 Subject: Add separators according to context location of context menu --- src/mainwindow.cpp | 14 ++++++++++++++ src/mainwindow.h | 1 + src/organizercore.cpp | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5e4bb86f..5b257977 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -204,6 +204,7 @@ MainWindow::MainWindow(QSettings &initSettings , m_CategoryFactory(CategoryFactory::instance()) , m_ContextItem(nullptr) , m_ContextAction(nullptr) + , m_ContextRow(-1) , m_CurrentSaveView(nullptr) , m_OrganizerCore(organizerCore) , m_PluginContainer(pluginContainer) @@ -328,6 +329,7 @@ MainWindow::MainWindow(QSettings &initSettings ui->linkButton->setMenu(linkMenu); ui->listOptionsBtn->setMenu(modListContextMenu()); + connect(ui->listOptionsBtn, SIGNAL(pressed()), this, SLOT(on_listOptionsBtn_pressed())); ui->openFolderMenu->setMenu(openFolderMenu()); @@ -2866,8 +2868,15 @@ void MainWindow::createSeparator_clicked() { return; } + int newPriority; + if (m_ContextRow >= 0) { + newPriority = m_OrganizerCore.currentProfile()->getModPriority(m_ContextRow); + } if (m_OrganizerCore.createMod(name) == nullptr) { return; } m_OrganizerCore.refreshModList(); + if (m_ContextRow >= 0) { + m_OrganizerCore.modList()->changeModPriority(ModInfo::getIndex(name), newPriority); + } } void MainWindow::setColor_clicked() @@ -3023,6 +3032,11 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index) } } +void MainWindow::on_listOptionsBtn_pressed() +{ + m_ContextRow = -1; +} + void MainWindow::on_espList_doubleClicked(const QModelIndex &index) { if (!index.isValid()) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 9dee2953..c595575e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -590,6 +590,7 @@ private slots: // ui slots void on_executablesListBox_currentIndexChanged(int index); void on_modList_customContextMenuRequested(const QPoint &pos); void on_modList_doubleClicked(const QModelIndex &index); + void on_listOptionsBtn_pressed(); void on_espList_doubleClicked(const QModelIndex &index); void on_profileBox_currentIndexChanged(int index); void on_savegameList_customContextMenuRequested(const QPoint &pos); diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 1fafd4c1..fe720a0c 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1184,7 +1184,7 @@ QStringList OrganizerCore::modsSortedByProfilePriority() const { QStringList res; for (int i = currentProfile()->getPriorityMinimum(); - i < currentProfile()->getPriorityMinimum() + currentProfile()->numRegularMods(); + i < currentProfile()->getPriorityMinimum() + (int)currentProfile()->numRegularMods(); ++i) { int modIndex = currentProfile()->modIndexByPriority(i); res.push_back(ModInfo::getByIndex(modIndex)->name()); -- cgit v1.3.1 From 2c57899cf611056a8c5bae1f7f27c9a157df6f41 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 1 Nov 2018 17:58:49 -0500 Subject: Fix matching highlights for mod and plugin selections The selectionChanged event used before requires subtractive/additive logic to work correctly. A separate event is fired for each row and each column for each row that is selected or deselected. The previous logic assumed all of the selection was passed in at once. The logic has been changed to recalculate all highlights each time the event is fired. This is poorly optimized in regards to performance but makes the function work. --- src/mainwindow.cpp | 4 ++-- src/modlist.cpp | 5 +++-- src/modlist.h | 2 +- src/pluginlist.cpp | 11 +++++++---- src/pluginlist.h | 2 +- 5 files changed, 14 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5b257977..752c5c76 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2341,13 +2341,13 @@ void MainWindow::modlistSelectionChanged(const QModelIndex ¤t, const QMode void MainWindow::modlistSelectionsChanged(const QItemSelection &selected) { - m_OrganizerCore.pluginList()->highlightPlugins(selected, *m_OrganizerCore.directoryStructure(), *m_OrganizerCore.currentProfile()); + m_OrganizerCore.pluginList()->highlightPlugins(ui->modList->selectionModel(), *m_OrganizerCore.directoryStructure(), *m_OrganizerCore.currentProfile()); ui->espList->verticalScrollBar()->repaint(); } void MainWindow::esplistSelectionsChanged(const QItemSelection &selected) { - m_OrganizerCore.modList()->highlightMods(selected, *m_OrganizerCore.directoryStructure()); + m_OrganizerCore.modList()->highlightMods(ui->espList->selectionModel(), *m_OrganizerCore.directoryStructure()); ui->modList->verticalScrollBar()->repaint(); } diff --git a/src/modlist.cpp b/src/modlist.cpp index 3f8fa0c0..539ba6fc 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -24,6 +24,7 @@ along with Mod Organizer. If not, see . #include "qtgroupingproxy.h" #include "viewmarkingscrollbar.h" #include "modlistsortproxy.h" +#include "pluginlist.h" #include "settings.h" #include "modinforegular.h" #include @@ -768,12 +769,12 @@ int ModList::timeElapsedSinceLastChecked() const return m_LastCheck.elapsed(); } -void ModList::highlightMods(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry) +void ModList::highlightMods(const QItemSelectionModel *selection, const MOShared::DirectoryEntry &directoryEntry) { for (unsigned int i = 0; i < ModInfo::getNumMods(); ++i) { ModInfo::getByIndex(i)->setPluginSelected(false); } - for (QModelIndex idx : selected.indexes()) { + for (QModelIndex idx : selection->selectedRows(PluginList::COL_NAME)) { QString modName = idx.data().toString(); const MOShared::FileEntry::Ptr fileEntry = directoryEntry.findFile(modName.toStdWString()); diff --git a/src/modlist.h b/src/modlist.h index caad8c61..8de08da3 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -118,7 +118,7 @@ public: int timeElapsedSinceLastChecked() const; - void highlightMods(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry); + void highlightMods(const QItemSelectionModel *selection, const MOShared::DirectoryEntry &directoryEntry); public: diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index d56a4bde..21e716d3 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -21,6 +21,7 @@ along with Mod Organizer. If not, see . #include "settings.h" #include "scopeguard.h" #include "modinfo.h" +#include "modlist.h" #include "viewmarkingscrollbar.h" #include #include @@ -119,14 +120,16 @@ QString PluginList::getColumnToolTip(int column) } } -void PluginList::highlightPlugins(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry, const Profile &profile) +void PluginList::highlightPlugins(const QItemSelectionModel *selection, const MOShared::DirectoryEntry &directoryEntry, const Profile &profile) { for (auto &esp : m_ESPs) { esp.m_ModSelected = false; } - for (QModelIndex idx : selected.indexes()) { - ModInfo::Ptr selectedMod = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt()); - if (!selectedMod.isNull() && profile.modEnabled(idx.data(Qt::UserRole + 1).toInt())) { + for (QModelIndex idx : selection->selectedRows(ModList::COL_PRIORITY)) { + int modPriority = idx.data().toInt(); + int modIndex = profile.modIndexByPriority(modPriority); + ModInfo::Ptr selectedMod = ModInfo::getByIndex(modIndex); + if (!selectedMod.isNull() && profile.modEnabled(modIndex)) { QDir dir(selectedMod->absolutePath()); QStringList plugins = dir.entryList(QStringList() << "*.esp" << "*.esm" << "*.esl"); MOShared::FilesOrigin origin = directoryEntry.getOriginByName(selectedMod->internalName().toStdWString()); diff --git a/src/pluginlist.h b/src/pluginlist.h index 009c9153..f7817c37 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -206,7 +206,7 @@ public: static QString getColumnName(int column); static QString getColumnToolTip(int column); - void highlightPlugins(const QItemSelection &selected, const MOShared::DirectoryEntry &directoryEntry, const Profile &profile); + void highlightPlugins(const QItemSelectionModel *selection, const MOShared::DirectoryEntry &directoryEntry, const Profile &profile); void refreshLoadOrder(); -- cgit v1.3.1 From 78cd0110d3b84af0b6eda12ea6134595d9fce47f Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 2 Nov 2018 19:29:50 +0100 Subject: Updated Skyrim and VS15 theme to fix highlighting on ESPlist. --- src/stylesheets/skyrim.qss | 11 +++++------ src/stylesheets/vs15 Dark-Green.qss | 29 +++++++++++++++-------------- src/stylesheets/vs15 Dark-Orange.qss | 34 +++++++++++++++------------------- src/stylesheets/vs15 Dark-Purple.qss | 34 +++++++++++++++------------------- src/stylesheets/vs15 Dark-Red.qss | 34 +++++++++++++++------------------- src/stylesheets/vs15 Dark-Yellow.qss | 34 +++++++++++++++------------------- src/stylesheets/vs15 Dark.qss | 33 +++++++++++++++------------------ 7 files changed, 95 insertions(+), 114 deletions(-) (limited to 'src') diff --git a/src/stylesheets/skyrim.qss b/src/stylesheets/skyrim.qss index 727c70af..85a5b79c 100644 --- a/src/stylesheets/skyrim.qss +++ b/src/stylesheets/skyrim.qss @@ -2,7 +2,7 @@ Skyrim **************************************** Author: chintsu_kun - Version: 2.0.0 + Version: 2.0.1 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** @@ -12,10 +12,9 @@ QWidget { color: #F1F1F1; } /* Common */ -/* fix: fo some reason applying background-color or border fixes paddings properties */ -QListView::item, -QTreeView#espList::item, -QTreeWidget#categoriesList::item { +/* FIX: For some reason applying background-color or border fixes paddings + properties */ +QListWidget::item { border-width: 0; } * { @@ -167,7 +166,7 @@ QLineEdit { QLineEdit#downloadFilterEdit { margin: 0 4px 4px 0; } -/* Dropdowns #QComboBox*/ +/* Drop-downs #QComboBox*/ QComboBox { min-height: 20px; padding-left: 5px; diff --git a/src/stylesheets/vs15 Dark-Green.qss b/src/stylesheets/vs15 Dark-Green.qss index 0fbcc896..f1e3b4a9 100644 --- a/src/stylesheets/vs15 Dark-Green.qss +++ b/src/stylesheets/vs15 Dark-Green.qss @@ -2,12 +2,11 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 1.3.1 + Version: 2.0.1 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/* or #434346*/ /* Main Window */ QWidget { background-color: #2D2D30; @@ -16,10 +15,9 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings properties */ -QListView::item, -QTreeView#espList::item, -QTreeWidget#categoriesList::item { +/* FIX: For some reason applying background-color or border fixes paddings + properties. Otherwise padding is only applied when item is hovered */ +QListWidget::item { border-width: 0; } /* remove outline */ @@ -32,7 +30,10 @@ QListView::item:disabled, color: #656565; } /* line heights */ -/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +/* QTreeView#fileTree::item - currently have problem with size column vertical + text align */ +#bsaList::item, +#dataTree::item, QTreeView#modList::item, QTreeWidget#categoriesTree::item, #tabConflicts QTreeWidget::item { @@ -146,7 +147,7 @@ QLineEdit#espFilterEdit QToolButton { margin-top: -2px; margin-bottom: 1px; } -/* Dropdowns #QComboBox*/ +/* Drop-downs #QComboBox*/ QComboBox { min-height: 20px; padding-left: 5px; @@ -162,7 +163,7 @@ QComboBox { subcontrol-origin: padding; subcontrol-position: top right; border: none; - /* If you need to set style for drop down button + /* If you need to set style for drop-down button &:on, &:editable:hover { background-color: red; @@ -295,8 +296,8 @@ QDialog QPushButton { padding-left: .5em; padding-right: .5em; } -/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ -/*common*/ +/* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -324,7 +325,7 @@ QTreeView::indicator:checked:disabled, QCheckBox::indicator:checked:disabled { image: url(./vs15/checkbox-check-disabled.png); } -/* Checkboxes special */ +/* Check boxes special */ QTreeView#modList::indicator { width: 15px; height: 15px; } @@ -537,7 +538,7 @@ QHeaderView::down-arrow { image: url(./vs15/sort-desc.png); margin-bottom: 0; } -/* Context menus, toolbar dropdowns #QMenu */ +/* Context menus, toolbar drop-downs #QMenu */ QMenu { background-color: #1A1A1C; border-color: #333337; @@ -734,7 +735,7 @@ QLineEdit#modFilterEdit { QWidget#bsaTab QTreeWidget::indicator:unchecked { background-color: #009933; } -/* increase version textfield */ +/* increase version text field */ QLineEdit#versionEdit { max-width: 100px; } diff --git a/src/stylesheets/vs15 Dark-Orange.qss b/src/stylesheets/vs15 Dark-Orange.qss index 3a4eb86b..0b3808e7 100644 --- a/src/stylesheets/vs15 Dark-Orange.qss +++ b/src/stylesheets/vs15 Dark-Orange.qss @@ -2,18 +2,12 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 1.3.1 + Version: 2.0.1 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/* or #434346*/ /*base*/ -/*#3399FF*/ -/*#007ACC*/ -/*#1C97EA*/ -/*#3C7FB1*/ -/*#BEE6FD*/ /* Main Window */ QWidget { background-color: #2D2D30; @@ -22,10 +16,9 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings properties */ -QListView::item, -QTreeView#espList::item, -QTreeWidget#categoriesList::item { +/* FIX: For some reason applying background-color or border fixes paddings + properties. Otherwise padding is only applied when item is hovered */ +QListWidget::item { border-width: 0; } /* remove outline */ @@ -38,7 +31,10 @@ QListView::item:disabled, color: #656565; } /* line heights */ -/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +/* QTreeView#fileTree::item - currently have problem with size column vertical + text align */ +#bsaList::item, +#dataTree::item, QTreeView#modList::item, QTreeWidget#categoriesTree::item, #tabConflicts QTreeWidget::item { @@ -152,7 +148,7 @@ QLineEdit#espFilterEdit QToolButton { margin-top: -2px; margin-bottom: 1px; } -/* Dropdowns #QComboBox*/ +/* Drop-downs #QComboBox*/ QComboBox { min-height: 20px; padding-left: 5px; @@ -168,7 +164,7 @@ QComboBox { subcontrol-origin: padding; subcontrol-position: top right; border: none; - /* If you need to set style for drop down button + /* If you need to set style for drop-down button &:on, &:editable:hover { background-color: red; @@ -301,8 +297,8 @@ QDialog QPushButton { padding-left: .5em; padding-right: .5em; } -/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ -/*common*/ +/* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -330,7 +326,7 @@ QTreeView::indicator:checked:disabled, QCheckBox::indicator:checked:disabled { image: url(./vs15/checkbox-check-disabled.png); } -/* Checkboxes special */ +/* Check boxes special */ QTreeView#modList::indicator { width: 15px; height: 15px; } @@ -543,7 +539,7 @@ QHeaderView::down-arrow { image: url(./vs15/sort-desc.png); margin-bottom: 0; } -/* Context menus, toolbar dropdowns #QMenu */ +/* Context menus, toolbar drop-downs #QMenu */ QMenu { background-color: #1A1A1C; border-color: #333337; @@ -740,7 +736,7 @@ QLineEdit#modFilterEdit { QWidget#bsaTab QTreeWidget::indicator:unchecked { background-color: #CC6600; } -/* increase version textfield */ +/* increase version text field */ QLineEdit#versionEdit { max-width: 100px; } diff --git a/src/stylesheets/vs15 Dark-Purple.qss b/src/stylesheets/vs15 Dark-Purple.qss index c186ae55..33212038 100644 --- a/src/stylesheets/vs15 Dark-Purple.qss +++ b/src/stylesheets/vs15 Dark-Purple.qss @@ -2,18 +2,12 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 1.3.1 + Version: 2.0.1 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/* or #434346*/ /*base*/ -/*#3399FF*/ -/*#007ACC*/ -/*#1C97EA*/ -/*#3C7FB1*/ -/*#BEE6FD*/ /* Main Window */ QWidget { background-color: #2D2D30; @@ -22,10 +16,9 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings properties */ -QListView::item, -QTreeView#espList::item, -QTreeWidget#categoriesList::item { +/* FIX: For some reason applying background-color or border fixes paddings + properties. Otherwise padding is only applied when item is hovered */ +QListWidget::item { border-width: 0; } /* remove outline */ @@ -38,7 +31,10 @@ QListView::item:disabled, color: #656565; } /* line heights */ -/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +/* QTreeView#fileTree::item - currently have problem with size column vertical + text align */ +#bsaList::item, +#dataTree::item, QTreeView#modList::item, QTreeWidget#categoriesTree::item, #tabConflicts QTreeWidget::item { @@ -152,7 +148,7 @@ QLineEdit#espFilterEdit QToolButton { margin-top: -2px; margin-bottom: 1px; } -/* Dropdowns #QComboBox*/ +/* Drop-downs #QComboBox*/ QComboBox { min-height: 20px; padding-left: 5px; @@ -168,7 +164,7 @@ QComboBox { subcontrol-origin: padding; subcontrol-position: top right; border: none; - /* If you need to set style for drop down button + /* If you need to set style for drop-down button &:on, &:editable:hover { background-color: red; @@ -301,8 +297,8 @@ QDialog QPushButton { padding-left: .5em; padding-right: .5em; } -/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ -/*common*/ +/* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -330,7 +326,7 @@ QTreeView::indicator:checked:disabled, QCheckBox::indicator:checked:disabled { image: url(./vs15/checkbox-check-disabled.png); } -/* Checkboxes special */ +/* Check boxes special */ QTreeView#modList::indicator { width: 15px; height: 15px; } @@ -543,7 +539,7 @@ QHeaderView::down-arrow { image: url(./vs15/sort-desc.png); margin-bottom: 0; } -/* Context menus, toolbar dropdowns #QMenu */ +/* Context menus, toolbar drop-downs #QMenu */ QMenu { background-color: #1A1A1C; border-color: #333337; @@ -740,7 +736,7 @@ QLineEdit#modFilterEdit { QWidget#bsaTab QTreeWidget::indicator:unchecked { background-color: #7E2AD2; } -/* increase version textfield */ +/* increase version text field */ QLineEdit#versionEdit { max-width: 100px; } diff --git a/src/stylesheets/vs15 Dark-Red.qss b/src/stylesheets/vs15 Dark-Red.qss index 18ef91f0..bc264fa0 100644 --- a/src/stylesheets/vs15 Dark-Red.qss +++ b/src/stylesheets/vs15 Dark-Red.qss @@ -2,18 +2,12 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 1.3.1 + Version: 2.0.1 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/* or #434346*/ /*base*/ -/*#3399FF*/ -/*#007ACC*/ -/*#1C97EA*/ -/*#3C7FB1*/ -/*#BEE6FD*/ /* Main Window */ QWidget { background-color: #2D2D30; @@ -22,10 +16,9 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings properties */ -QListView::item, -QTreeView#espList::item, -QTreeWidget#categoriesList::item { +/* FIX: For some reason applying background-color or border fixes paddings + properties. Otherwise padding is only applied when item is hovered */ +QListWidget::item { border-width: 0; } /* remove outline */ @@ -38,7 +31,10 @@ QListView::item:disabled, color: #656565; } /* line heights */ -/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +/* QTreeView#fileTree::item - currently have problem with size column vertical + text align */ +#bsaList::item, +#dataTree::item, QTreeView#modList::item, QTreeWidget#categoriesTree::item, #tabConflicts QTreeWidget::item { @@ -152,7 +148,7 @@ QLineEdit#espFilterEdit QToolButton { margin-top: -2px; margin-bottom: 1px; } -/* Dropdowns #QComboBox*/ +/* Drop-downs #QComboBox*/ QComboBox { min-height: 20px; padding-left: 5px; @@ -168,7 +164,7 @@ QComboBox { subcontrol-origin: padding; subcontrol-position: top right; border: none; - /* If you need to set style for drop down button + /* If you need to set style for drop-down button &:on, &:editable:hover { background-color: red; @@ -301,8 +297,8 @@ QDialog QPushButton { padding-left: .5em; padding-right: .5em; } -/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ -/*common*/ +/* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -330,7 +326,7 @@ QTreeView::indicator:checked:disabled, QCheckBox::indicator:checked:disabled { image: url(./vs15/checkbox-check-disabled.png); } -/* Checkboxes special */ +/* Check boxes special */ QTreeView#modList::indicator { width: 15px; height: 15px; } @@ -543,7 +539,7 @@ QHeaderView::down-arrow { image: url(./vs15/sort-desc.png); margin-bottom: 0; } -/* Context menus, toolbar dropdowns #QMenu */ +/* Context menus, toolbar drop-downs #QMenu */ QMenu { background-color: #1A1A1C; border-color: #333337; @@ -740,7 +736,7 @@ QLineEdit#modFilterEdit { QWidget#bsaTab QTreeWidget::indicator:unchecked { background-color: #990000; } -/* increase version textfield */ +/* increase version text field */ QLineEdit#versionEdit { max-width: 100px; } diff --git a/src/stylesheets/vs15 Dark-Yellow.qss b/src/stylesheets/vs15 Dark-Yellow.qss index e7976e42..6a67a327 100644 --- a/src/stylesheets/vs15 Dark-Yellow.qss +++ b/src/stylesheets/vs15 Dark-Yellow.qss @@ -2,18 +2,12 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 1.3.1 + Version: 2.0.1 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/* or #434346*/ /*base*/ -/*#3399FF*/ -/*#007ACC*/ -/*#1C97EA*/ -/*#3C7FB1*/ -/*#BEE6FD*/ /* Main Window */ QWidget { background-color: #2D2D30; @@ -22,10 +16,9 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings properties */ -QListView::item, -QTreeView#espList::item, -QTreeWidget#categoriesList::item { +/* FIX: For some reason applying background-color or border fixes paddings + properties. Otherwise padding is only applied when item is hovered */ +QListWidget::item { border-width: 0; } /* remove outline */ @@ -38,7 +31,10 @@ QListView::item:disabled, color: #656565; } /* line heights */ -/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +/* QTreeView#fileTree::item - currently have problem with size column vertical + text align */ +#bsaList::item, +#dataTree::item, QTreeView#modList::item, QTreeWidget#categoriesTree::item, #tabConflicts QTreeWidget::item { @@ -152,7 +148,7 @@ QLineEdit#espFilterEdit QToolButton { margin-top: -2px; margin-bottom: 1px; } -/* Dropdowns #QComboBox*/ +/* Drop-downs #QComboBox*/ QComboBox { min-height: 20px; padding-left: 5px; @@ -168,7 +164,7 @@ QComboBox { subcontrol-origin: padding; subcontrol-position: top right; border: none; - /* If you need to set style for drop down button + /* If you need to set style for drop-down button &:on, &:editable:hover { background-color: red; @@ -301,8 +297,8 @@ QDialog QPushButton { padding-left: .5em; padding-right: .5em; } -/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ -/*common*/ +/* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -330,7 +326,7 @@ QTreeView::indicator:checked:disabled, QCheckBox::indicator:checked:disabled { image: url(./vs15/checkbox-check-disabled.png); } -/* Checkboxes special */ +/* Check boxes special */ QTreeView#modList::indicator { width: 15px; height: 15px; } @@ -543,7 +539,7 @@ QHeaderView::down-arrow { image: url(./vs15/sort-desc.png); margin-bottom: 0; } -/* Context menus, toolbar dropdowns #QMenu */ +/* Context menus, toolbar drop-downs #QMenu */ QMenu { background-color: #1A1A1C; border-color: #333337; @@ -740,7 +736,7 @@ QLineEdit#modFilterEdit { QWidget#bsaTab QTreeWidget::indicator:unchecked { background-color: #9A9A00; } -/* increase version textfield */ +/* increase version text field */ QLineEdit#versionEdit { max-width: 100px; } diff --git a/src/stylesheets/vs15 Dark.qss b/src/stylesheets/vs15 Dark.qss index a88a7edf..f43e3631 100644 --- a/src/stylesheets/vs15 Dark.qss +++ b/src/stylesheets/vs15 Dark.qss @@ -2,17 +2,12 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 1.3.1 + Version: 2.0.1 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/* or #434346*/ /*base*/ -/*$color-text-box-border-focus: #3399FF; = $color-input-border-focus*/ -/*$color-text-box-border-hover: #007ACC; = $color-input-border-hover*/ -/*$color-combo-box-hover-border: #007ACC;*/ -/*$color-check-box-hover-border: #007ACC; = $color-input-border-hover*/ /* Main Window */ QWidget { background-color: #2D2D30; @@ -21,10 +16,9 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings properties */ -QListView::item, -QTreeView#espList::item, -QTreeWidget#categoriesList::item { +/* FIX: For some reason applying background-color or border fixes paddings + properties. Otherwise padding is only applied when item is hovered */ +QListWidget::item { border-width: 0; } /* remove outline */ @@ -37,7 +31,10 @@ QListView::item:disabled, color: #656565; } /* line heights */ -/* QTreeView#fileTree::item - currently have problem with size column vertical text align */ +/* QTreeView#fileTree::item - currently have problem with size column vertical + text align */ +#bsaList::item, +#dataTree::item, QTreeView#modList::item, QTreeWidget#categoriesTree::item, #tabConflicts QTreeWidget::item { @@ -151,7 +148,7 @@ QLineEdit#espFilterEdit QToolButton { margin-top: -2px; margin-bottom: 1px; } -/* Dropdowns #QComboBox*/ +/* Drop-downs #QComboBox*/ QComboBox { min-height: 20px; padding-left: 5px; @@ -167,7 +164,7 @@ QComboBox { subcontrol-origin: padding; subcontrol-position: top right; border: none; - /* If you need to set style for drop down button + /* If you need to set style for drop-down button &:on, &:editable:hover { background-color: red; @@ -300,8 +297,8 @@ QDialog QPushButton { padding-left: .5em; padding-right: .5em; } -/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ -/*common*/ +/* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -329,7 +326,7 @@ QTreeView::indicator:checked:disabled, QCheckBox::indicator:checked:disabled { image: url(./vs15/checkbox-check-disabled.png); } -/* Checkboxes special */ +/* Check boxes special */ QTreeView#modList::indicator { width: 15px; height: 15px; } @@ -542,7 +539,7 @@ QHeaderView::down-arrow { image: url(./vs15/sort-desc.png); margin-bottom: 0; } -/* Context menus, toolbar dropdowns #QMenu */ +/* Context menus, toolbar drop-downs #QMenu */ QMenu { background-color: #1A1A1C; border-color: #333337; @@ -739,7 +736,7 @@ QLineEdit#modFilterEdit { QWidget#bsaTab QTreeWidget::indicator:unchecked { background-color: #3399FF; } -/* increase version textfield */ +/* increase version text field */ QLineEdit#versionEdit { max-width: 100px; } -- cgit v1.3.1 From 17f1cf0aabf29453f7c00644f7aee93f83f2bca8 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 2 Nov 2018 21:02:14 -0500 Subject: Allow switching instances when MO is launched with moshortcut://: --- src/instancemanager.cpp | 3 ++- src/main.cpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/instancemanager.cpp b/src/instancemanager.cpp index 1c6542e8..9e785fc4 100644 --- a/src/instancemanager.cpp +++ b/src/instancemanager.cpp @@ -66,6 +66,7 @@ void InstanceManager::clearCurrentInstance() { setCurrentInstance(""); m_Reset = true; + m_overrideInstance = false; } void InstanceManager::setCurrentInstance(const QString &name) @@ -324,4 +325,4 @@ QString InstanceManager::sanitizeInstanceName(const QString &name) const return sanitizeInstanceName(new_name); } return new_name; -} \ No newline at end of file +} diff --git a/src/main.cpp b/src/main.cpp index bfc3b926..43b52609 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -715,5 +715,6 @@ int main(int argc, char *argv[]) return result; } argc = 1; + moshortcut = MOShortcut(""); } while (true); } -- cgit v1.3.1 From 1189b8cc339ad8f55814748ff7eea5bda08b45fd Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 4 Nov 2018 16:19:54 +0100 Subject: Made the "checked" filter show separators. --- src/modlistsortproxy.cpp | 2 +- src/organizer_en.ts | 522 ++++++++++++++++++++++++----------------------- 2 files changed, 263 insertions(+), 261 deletions(-) (limited to 'src') diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index 59784642..9adaa511 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -253,7 +253,7 @@ bool ModListSortProxy::filterMatchesModAnd(ModInfo::Ptr info, bool enabled) cons for (auto iter = m_CategoryFilter.begin(); iter != m_CategoryFilter.end(); ++iter) { switch (*iter) { case CategoryFactory::CATEGORY_SPECIAL_CHECKED: { - if (!enabled && !info->alwaysEnabled()) return false; + if (!enabled && !info->alwaysEnabled() && !info->hasFlag(ModInfo::FLAG_SEPARATOR)) return false; } break; case CategoryFactory::CATEGORY_SPECIAL_UNCHECKED: { if (enabled || info->alwaysEnabled()) return false; diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 3d2f1744..14a103ad 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1607,7 +1607,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1771,8 +1771,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1956,7 +1956,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1967,7 +1967,7 @@ p, li { white-space: pre-wrap; } - + No Problems @@ -1997,7 +1997,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2017,776 +2017,778 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - + Rename Separator... - + Remove Separator... - - - + + + Send to Top - - - + + + Send to Bottom - + Select Color... - + Reset Color - + + Change Categories - + + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2794,12 +2796,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2807,329 +2809,329 @@ 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 - + Send to top - + Send to bottom - + 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 @@ -5380,7 +5382,7 @@ If the folder was still in use, restart MO and try again. - + Mod Organizer @@ -5395,18 +5397,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 @@ -5457,12 +5459,12 @@ If the folder was still in use, restart MO and try again. - + Script Extender - + Proxy DLL @@ -5682,12 +5684,12 @@ Select Show Details option to see the full change-log. - + Error - + Failed to create "%1", you may not have the necessary permission. path remains unchanged. -- cgit v1.3.1 From 2e09e633bd40f9844d0346ae86b19b9709d8a735 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 4 Nov 2018 12:32:32 -0600 Subject: Fix creating separators when right-clicking overwrite --- src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 752c5c76..7c7d9c95 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2874,7 +2874,7 @@ void MainWindow::createSeparator_clicked() } if (m_OrganizerCore.createMod(name) == nullptr) { return; } m_OrganizerCore.refreshModList(); - if (m_ContextRow >= 0) { + if (m_ContextRow >= 0 && newPriority >= 0) { m_OrganizerCore.modList()->changeModPriority(ModInfo::getIndex(name), newPriority); } } -- cgit v1.3.1 From a48a20f13fd20e599c2055752bae5065bce43700 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 4 Nov 2018 13:10:41 -0600 Subject: Add context menu option to send to a specific priority --- src/mainwindow.cpp | 84 ++++++++++++++++++++++++++++++++++++++---------------- src/mainwindow.h | 11 +++++-- src/pluginlist.cpp | 23 ++------------- src/pluginlist.h | 9 ++---- 4 files changed, 72 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7c7d9c95..3d7cc13b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3683,6 +3683,26 @@ QMenu *MainWindow::modListContextMenu() return menu; } +QMenu *MainWindow::modSendToContextMenu() +{ + QMenu *menu = new QMenu(this); + menu->setTitle(tr("Send to")); + menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); + menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); + menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); + return menu; +} + +QMenu *MainWindow::pluginSendToContextMenu() +{ + QMenu *menu = new QMenu(this); + menu->setTitle(tr("Send to")); + menu->addAction(tr("Top"), this, SLOT(sendSelectedPluginsToTop_clicked())); + menu->addAction(tr("Bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + menu->addAction(tr("Priority..."), this, SLOT(sendSelectedPluginsToPriority_clicked())); + return menu; +} + void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) { try { @@ -3726,16 +3746,14 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); - menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); - menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addMenu(modSendToContextMenu()); menu->addSeparator(); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); if(info->getColor().isValid()) menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { - menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); - menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addMenu(modSendToContextMenu()); } else { QMenu *addRemoveCategoriesMenu = new QMenu(tr("Change Categories")); populateMenuCategories(addRemoveCategoriesMenu, 0); @@ -3767,8 +3785,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addSeparator(); - menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); - menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addMenu(modSendToContextMenu()); menu->addSeparator(); @@ -4358,12 +4375,23 @@ void MainWindow::disableSelectedPlugins_clicked() void MainWindow::sendSelectedPluginsToTop_clicked() { - m_OrganizerCore.pluginList()->sendToTop(ui->espList->selectionModel()); + m_OrganizerCore.pluginList()->sendToPriority(ui->espList->selectionModel(), 0); } void MainWindow::sendSelectedPluginsToBottom_clicked() { - m_OrganizerCore.pluginList()->sendToBottom(ui->espList->selectionModel()); + m_OrganizerCore.pluginList()->sendToPriority(ui->espList->selectionModel(), INT_MAX); +} + +void MainWindow::sendSelectedPluginsToPriority_clicked() +{ + bool ok; + int newPriority = QInputDialog::getInt(this, + tr("Set Priority"), tr("Set the priority of the selected mods"), + 0, 0, INT_MAX, 1, &ok); + if (!ok) return; + + m_OrganizerCore.pluginList()->sendToPriority(ui->espList->selectionModel(), newPriority); } @@ -4993,8 +5021,7 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addSeparator(); - menu.addAction(tr("Send to top"), this, SLOT(sendSelectedPluginsToTop_clicked())); - menu.addAction(tr("Send to bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + menu.addMenu(pluginSendToContextMenu()); QItemSelection currentSelection = ui->espList->selectionModel()->selection(); bool hasLocked = false; @@ -5607,30 +5634,37 @@ void MainWindow::on_clearFiltersButton_clicked() deselectFilters(); } -void MainWindow::sendModToTop_clicked() +void MainWindow::sendSelectedModsToPriority(int newPriority) { QItemSelectionModel *selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { std::vector modsToMove; for (QModelIndex idx : selection->selectedRows()) { - modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); + modsToMove.push_back(idx.data().toInt()); } - m_OrganizerCore.modList()->changeModPriority(modsToMove, 0); + m_OrganizerCore.modList()->changeModPriority(modsToMove, newPriority); } else { - m_OrganizerCore.modList()->changeModPriority(m_ContextRow, 0); + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, newPriority); } } -void MainWindow::sendModToBottom_clicked() +void MainWindow::sendSelectedModsToTop_clicked() { - QItemSelectionModel *selection = ui->modList->selectionModel(); - if (selection->hasSelection() && selection->selectedRows().count() > 1) { - std::vector modsToMove; - for (QModelIndex idx : selection->selectedRows()) { - modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); - } - m_OrganizerCore.modList()->changeModPriority(modsToMove, INT_MAX); - } else { - m_OrganizerCore.modList()->changeModPriority(m_ContextRow, INT_MAX); - } + sendSelectedModsToPriority(0); +} + +void MainWindow::sendSelectedModsToBottom_clicked() +{ + sendSelectedModsToPriority(INT_MAX); +} + +void MainWindow::sendSelectedModsToPriority_clicked() +{ + bool ok; + int newPriority = QInputDialog::getInt(this, + tr("Set Priority"), tr("Set the priority of the selected mods"), + 0, 0, INT_MAX, 1, &ok); + if (!ok) return; + + sendSelectedModsToPriority(newPriority); } diff --git a/src/mainwindow.h b/src/mainwindow.h index c595575e..85b3fc2d 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -278,6 +278,8 @@ private: QString queryRestore(const QString &filePath); QMenu *modListContextMenu(); + QMenu *modSendToContextMenu(); + QMenu *pluginSendToContextMenu(); QMenu *openFolderMenu(); @@ -294,6 +296,9 @@ private: bool registerWidgetState(const QString &name, QHeaderView *view, const char *oldSettingName = nullptr); + void sendSelectedModsToPriority(int newPriority); + void sendSelectedPluginsToPriority(int newPriority); + private: static const char *PATTERN_BACKUP_GLOB; @@ -423,8 +428,9 @@ private slots: void information_clicked(); void enableSelectedMods_clicked(); void disableSelectedMods_clicked(); - void sendModToTop_clicked(); - void sendModToBottom_clicked(); + void sendSelectedModsToTop_clicked(); + void sendSelectedModsToBottom_clicked(); + void sendSelectedModsToPriority_clicked(); // savegame context menu void deleteSavegame_clicked(); void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets); @@ -441,6 +447,7 @@ private slots: void disableSelectedPlugins_clicked(); void sendSelectedPluginsToTop_clicked(); void sendSelectedPluginsToBottom_clicked(); + void sendSelectedPluginsToPriority_clicked(); void linkToolbar(); void linkDesktop(); diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 21e716d3..480cb014 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -359,7 +359,7 @@ void PluginList::disableAll() } } -void PluginList::sendToTop(const QItemSelectionModel *selectionModel) +void PluginList::sendToPriority(const QItemSelectionModel *selectionModel, int newPriority) { if (selectionModel->hasSelection()) { std::vector pluginsToMove; @@ -370,30 +370,11 @@ void PluginList::sendToTop(const QItemSelectionModel *selectionModel) } } if (pluginsToMove.size()) { - changePluginPriority(pluginsToMove, 0); - emit SIGNAL(displayPlugin(0)); + changePluginPriority(pluginsToMove, newPriority); } } } -void PluginList::sendToBottom(const QItemSelectionModel *selectionModel) -{ - if (selectionModel->hasSelection()) { - std::vector pluginsToMove; - for (auto row: selectionModel->selectedRows(COL_PRIORITY)) { - int rowIndex = findPluginByPriority(row.data().toInt()); - if (!m_ESPs[rowIndex].m_ForceEnabled) { - pluginsToMove.push_back(rowIndex); - } - } - if (pluginsToMove.size()) { - changePluginPriority(pluginsToMove, INT_MAX); - emit SIGNAL(displayPlugin(INT_MAX)); - } - } -} - - bool PluginList::isEnabled(const QString &name) { std::map::iterator iter = m_ESPsByName.find(name.toLower()); diff --git a/src/pluginlist.h b/src/pluginlist.h index f7817c37..228ccdec 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -265,14 +265,9 @@ public slots: void disableAll(); /** - * @brief moves selected plugins to the top (lowest priority) + * @brief moves selected plugins to specified priority **/ - void sendToTop(const QItemSelectionModel *selectionModel); - - /** - * @brief moves selected plugins to the bottom (highest priority) - **/ - void sendToBottom(const QItemSelectionModel *selectionModel); + void sendToPriority(const QItemSelectionModel *selectionModel, int priority); /** * @brief The currently managed game has changed -- cgit v1.3.1 From 21d61e617bb03bcb1f73b16d42e52742a3b0ae67 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 4 Nov 2018 13:39:22 -0600 Subject: Hide "send to" context menu options when not sorting by priority --- src/mainwindow.cpp | 51 ++++++++++++++++++++++++++++----------------------- src/mainwindow.h | 4 ++-- 2 files changed, 30 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3d7cc13b..92127e0a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3683,24 +3683,34 @@ QMenu *MainWindow::modListContextMenu() return menu; } -QMenu *MainWindow::modSendToContextMenu() +void MainWindow::addModSendToContextMenu(QMenu *menu) { - QMenu *menu = new QMenu(this); - menu->setTitle(tr("Send to")); - menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); - menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); - menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); - return menu; + if (m_ModListSortProxy->sortColumn() != ModList::COL_PRIORITY) + return; + + QMenu *sub_menu = new QMenu(this); + sub_menu->setTitle(tr("Send to")); + sub_menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); + sub_menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); + sub_menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); + + menu->addMenu(sub_menu); + menu->addSeparator(); } -QMenu *MainWindow::pluginSendToContextMenu() +void MainWindow::addPluginSendToContextMenu(QMenu *menu) { - QMenu *menu = new QMenu(this); - menu->setTitle(tr("Send to")); - menu->addAction(tr("Top"), this, SLOT(sendSelectedPluginsToTop_clicked())); - menu->addAction(tr("Bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); - menu->addAction(tr("Priority..."), this, SLOT(sendSelectedPluginsToPriority_clicked())); - return menu; + if (m_PluginListSortProxy->sortColumn() != PluginList::COL_PRIORITY) + return; + + QMenu *sub_menu = new QMenu(this); + sub_menu->setTitle(tr("Send to")); + sub_menu->addAction(tr("Top"), this, SLOT(sendSelectedPluginsToTop_clicked())); + sub_menu->addAction(tr("Bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + sub_menu->addAction(tr("Priority..."), this, SLOT(sendSelectedPluginsToPriority_clicked())); + + menu->addMenu(sub_menu); + menu->addSeparator(); } void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) @@ -3746,14 +3756,13 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); - menu->addMenu(modSendToContextMenu()); - menu->addSeparator(); + addModSendToContextMenu(menu); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); if(info->getColor().isValid()) menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { - menu->addMenu(modSendToContextMenu()); + addModSendToContextMenu(menu); } else { QMenu *addRemoveCategoriesMenu = new QMenu(tr("Change Categories")); populateMenuCategories(addRemoveCategoriesMenu, 0); @@ -3785,9 +3794,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addSeparator(); - menu->addMenu(modSendToContextMenu()); - - menu->addSeparator(); + addModSendToContextMenu(menu); menu->addAction(tr("Rename Mod..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Reinstall Mod"), this, SLOT(reinstallMod_clicked())); @@ -5021,7 +5028,7 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addSeparator(); - menu.addMenu(pluginSendToContextMenu()); + addPluginSendToContextMenu(&menu); QItemSelection currentSelection = ui->espList->selectionModel()->selection(); bool hasLocked = false; @@ -5037,8 +5044,6 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) } } - menu.addSeparator(); - if (hasLocked) { menu.addAction(tr("Unlock load order"), this, SLOT(unlockESPIndex())); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 85b3fc2d..06219a5a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -278,8 +278,8 @@ private: QString queryRestore(const QString &filePath); QMenu *modListContextMenu(); - QMenu *modSendToContextMenu(); - QMenu *pluginSendToContextMenu(); + void addModSendToContextMenu(QMenu *menu); + void addPluginSendToContextMenu(QMenu *menu); QMenu *openFolderMenu(); -- cgit v1.3.1 From d48392c89fa21b29e2bdc008c033ff3064ee49fc Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 4 Nov 2018 13:45:42 -0600 Subject: Don't change priority of new separators when not sorting by priority --- src/mainwindow.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 92127e0a..4294904e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2868,13 +2868,18 @@ void MainWindow::createSeparator_clicked() { return; } - int newPriority; - if (m_ContextRow >= 0) { + + int newPriority = -1; + if (m_ContextRow >= 0 && m_ModListSortProxy->sortColumn() == ModList::COL_PRIORITY) + { newPriority = m_OrganizerCore.currentProfile()->getModPriority(m_ContextRow); } + if (m_OrganizerCore.createMod(name) == nullptr) { return; } m_OrganizerCore.refreshModList(); - if (m_ContextRow >= 0 && newPriority >= 0) { + + if (newPriority >= 0) + { m_OrganizerCore.modList()->changeModPriority(ModInfo::getIndex(name), newPriority); } } -- cgit v1.3.1 From 5588b8b756ea224b1469049a338628787aff80c0 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 4 Nov 2018 13:47:39 -0600 Subject: Change "mods" to "plugins" in "send to priority..." option for plugins --- src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4294904e..f0aca1af 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4399,7 +4399,7 @@ void MainWindow::sendSelectedPluginsToPriority_clicked() { bool ok; int newPriority = QInputDialog::getInt(this, - tr("Set Priority"), tr("Set the priority of the selected mods"), + tr("Set Priority"), tr("Set the priority of the selected plugins"), 0, 0, INT_MAX, 1, &ok); if (!ok) return; -- cgit v1.3.1 From 9abb3ca1627ba535ecbacf3daa0d1bc468ed6db5 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Mon, 5 Nov 2018 21:43:50 -0600 Subject: Prevent user from clicking the run button more than once --- src/mainwindow.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f0aca1af..d0591d6e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1811,14 +1811,21 @@ void MainWindow::installMod(QString fileName) } void MainWindow::on_startButton_clicked() { - const Executable &selectedExecutable(getSelectedExecutable()); - QString customOverwrite = m_OrganizerCore.currentProfile()->setting("custom_overwrites", selectedExecutable.m_Title).toString(); - m_OrganizerCore.spawnBinary( - selectedExecutable.m_BinaryInfo, selectedExecutable.m_Arguments, - selectedExecutable.m_WorkingDirectory.length() != 0 - ? selectedExecutable.m_WorkingDirectory - : selectedExecutable.m_BinaryInfo.absolutePath(), - selectedExecutable.m_SteamAppID, customOverwrite); + ui->startButton->setEnabled(false); + try { + const Executable &selectedExecutable(getSelectedExecutable()); + QString customOverwrite = m_OrganizerCore.currentProfile()->setting("custom_overwrites", selectedExecutable.m_Title).toString(); + m_OrganizerCore.spawnBinary( + selectedExecutable.m_BinaryInfo, selectedExecutable.m_Arguments, + selectedExecutable.m_WorkingDirectory.length() != 0 + ? selectedExecutable.m_WorkingDirectory + : selectedExecutable.m_BinaryInfo.absolutePath(), + selectedExecutable.m_SteamAppID, customOverwrite); + } catch (...) { + ui->startButton->setEnabled(true); + throw; + } + ui->startButton->setEnabled(true); } static HRESULT CreateShortcut(LPCWSTR targetFileName, LPCWSTR arguments, -- cgit v1.3.1 From a85a6e635ecc287fc886ddc6fd896ac4c86d8a8f Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 6 Nov 2018 19:00:06 -0600 Subject: Update translation file --- src/organizer_en.ts | 709 +++++++++++++++++++++++++++------------------------- 1 file changed, 362 insertions(+), 347 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 14a103ad..5a3826b0 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1607,7 +1607,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1771,8 +1771,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1956,7 +1956,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1997,7 +1997,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2172,623 +2172,638 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - + + + Send to + + + + + + Top + + + + + + Bottom + + + + + + Priority... + + + + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - + Rename Separator... - + Remove Separator... - - - - Send to Top + + Set the priority of the selected mods - - - - Send to Bottom - - - - + Select Color... - + Reset Color - - + + Change Categories - - + + Primary Category - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2796,12 +2811,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2809,329 +2824,330 @@ 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? - + + + Set Priority + + + + + Set the priority of the selected plugins + + + + 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 - - Send to top - - - - - Send to bottom - - - - + 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 @@ -3880,258 +3896,258 @@ p, li { white-space: pre-wrap; } ModList - + Game Plugins (ESP/ESM/ESL) - + Interface - + Meshes - + Bethesda Archive - + Scripts (Papyrus) - + Script Extender Plugin - + SkyProc Patcher - + Sound or Music - + Textures - + MCM Configuration - + INI files - + ModGroup files - + This entry contains files that have been created inside the virtual data tree (i.e. by the construction kit) - + Backup - + Separator - + No valid game data - + Not endorsed yet - + Overwrites files - + Overwritten files - + Overwrites & Overwritten - + Redundant - + Alternate game source - + Non-MO - + invalid - + 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><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table> - + Time this mod was installed @@ -4527,135 +4543,135 @@ Continue? PluginList - + Name - + Priority - + Mod Index - + Flags - - + + unknown - + Name of your mods - + Load priority of your mod. The higher, the more "important" it is and thus overwrites data from plugins with lower priority. - + The modindex determines the formids of objects originating from this mods. - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 - - + + 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 @@ -5018,8 +5034,7 @@ p, li { white-space: pre-wrap; } QObject - - + Error @@ -5142,135 +5157,135 @@ p, li { white-space: pre-wrap; } - + Deleting folder - + I'm about to delete the following folder: "%1". Proceed? - + Choose Instance to Delete - + Be Carefull! Deleting an Instance will remove all your files for that Instance (mods, downloads, profiles, configuration, ...). Custom paths outside of the instance folder for downloads, mods, etc. will be left untoched. - + Are you sure? - + Are you really sure you want to delete the Instance "%1" with all its files? - + Failed to delete Instance - + Could not delete Instance "%1". If the folder was still in use, restart MO and try again. - + Enter a Name for the new Instance - + Enter a new name or select one from the suggested list: - - + + Canceled - + Invalid instance name - + The instance name "%1" is invalid. Use the name "%2" instead? - + The instance "%1" already exists. - + Please choose a different instance name, like: "%1 1" . - + Choose Instance - + Each Instance is a full set of MO data files (mods, downloads, profiles, configuration, ...). You can use multiple instances for different games. Instances are stored in Appdata and can be accessed by all MO installations. If your MO folder is writable, you can also store a single instance locally (called a Portable install, and all the MO data files will be inside the installation folder). - + New - + Create a new instance. - + Portable - + Use MO folder for data. - + Manage Instances - + Delete an Instance. - + failed to create %1 - + Data directory created - + New data directory created at %1. If you don't want to store a lot of data there, reconfigure the storage directories via settings. @@ -5403,7 +5418,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> @@ -5444,12 +5459,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 15bbfdfa6f352f228a2ba320472d3e21324ca158 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Thu, 8 Nov 2018 20:41:40 +0100 Subject: Added Nigh Eyes theme by ciathyza. --- src/stylesheets/Night Eyes.qss | 650 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 650 insertions(+) create mode 100644 src/stylesheets/Night Eyes.qss (limited to 'src') diff --git a/src/stylesheets/Night Eyes.qss b/src/stylesheets/Night Eyes.qss new file mode 100644 index 00000000..e9bb6c44 --- /dev/null +++ b/src/stylesheets/Night Eyes.qss @@ -0,0 +1,650 @@ +/* Night Eyes theme v1.0.1 for Mod Organizer 2 by Ciathyza */ +/* https://github.com/ciathyza/mo2-themes */ + +/* Main Window ---------------------------------------------------------------- */ + +QWidget +{ + background: #181818; + color: #AAAAAA; +} + +QWidget:disabled +{ + background: #181818; + color: #808080; +} + +QMainWindow::separator +{ + border: 0px; +} + +QAbstractItemView +{ + background: #141414; + alternate-background-color: #1A1A1A; + show-decoration-selected: 1; + selection-background-color: #251100; + selection-color: #AAAAAA; +} + +QAbstractItemView::item:hover +{ + background: #242424; + color: #FFCC88; +} + +QAbstractItemView::item:selected +{ + background: #251100; + color: #FFCC88; +} + +QAbstractScrollArea::corner +{ + background: #141414; + border: 2px solid #181818; + border-bottom-right-radius: 6px; + margin: 0px -2px -2px 0px; +} + + +/* Toolbar -------------------------------------------------------------------- */ + +QToolBar +{ + background: #181818; + border: 1px solid #181818; +} + +QToolBar::separator +{ + background: #181818; +} + +QToolButton +{ + padding: 4px 1px; + border-radius: 2px; + margin: 4px 1px 0px 1px; +} + +QToolButton:hover +{ + background: #282828; +} + +QToolButton:pressed +{ + background: #181818; +} + + +/* Left Pane & File Trees ----------------------------------------------------- */ + +QTreeView +{ + border-radius: 6px; +} + +QTreeView::branch:hover +{ + background: #242424; + color: #FFCC88; +} + +QTreeView::branch:selected +{ + background: #251100; + color: #FFCC88; +} + +QTreeView::item:selected +{ + background: #251100; + color: #FFCC88; +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings +{ + image: url(:/stylesheet/branch-closed.png); + border: 0px; +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings +{ + image: url(:/stylesheet/branch-open.png); + border: 0px; +} + +QListView +{ + border-radius: 6px; +} + +QListView::item:hover +{ + background: #242424; + color: #FFCC88; +} + +QListView::item:selected +{ + background: #251100; + color: #FFCC88; +} + +QTextEdit +{ + background: #141414; + border-radius: 6px; +} + +QWebView +{ + background: #141414; + border-radius: 6px; +} + + +/* Group Boxes ---------------------------------------------------------------- */ + +QGroupBox +{ + padding: 24px 4px; + border: 2px solid #141414; + border-radius: 10px; +} + +QGroupBox::title +{ + subcontrol-origin: padding; + subcontrol-position: top left; + padding: 8px; +} + + +/* Search Boxes --------------------------------------------------------------- */ + +QLineEdit +{ + background: #141414; + min-height: 14px; + padding: 2px; + border: 2px solid #141414; + border-radius: 6px; + margin-top: 3px; +} + +QLineEdit:hover +{ + border: 2px solid #242424; +} + + +/* Most Dropdowns ------------------------------------------------------------- */ + +QComboBox +{ + background: #141414; + min-height: 20px; + padding-left: 5px; + border: 2px solid #141414; + border-radius: 6px; + margin: 3px 0px 1px 0px; +} + +QComboBox:hover +{ + border: 2px solid #242424; +} + +QComboBox:on +{ + background: #181818; + color: #FFCC88; + border: 2px solid #181818; +} + +QComboBox::drop-down +{ + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; +} + +QComboBox QAbstractItemView +{ + border: 0px; +} + +QComboBox::down-arrow +{ + image: url(:/stylesheet/combobox-down.png); +} + + +/* Most Buttons --------------------------------------------------------------- */ + +QPushButton +{ + background: #141414; + color: #FFCC88; + min-height: 18px; + padding: 2px 12px; + border-radius: 6px; +} + +QPushButton:hover +{ + background: #242424; + color: #FFCC88; +} + +QPushButton:pressed +{ + background: #181818; + color: #FFCC88; +} + +QPushButton:checked +{ + background: #181818; + color: #FFCC88; + margin: 4px; +} + + +/* Scroll Bars ---------------------------------------------------------------- */ + +/* Horizontal */ + +QScrollBar:horizontal +{ + background: #141414; + height: 16px; + border: 2px solid #181818; + margin: 0px 23px -2px 23px; +} + +QScrollBar::handle:horizontal +{ + background: #222222; + min-width: 32px; + border-radius: 6px; + margin: 2px; +} + +QScrollBar::add-line:horizontal +{ + background: #141414; + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; + border: 2px solid #181818; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:horizontal +{ + background: #141414; + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; + border: 2px solid #181818; + border-bottom-left-radius: 6px; + margin: 0px 0px -2px -2px; +} + +/* Vertical */ + +QScrollBar:vertical +{ + background: #141414; + width: 16px; + border: 2px solid #181818; + margin: 23px -2px 23px 0px; +} + +QScrollBar::handle:vertical +{ + background: #222222; + min-height: 32px; + border-radius: 6px; + margin: 2px; +} + +QScrollBar::add-line:vertical +{ + background: #141414; + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; + border: 2px solid #181818; + border-bottom-right-radius: 6px; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:vertical +{ + background: #141414; + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; + border: 2px solid #181818; + border-top-right-radius: 6px; + margin: -2px -2px 0px 0px; +} + +/* Combined */ + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover, +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover +{ + background: #242424; +} + +QScrollBar::handle:horizontal:pressed, +QScrollBar::handle:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed +{ + background: #181818; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical +{ + background: transparent; +} + +QScrollBar::up-arrow:vertical, +QScrollBar::right-arrow:horizontal, +QScrollBar::down-arrow:vertical, +QScrollBar::left-arrow:horizontal +{ + height: 1px; + width: 1px; + border: 1px solid #181818; +} + + +/* Header Rows ---------------------------------------------------------------- */ + +QHeaderView +{ + background: #181818; +} + +QHeaderView::section +{ + background: #141414; + color: #D3D3D3; + height: 22px; + padding: 0px 5px; + border: 0px; + border-bottom: 2px solid #181818; + border-right: 2px solid #181818; +} + +QHeaderView::section:first +{ + border-top-left-radius: 6px; +} + +QHeaderView::section:last +{ + border-right: 0px; + border-top-right-radius: 6px; +} + +QHeaderView::section:hover +{ + background: #242424; + color: #FFCC88; +} + +QHeaderView::down-arrow +{ + padding-right: 4px; + height: 10px; + width: 10px; +} + + +/* Context Menus, Toolbar Dropdowns, & Tooltips ------------------------------- */ + +QMenu +{ + background: #141414; + selection-color: #FFCC88; + border: 0px; +} + +QMenu::item +{ + background: #141414; + selection-background-color: #242424; + padding: 4px 20px; +} + +QMenu::item:selected +{ + background: #242424; + color: #FFCC88; +} + +QMenu::item:disabled +{ + background: #242424; + color: #808080; +} + +QMenu::separator +{ + background: #181818; + height: 2px; +} + +QMenu::icon +{ + margin: 1px; +} + +QToolTip +{ + background: #181818; + color: #FFCC88; + padding: 1px; + border: 0px; +} + + +/* Progress Bars (Downloads) -------------------------------------------------- */ + +QProgressBar +{ + background: #141414; + text-align: center; + border: 0px; + border-radius: 6px; + margin: 0px 10px; +} + +QProgressBar::chunk +{ + background: #242424; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + + +/* Right Pane and Tab Bars ---------------------------------------------------- */ + +QTabWidget::pane +{ + top: 1px; + padding: 2px 2px 10px 2px; + border: 2px solid #141414; + border-radius: 10px; +} + +QTabWidget::tab-bar +{ + alignment: center; +} + +QTabBar::tab +{ + background: #141414; + color: #141414; + padding: 4px 1em; + border: 1px solid #181818; + border-top: 0px; + border-bottom: 0px; +} + +QTabBar::tab:!selected +{ + background: #141414; + color: #D3D3D3; +} + +QTabBar::tab:disabled +{ + background: #181818; + color: #808080; +} + +QTabBar::tab:selected +{ + background: #181818; + color: #FFCC88; + +} + +QTabBar::tab:!selected:hover +{ + background: #242424; + color: #FFCC88; +} + +QTabBar::tab:first +{ + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; +} + +QTabBar::tab:last +{ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} + +QTabBar QToolButton +{ + background: #242424; + padding: 1px; + border-radius: 6px; + margin: 1px; +} + +QTabBar QToolButton:disabled +{ + background: transparent; +} + + +/* Sliders (Configurator) ----------------------------------------------------- */ + +/* QSlider::groove:horizontal +{ + background: #FFCC88; + height: 1px; + border: 1px solid #FFCC88; +} + +QSlider::handle:horizontal +{ + background: #242424; + width: 10px; + border: 2px solid #242424; + border-radius: 6px; + margin: -10px 0px; +} + +QSlider::handle:horizontal:hover +{ + background: #181818; + border: 2px solid #181818; +} */ + + +/* Tables (Configure Mod Categories) ------------------------------------------ */ + +QTableView +{ + gridline-color: #181818; + border: 0px; +} + +QListWidget::item#executablesListBox +{ + /* fixes the black text problem on the Modify Executables window */ + color: #D3D3D3; +} + + +/* Downloads tab -------------------------------------------------------------- */ + +QWidget#downloadTab QAbstractScrollArea +{ + /* background of the entire downloads tab */ + background: #242424; +} + +DownloadListWidget QFrame, +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel +{ + /* an entry on the Downloads tab */ + background: #141414; +} + +DownloadListWidget QFrame#frame +{ + /* outer box of an entry on the Downloads tab */ + border: 2px solid #141414; +} + +DownloadListWidget QLabel#installLabel +{ + color: none; +} + +DownloadListWidget QFrame:clicked +{ + background: #242424; +} + +/* compact downloads view */ + +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel +{ + /* an entry on the Downloads tab */ + background: #141414; + padding: 4px; +} -- cgit v1.3.1 From bde2e5fca14b5fe705db53cab18209112491b4fc Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 9 Nov 2018 17:15:04 +0100 Subject: Improved Skyrim.qss theme performance. --- src/stylesheets/skyrim.qss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/stylesheets/skyrim.qss b/src/stylesheets/skyrim.qss index 85a5b79c..4091bbe0 100644 --- a/src/stylesheets/skyrim.qss +++ b/src/stylesheets/skyrim.qss @@ -12,7 +12,7 @@ QWidget { color: #F1F1F1; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings +/* FIX: For some reason applying background-color or border fixes paddings properties */ QListWidget::item { border-width: 0; } @@ -567,7 +567,9 @@ QTabWidget::pane { top: 0; border-width: 5px; border-color: transparent; - border-image: url(./skyrim/border-image2.png) 5 repeat repeat; } + /*AL12: Changed the "5 repeat repeat" to "4 repeat repeat" as 5 seems to kill + performance for some reason.*/ + border-image: url(./skyrim/border-image2.png) 4 repeat repeat; } QTabBar { text-transform: uppercase; -- cgit v1.3.1 From 71830a65d49587d012b00e0cea39e270011e2ce7 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 9 Nov 2018 21:50:46 +0100 Subject: Added three new Transparent Styles by Gernash: Transparent Style 101 Green Transparent Style BOS Transparent Style Skyrim --- src/stylesheets/Transparent-Style-101-Green.qss | 1 + src/stylesheets/Transparent-Style-BOS.qss | 1 + src/stylesheets/Transparent-Style-Skyrim.qss | 1 + .../Transparent-Style/Background-skyrim.png | Bin 0 -> 265249 bytes src/stylesheets/Transparent-Style/Fallout-BOS.png | Bin 0 -> 283190 bytes .../Transparent-Style/Green/Vault-101-item-end.png | Bin 0 -> 214 bytes .../Transparent-Style/Green/Vault-101-item-line-v.png | Bin 0 -> 210 bytes .../Green/Vault-101-itemB-close-last.png | Bin 0 -> 294 bytes .../Transparent-Style/Green/Vault-101-itemB-end.png | Bin 0 -> 232 bytes .../Transparent-Style/Green/Vault-101-itemB-line.png | Bin 0 -> 225 bytes .../Green/Vault-101-itemB-open-last.png | Bin 0 -> 321 bytes .../Transparent-Style/Green/Vault-101-itemb-close.png | Bin 0 -> 366 bytes .../Transparent-Style/Green/Vault-101-itemb-open.png | Bin 0 -> 280 bytes .../Transparent-Style/Green/Vault-101-vault-boy.png | Bin 0 -> 3240 bytes src/stylesheets/Transparent-Style/Green/arrow-down.png | Bin 0 -> 199 bytes src/stylesheets/Transparent-Style/Green/arrow-left.png | Bin 0 -> 174 bytes .../Transparent-Style/Green/arrow-right.png | Bin 0 -> 174 bytes src/stylesheets/Transparent-Style/Green/arrow-up.png | Bin 0 -> 184 bytes .../Transparent-Style/Green/border-image.png | Bin 0 -> 754 bytes .../Green/checkbox-checked-disabled.png | Bin 0 -> 61259 bytes .../Transparent-Style/Green/checkbox-checked-hover.png | Bin 0 -> 22306 bytes .../Green/checkbox-checked-hover1.png | Bin 0 -> 71663 bytes .../Green/checkbox-checked-hover2.png | Bin 0 -> 28967 bytes .../Transparent-Style/Green/checkbox-checked.png | Bin 0 -> 63130 bytes .../Transparent-Style/Green/checkbox-hover.png | Bin 0 -> 47849 bytes src/stylesheets/Transparent-Style/Green/checkbox.png | Bin 0 -> 26783 bytes .../Transparent-Style/Green/context-menu-separator.png | Bin 0 -> 150 bytes .../Transparent-Style/Green/radio-checked.png | Bin 0 -> 278 bytes .../Transparent-Style/Green/radio-hover.png | Bin 0 -> 336 bytes src/stylesheets/Transparent-Style/Green/radio.png | Bin 0 -> 282 bytes src/stylesheets/Transparent-Style/Green/vault-101.png | Bin 0 -> 646531 bytes .../Transparent-Style/Green/vault-tec-executables.png | Bin 0 -> 375596 bytes .../Transparent-Style/Green/vault-tec-full.png | Bin 0 -> 191087 bytes .../Transparent-Style/Green/vault-tec-overwrite.png | Bin 0 -> 504030 bytes .../Transparent-Style/Green/vault-tec-profiles.png | Bin 0 -> 427530 bytes .../Transparent-Style/Green/vault-tec-settings.png | Bin 0 -> 309952 bytes .../Transparent-Style/Green/vault-tec-small.png | Bin 0 -> 9975 bytes src/stylesheets/Transparent-Style/Green/vault-tec.png | Bin 0 -> 329351 bytes .../Transparent-Style/Vault-101-item-end.png | Bin 0 -> 106 bytes .../Transparent-Style/Vault-101-item-line-v.png | Bin 0 -> 102 bytes .../Transparent-Style/Vault-101-itemB-close-last.png | Bin 0 -> 658 bytes .../Transparent-Style/Vault-101-itemB-end.png | Bin 0 -> 107 bytes .../Transparent-Style/Vault-101-itemB-line.png | Bin 0 -> 107 bytes .../Transparent-Style/Vault-101-itemB-open-last.png | Bin 0 -> 618 bytes .../Vault-101-itemb-close - Copy (2).png | Bin 0 -> 8904 bytes .../Vault-101-itemb-close - Copy (3).png | Bin 0 -> 592 bytes .../Transparent-Style/Vault-101-itemb-close.png | Bin 0 -> 661 bytes .../Transparent-Style/Vault-101-itemb-open.png | Bin 0 -> 593 bytes src/stylesheets/Transparent-Style/Vault-BOS-Main.png | Bin 0 -> 180153 bytes src/stylesheets/Transparent-Style/arrow-down-hover.png | Bin 0 -> 323 bytes src/stylesheets/Transparent-Style/arrow-down-small.png | Bin 0 -> 184 bytes src/stylesheets/Transparent-Style/arrow-down.png | Bin 0 -> 307 bytes src/stylesheets/Transparent-Style/arrow-left-hover.png | Bin 0 -> 332 bytes src/stylesheets/Transparent-Style/arrow-left.png | Bin 0 -> 299 bytes .../Transparent-Style/arrow-right-hover.png | Bin 0 -> 327 bytes .../Transparent-Style/arrow-right-small.png | Bin 0 -> 118 bytes src/stylesheets/Transparent-Style/arrow-right.png | Bin 0 -> 298 bytes src/stylesheets/Transparent-Style/arrow-up-hover.png | Bin 0 -> 317 bytes src/stylesheets/Transparent-Style/arrow-up.png | Bin 0 -> 300 bytes src/stylesheets/Transparent-Style/carbonfiber.png | Bin 0 -> 4899 bytes .../Transparent-Style/checkbox-checked-disabled.png | Bin 0 -> 8761 bytes .../Transparent-Style/checkbox-checked-hover.png | Bin 0 -> 10676 bytes src/stylesheets/Transparent-Style/checkbox-checked.png | Bin 0 -> 10414 bytes src/stylesheets/Transparent-Style/checkbox-hover.png | Bin 0 -> 10863 bytes src/stylesheets/Transparent-Style/checkbox.png | Bin 0 -> 9609 bytes .../Transparent-Style/narrow-arrow-down.png | Bin 0 -> 157 bytes .../Transparent-Style/narrow-arrow-left.png | Bin 0 -> 230 bytes .../Transparent-Style/narrow-arrow-right.png | Bin 0 -> 232 bytes src/stylesheets/Transparent-Style/narrow-arrow-up.png | Bin 0 -> 156 bytes .../Transparent-Style/radio-BOS-checked.png | Bin 0 -> 10414 bytes src/stylesheets/Transparent-Style/radio-BOS-hover.png | Bin 0 -> 10547 bytes src/stylesheets/Transparent-Style/radio-BOS.png | Bin 0 -> 10676 bytes 72 files changed, 3 insertions(+) create mode 100644 src/stylesheets/Transparent-Style-101-Green.qss create mode 100644 src/stylesheets/Transparent-Style-BOS.qss create mode 100644 src/stylesheets/Transparent-Style-Skyrim.qss create mode 100644 src/stylesheets/Transparent-Style/Background-skyrim.png create mode 100644 src/stylesheets/Transparent-Style/Fallout-BOS.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-item-end.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-item-line-v.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-itemB-close-last.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-itemB-end.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-itemB-line.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-itemB-open-last.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-itemb-close.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-itemb-open.png create mode 100644 src/stylesheets/Transparent-Style/Green/Vault-101-vault-boy.png create mode 100644 src/stylesheets/Transparent-Style/Green/arrow-down.png create mode 100644 src/stylesheets/Transparent-Style/Green/arrow-left.png create mode 100644 src/stylesheets/Transparent-Style/Green/arrow-right.png create mode 100644 src/stylesheets/Transparent-Style/Green/arrow-up.png create mode 100644 src/stylesheets/Transparent-Style/Green/border-image.png create mode 100644 src/stylesheets/Transparent-Style/Green/checkbox-checked-disabled.png create mode 100644 src/stylesheets/Transparent-Style/Green/checkbox-checked-hover.png create mode 100644 src/stylesheets/Transparent-Style/Green/checkbox-checked-hover1.png create mode 100644 src/stylesheets/Transparent-Style/Green/checkbox-checked-hover2.png create mode 100644 src/stylesheets/Transparent-Style/Green/checkbox-checked.png create mode 100644 src/stylesheets/Transparent-Style/Green/checkbox-hover.png create mode 100644 src/stylesheets/Transparent-Style/Green/checkbox.png create mode 100644 src/stylesheets/Transparent-Style/Green/context-menu-separator.png create mode 100644 src/stylesheets/Transparent-Style/Green/radio-checked.png create mode 100644 src/stylesheets/Transparent-Style/Green/radio-hover.png create mode 100644 src/stylesheets/Transparent-Style/Green/radio.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-101.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-tec-executables.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-tec-full.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-tec-overwrite.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-tec-profiles.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-tec-settings.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-tec-small.png create mode 100644 src/stylesheets/Transparent-Style/Green/vault-tec.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-item-end.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-item-line-v.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemB-close-last.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemB-end.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemB-line.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemB-open-last.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (2).png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (3).png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemb-close.png create mode 100644 src/stylesheets/Transparent-Style/Vault-101-itemb-open.png create mode 100644 src/stylesheets/Transparent-Style/Vault-BOS-Main.png create mode 100644 src/stylesheets/Transparent-Style/arrow-down-hover.png create mode 100644 src/stylesheets/Transparent-Style/arrow-down-small.png create mode 100644 src/stylesheets/Transparent-Style/arrow-down.png create mode 100644 src/stylesheets/Transparent-Style/arrow-left-hover.png create mode 100644 src/stylesheets/Transparent-Style/arrow-left.png create mode 100644 src/stylesheets/Transparent-Style/arrow-right-hover.png create mode 100644 src/stylesheets/Transparent-Style/arrow-right-small.png create mode 100644 src/stylesheets/Transparent-Style/arrow-right.png create mode 100644 src/stylesheets/Transparent-Style/arrow-up-hover.png create mode 100644 src/stylesheets/Transparent-Style/arrow-up.png create mode 100644 src/stylesheets/Transparent-Style/carbonfiber.png create mode 100644 src/stylesheets/Transparent-Style/checkbox-checked-disabled.png create mode 100644 src/stylesheets/Transparent-Style/checkbox-checked-hover.png create mode 100644 src/stylesheets/Transparent-Style/checkbox-checked.png create mode 100644 src/stylesheets/Transparent-Style/checkbox-hover.png create mode 100644 src/stylesheets/Transparent-Style/checkbox.png create mode 100644 src/stylesheets/Transparent-Style/narrow-arrow-down.png create mode 100644 src/stylesheets/Transparent-Style/narrow-arrow-left.png create mode 100644 src/stylesheets/Transparent-Style/narrow-arrow-right.png create mode 100644 src/stylesheets/Transparent-Style/narrow-arrow-up.png create mode 100644 src/stylesheets/Transparent-Style/radio-BOS-checked.png create mode 100644 src/stylesheets/Transparent-Style/radio-BOS-hover.png create mode 100644 src/stylesheets/Transparent-Style/radio-BOS.png (limited to 'src') diff --git a/src/stylesheets/Transparent-Style-101-Green.qss b/src/stylesheets/Transparent-Style-101-Green.qss new file mode 100644 index 00000000..f7bf16b6 --- /dev/null +++ b/src/stylesheets/Transparent-Style-101-Green.qss @@ -0,0 +1 @@ +#centralWidget { border-image: url(./Transparent-Style/Green/vault-101.png) 0 0 0 0 stretch stretch; } QDialog,Qmenu { border: none; } QWidget { color: #fff; background-color: rgb(0, 204, 0, 5); alternate-background-color: rgb(0, 204, 0, 10); } QAbstractItemView { color: #fff; background-color: rgb(0, 204, 0, 5); alternate-background-color: rgb(0, 204, 0, 10); border: 1px solid #001a00; border-style:outset; border-radius: 3px; selection-color: #001a00; outline: none; } #ProblemsDialog,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog, #ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { border-image:url(./Transparent-Style/Green/vault-tec-full.png) 0 0 0 0 stretch stretch; } #EditExecutablesDialog { border-image: url(./Transparent-Style/Green/vault-tec.png) 0 0 0 0 stretch stretch; } #SimpleInstallDialog,#LockedDialog,QMenu { border-image: url(./Transparent-Style/Green/vault-tec-small.png) 0 0 0 0 stretch stretch; } #nameLabel { background-color: rgb(0, 0, 0, 20); border-top:1px solid black; border-bottom:1px solid black; } #ProfilesDialog,#FomodInstallerDialog { border-image: url(./Transparent-Style/Green/vault-tec-profiles.png) 0 0 0 0 stretch stretch; } #filesView { border-image: url(./Transparent-Style/Green/vault-tec-overwrite.png) 0 0 0 0 stretch stretch; } /* ******************************************** */ /* Main Navigation Button Bar at top of window */ /* ******************************************** */ QToolBar { border: none; } QToolBar::separator { image: url(./Transparent-Style/Green/Vault-101-vault-boy.png); } QToolButton { border:2px ridge None; border-radius: 6px; margin: 3px; padding-left: 8px; padding-right: 8px; padding-top: 0px; padding-bottom: 2px; } QToolButton:hover { border: 2px ridge #fff; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); } QToolButton:pressed { background: black; } QTabWidget::pane { background-color: transparent; border:transparent; } QTabWidget::tab-bar { alignment: center; } /* **************************************** */ /* Tabs on top of Treeview */ /* **************************************** */ QTabBar { text-transform: uppercase; max-height: 22px; padding-bottom: 5px; } QTabBar::tab { border: none; border-bottom-style: none; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); padding-left: 15px; padding-right: 15px; padding-top: 3px; padding-bottom: 3px; margin-right: 2px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } QTabBar::tab:selected { color: #fff; background-color: #00cc00; } QTabBar::tab:!selected { color: #00cc00; margin-top: 0px; } QTabBar::tab:disabled { color: #bbbbbb; border-bottom-style: none; margin-top: 0px; background-color: #000; } #deactivateESP,#activateESP { border:px #00cc00; background:QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); } QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open { border:2px ridge #00cc00; image: url(./Transparent-Style/Green/arrow-right.png); } QTabBar QToolButton { border:2px ridge #00cc00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); padding: 1px; margin: 0; } QTabBar QToolButton::right-arrow { image: url(./Transparent-Style/Green/arrow-right.png); } QTabBar QToolButton::left-arrow { image: url(./Transparent-Style/Green/arrow-left.png); } /* **************************************** */ /* Column names of TreeView */ /* **************************************** */ QTableView { color:#fff; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); } QHeaderView::section { color: #00cc00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); border-radius: 6px; padding: 4px; padding-left: 5px; padding-right: 0px; } QHeaderView::section:hover { background: #121212; border: 2px solid #ff0000; padding: 0px; } QHeaderView::up-arrow,QHeaderView::down-arrow { subcontrol-origin: content; subcontrol-position: center right; width: 7px; height: 7px; margin-right: 7px; } QHeaderView::up-arrow { image: url(./Transparent-Style/Green/arrow-up.png); } QHeaderView::down-arrow { image: url(./Transparent-Style/Green/arrow-down.png); } /* **************************************** */ /* Hover */ /* **************************************** */ QMenu:item:hover,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover { color:#fff; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:#000; } QAbstractItemView::item:hover { border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:#000; padding: 3px; } #deactivateESP:hover,#activateESP:hover,QPushButton:hover,QTableView:hover,QHeaderView::selected:hover,QTabBar::tab:!selected:hover,QComboBox:hover { border: 1px solid #ff0000; padding: 1px; text-align: center; } /* **************************************** */ /* Context menus, toolbar dropdowns #QMenu */ /* **************************************** */ QMenu { border-width: 3px; border-style: solid; } QMenu::item { padding: 6px 20px; } QMenu::item:selected { color:#fff; background-color: #001a00; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; } QMenu::right-arrow { image: url(./Transparent-Style/Green/arrow-right.png); subcontrol-origin: padding; subcontrol-position: center right; padding-right: 0.5em; } /* ********************* */ /* LCD Counter */ /* ********************* */ QLCDNumber { Background:#000; border-color: #00cc00; border-style: solid; border-width: 1px; border-radius: 5px; } /* **************************************** */ /* Launch application Drop down Box */ /* **************************************** */ QComboBox { background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); border:1px outset #00cc00; height: 20px; width: 15px; padding: 3px; padding-left:3px; border-radius: 5px; } QComboBox::drop-down{ subcontrol-origin: padding; subcontrol-position: top right; width: 15px; padding:4px; border-radius: 5px; } QComboBox::down-arrow{ image:url(./Transparent-Style/Green/arrow-down.png); } QComboBox::item{ border:3px;padding: 3px; } /* **************************************************************** */ /* Action Buttons */ /* */ /* Open list, Rextore Backup, Create Backup, RUN, Shortcut Button */ /* Sort, Load order backup, Load Order Restore */ /* **************************************************************** */ QPushButton { color: #00cc00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); border-width: 1px; border-color: 1px outset #00cc00; border-style: solid; border-radius: 4px; padding:5px; padding-right: 10px; padding-left: 5px; } QDialog QPushButton { min-width: 3em; min-height: 1em; padding-left: 1em; padding-right: 1em; } QPushButton::menu-indicator { image: url(./Transparent-Style/Green/arrow-down.png); background: transparent; subcontrol-origin: padding; subcontrol-position: center right; padding-right: 5%; } QPushButton:open { background-color: rgb(0, 204, 0, 100); } QPushButton:!enabled { border: 1px grey; color: grey; background: black; } QPushButton#displayCategoriesBtn { min-width: 20px; } /* **************************************** */ /* Scroll bar */ /* **************************************** */ QScrollBar { height:20px; width:20px; background-color:transparent; } QScrollBar::handle { border: 1px solid #aaa; border-radius: 4px; } QScrollBar::handle:vertical { margin: 1px 4px; min-height:20px; min-width: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #33ff33, stop:1 #000000); } QScrollBar::handle:vertical:hover { background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #33ff33); } QScrollBar::handle:horizontal { min-height:10px;min-width:20px;margin:4px 1px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #33ff33, stop:1 #000000); } QScrollBar::handle:horizontal:hover { background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #33ff33); } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background-color: transparent; } QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal { height:0; width:0; } /* ******************************************************** */ /* Main Tree View Inherated from QAbstractItemView */ /* ******************************************************** */ QTreeView { } QTreeView:item { padding:4px; } QTreeView:item:selected { color: #001a00; border: none;outline: none; border-radius: 5px; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color: rgb(0, 204, 0, 100); } QTreeView::branch:has-siblings:!adjoins-item { background:url(Vault-101/Vault-101-item-line-v.png) center center no-repeat; } QTreeView::branch:has-siblings { background:url(Vault-101/Vault-101-itemB-line.png) center center no-repeat; } QTreeView::branch:!has-children:!has-siblings:adjoins-item { background:url(Vault-101/Vault-101-itemB-end.png) center center no-repeat; } QTreeView::branch:closed:has-children:has-siblings { background:url(Vault-101/Vault-101-itemB-close.png) center center no-repeat; } QTreeView::branch:closed:has-children:!has-siblings { background:url(Vault-101/Vault-101-itemB-close-last.png) center center no-repeat; } QTreeView::branch:open:has-children:has-siblings { background:url(Vault-101/Vault-101-itemB-open.png) center center no-repeat; } QTreeView::branch:open:has-children:!has-siblings { background:url(Vault-101/Vault-101-itemB-open-last.png) center center no-repeat; } /* **************************************************************** */ /* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ /* common */ /* **************************************************************** */ QGroupBox::indicator,QTreeView::indicator,QCheckBox::indicator { outline: none; border: none; width: 20px; height: 20px; } QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate { image: url(./Transparent-Style/Green/checkbox-checked.png); } QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover { image: url(./Transparent-Style/Green/checkbox-hover.png); } QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled { image: url(./Transparent-Style/Green/checkbox-checked-disabled.png); } QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked { image: url(./Transparent-Style/Green/checkbox.png); } QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover { image: url(./Transparent-Style/Green/checkbox-checked-hover.png); } QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled { image: url(./Transparent-Style/Green/checkbox-checked-disabled.png); } QTreeWidget#categoriesList::item:has-children { background-image: url(./Transparent-Style/Green/arrow-right.png); } QTreeWidget#categoriesList::item:has-children:open { background-image: url(./Transparent-Style/Green/branch-opened.png); } /* ******************************** */ /* Special styles */ /* increase categories tab width */ /* ******************************** */ QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item { padding: .3em 0; } QTreeWidget#categoriesGroup,QTreeWidget#categoriesList { min-width: 200px; } QTreeWidget#categoriesList::item { background-position: center left; background-repeat: no-repeat; padding: 0.35em 4px; } /* ********************* */ /* Display Radio Button */ /* ********************* */ QRadioButton::indicator { width: 16px; height: 16px; } QRadioButton::indicator::checked { image: url(./Transparent-Style/Green/radio-checked.png); } QRadioButton::indicator::unchecked { image: url(./Transparent-Style/Green/radio.png); } QRadioButton::indicator::unchecked:hover { image: url(./Transparent-Style/Green/radio-hover.png); } /* **************************************** */ /* Spinners #QSpinBox, #QDoubleSpinBox */ /* **************************************** */ QAbstractSpinBox { min-height: 24px; } QAbstractSpinBox::up-button,QAbstractSpinBox::down-button { border-style: solid; border-width: 1px; subcontrol-origin: padding; } QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover { background-color: #141414; } QAbstractSpinBox::up-button { subcontrol-position: top right; } QAbstractSpinBox::down-button { subcontrol-position: bottom right; } QAbstractSpinBox::up-arrow { image: url(./Transparent-Style/Green/arrow-up.png); } QAbstractSpinBox::down-arrow { image: url(./Transparent-Style/Green/arrow-down.png); } /* **************************************** */ /* Tooltips #QToolTip, #SaveGameInfoWidget */ /* **************************************** */ QToolTip { background-color:transparent; color:#C0C0C0; padding:0px; border-width:7px; border-style:solid; border-color:transparent; border-image:url(./Transparent-Style/Green/border-image.png) 27 repeat repeat; } SaveGameInfoWidget { background-color:#121212; color:#C0C0C0; } /* **************************** */ /* Handles Web, Nexus info tab */ /* **************************** */ QWebView { background-color: Black; } QLineEdit { font-family: Source Sans Pro; background:#000; border-width: 1px; border-radius:5px; margin: 0px; padding-left:2px; selection-background-color: rgb(0, 204, 0, 10); } /* Font size */ QLabel, QMenu, QPushButton, QTabBar, QTextEdit, QLineEdit, QWebView, QComboBox, QComboBox:editable, QAbstractSpinBox, QGroupBox, QCheckBox, QRadioButton { color: #cccccc; font-family: Source Sans Pro; font-size: 14px; } QAbstractItemView { color: #cccccc; font-family: Source Sans Pro; font-size: 14px; } \ No newline at end of file diff --git a/src/stylesheets/Transparent-Style-BOS.qss b/src/stylesheets/Transparent-Style-BOS.qss new file mode 100644 index 00000000..cda40e9f --- /dev/null +++ b/src/stylesheets/Transparent-Style-BOS.qss @@ -0,0 +1 @@ +#centralWidget { border-image: url(./Transparent-Style/Fallout-BOS.png) 0 0 0 0 stretch stretch; } QWidget#TextViewer{ } QWidget{ color: #fff; background-color: rgba(45,45,48,30); alternate-background-color: rgba(38,38,38,30); } QWidget:disabled{ } QAbstractItemView{ color: #dcdcdc; background-color: rgb(45,45,48,30); alternate-background-color: rgb(38,38,38,50); border: 1px solid #3F3F46; /* Grey - Blue*/ border-style:outset; border-radius: 3px; selection-color: #3F3F46; /* Grey - Blue*/ outline: none; padding-left:0; } #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #toolBarArea{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #EditExecutablesDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #SimpleInstallDialog,#LockedDialog,QMenu{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #nameLabel{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); color:#fff; } #ProfilesDialog,#FomodInstallerDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #filesView{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } /* ******************************************** */ /* Main Navigation Button Bar at top of window */ /* ******************************************** */ QToolBar{ /*border: none;*/ } QToolBar::separator{ /*image: url(./Transparent-Style/Vault-101-vault-logo.png);*/ } QToolButton{ border:2px solid None; border-radius: 6px; margin: 3px; padding-left: 8px; padding-right: 8px; padding-top: 0px; padding-bottom: 2px; } QToolButton:hover{ border-radius: 3px; border: 0px; padding: 0px; background: trANSPARENT; border: 0px ridge #9A9A00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53); } QToolButton:pressed{ background: black; } /* **************************************** */ /* Tabs on top of Treeview */ /* **************************************** */ QTabWidget::pane{ border-color:#3F3F46; /* Grey - Blue*/ /* border-top-color:#9A9A00; */ top: 0px; border-style:hidden; border-width:1px; } QTabWidget::tab-bar{ alignment: center; } QTabBar{ color: #cccccc; font-family: Segoe UI; font-size: 16px; text-transform: none; min-height:auto; padding-bottom: 5px; } QTabBar::tab{ border: none; border-bottom-style: none; background-color: rgba(154,154,0,0.3); padding-left: 9px; padding-right: 9px; padding-top: 3px; padding-bottom: 3px; margin-right: 2px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } QTabBar::tab:disabled{ color: #404040; background-color: #000; margin-top: 0px; } QTabBar::tab:selected{ color: #dcdcdc; background-color: #9A9A00; /*Yellow opaque*/ } QTabBar::tab:!selected:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; padding: 1px; text-align: center; background-color: #9A9A00; color:#fff; Height: 20%; } /* QTabBar::tab:!selected{ color: #808080; background-color: #404040; margin-top: 0px; } */ #deactivateESP,#activateESP{ border:#b30000; background:#333337; } /* **************************************** */ /* on top of Treeview */ /* **************************************** */ QTabBar QToolButton{ border-radius: 0px; border: 0px; padding: 0px; background: transparent; } QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{ image: url(./Transparent-Style/arrow-up.png); } QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{ image: url(./Transparent-Style/arrow-down.png); } QTabBar QToolButton::right-arrow{ image: url(./Transparent-Style/narrow-arrow-right.png); } QTabBar QToolButton::left-arrow{ image: url(./Transparent-Style/narrow-arrow-left.png); } /* **************************************** */ /* Column names of TreeView */ /* **************************************** */ QTableView{ gridline-color:#3F3F46; selection-background-color:#9A9A00; selection-color:#F1F1F1; /* White */ text-align: center; min-height:24px; } QHeaderView{ min-height:24px; /*Top Bar on menus*/ padding: 3px; } QHeaderView::section{ /* color: #cc3333; */ background-color: #252526; border-radius: 0px; padding: 0px; padding-left: 5px; } QHeaderView::section:hover{ background: rgba(154,154,0,0.3); border: 1px solid #9a9a00; padding: 0px; padding-left: 5px; } QHeaderView::up-arrow,QHeaderView::down-arrow{ min-height:Auto; min-width:Auto; } QHeaderView::up-arrow{ image: url(./Transparent-Style/arrow-up.png); min-height:25px; min-width:15px; padding-right: 0px; }QHeaderView::down-arrow{ image: url(./Transparent-Style/arrow-down.png); } /* **************************************** */ /* Hover */ /* **************************************** */ QMenu:item:hover,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{ color:#fff; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); } QAbstractItemView::item:hover{ border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); padding: 3px; } /*#DownloadListWidget{ }*/ #DownloadListWidget{ outline: 1px solid #e8e8e8; border: 0px solid #9a9a00; } #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{ border: 1px solid #9a9a00; padding: 1px; text-align: center; color:#fff; } /* **************************************** */ /* Context menus, toolbar dropdowns #QMenu */ /* **************************************** */ QMenu{ border-width: 3px; border-style: solid; }QMenu::item{ padding: 6px 20px; }QMenu::item:selected{ color:#fff; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QMenu::right-arrow{ image: url(./Transparent-Style/arrow-right.png); /* right click main menu top option*/ subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:0px outset #3F3F46; /* Grey - Blue*/ } /* ********************* */ /* LCD Counter */ /* ********************* */ QLCDNumber{ color: #9A9A00; Background: #000; border-color: #3F3F46; /* Grey - Blue*/ border-style: solid; border-width: 1px; border-radius: 5px; } /* **************************************** */ /* Launch application Drop down Box */ /* **************************************** */ QComboBox{ background-color: #333337; padding: 3px 5px 5px 5px; height: 26px; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QComboBox:on{ padding: 3px 5px 5px 5px; color: white; background-color: #3F3F46; /* Grey - Blue*/ } QComboBox:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; /* padding: 0px; */ } QComboBox::drop-down{ /* Down arrow in combo box */ outline: none; border: none; border-width: 1px; } QComboBox::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px outset #3F3F46; /* Grey - Blue*/ } /* ************************* */ /* QComboBox::down-arrow:on, */ /* ************************* */ QComboBox::down-arrow:hover,QComboBox::down-arrow:focus { image: url(./Transparent-Style/arrow-down-hover.png); } QComboBox::up-arrow:hover,QComboBox::up-arrow:focus { image: url(./Transparent-Style/arrow-up-hover.png); } QComboBox::down-arrow{ image:url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; } QComboBox::down-arrow:on{ image:url(./Transparent-Style/arrow-up.png); } QComboBox:editable { background: black; /* color: pink; */ } QComboBox::item{ } QComboBox QAbstractItemView{ selection-color:#fff; outline: 1px solid #9a9a00; selection-background-color:#3F3F46; /* Grey - Blue*/ border-top:1px solid #9a9a00; border-bottom:1px solid #9a9a00; padding: 5px; } /* **************************************************************** */ /* Action Buttons */ /* */ /* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */ /* Sort, Load order backup, Load Order Restore */ /* **************************************************************** */ QPushButton{ background-color: #333337; min-height:26px; padding:1px 5%; text-align: center; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QPushButton::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px hidden #3F3F46; /* Grey - Blue*/ } QPushButton::menu-indicator:Hover{ image: url(./Transparent-Style/arrow-down-hover.png); } QPushButton:focus{ } QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{ background: #3F3F46; /* Grey - Blue*/ border-radius: 1px; border: 1px solid #9a9a00; } QPushButton:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; } QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{ color:#fff; border-color:#707070; border-style:solid; border-width:1px; } QPushButton:disabled{ } QPushButton:open{ } QPushButton:!enabled{ } /* **************************************** */ /* Filter Button */ /* **************************************** */ QPushButton#displayCategoriesBtn{ min-width: 20px; background:transparent; color: transparent; border: 1px hidden #9a9a00; } QPushButton#displayCategoriesBtn:checked{ image: url(./Transparent-Style/arrow-left.png); } QPushButton#displayCategoriesBtn:!checked{ image: url(./Transparent-Style/arrow-right.png); } QPushButton#displayCategoriesBtn:checked:hover{ image: url(./Transparent-Style/arrow-left-hover.png); } QPushButton#displayCategoriesBtn:!checked:hover{ image: url(./Transparent-Style/arrow-right-hover.png); } /* **************************************** */ /* Scroll bar */ /* **************************************** */ QScrollBar{ height:20px; width:20px; background-color:transparent; } QScrollBar::handle{ border: 1px solid #aaa; border-radius: 4px; } QScrollBar::handle:vertical{ margin: 1px 4px; min-height:20px; min-width: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:vertical:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::handle:horizontal{ min-height:10px;min-width:20px;margin:4px 1px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:horizontal:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{ background-color: transparent; } QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{ height:0; width:0; } /* ******************************************************** */ /* Main Tree View Inherited from QAbstractItemView */ /* ******************************************************** */ QTreeView { } QTreeView:item{ padding: 3px; font-size: 16px; height: 18px; /*Bottom text Box*/ } QTreeView:item:selected{ color:#fff; padding: 0px; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QTreeView:item QLineEdit{ outline: none; border: none; padding: 0px; margin: 0px; } QTreeView::branch:has-siblings:!adjoins-item{ background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat; } QTreeView::branch:has-siblings{ background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat; } QTreeView::branch:!has-children:!has-siblings:adjoins-item{ background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat; } QTreeView::branch:closed:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat; } QTreeView::branch:closed:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat; } QTreeView::branch:open:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat; } QTreeView::branch:open:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat; } /* **************************************************************** */ /* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ /* common */ /* **************************************************************** */ QTreeView::indicator,QCheckBox::indicator{ outline: none; border: none; padding: 0px; width: 24px; height: 24px; } QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{ image: url(./Transparent-Style/checkbox-checked.png); } QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{ image: url(./Transparent-Style/checkbox-hover.png); } QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{ image: url(./Transparent-Style/checkbox.png); } QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{ image: url(./Transparent-Style/checkbox-checked-hover.png); } QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QTreeWidget#categoriesList::item:has-children{ background-image: url(./Transparent-Style/arrow-right-small.png); } QTreeWidget#categoriesList::item:has-children:open{ background-image: url(./Transparent-Style/branch-opened.png); } /* ******************************** */ /* Special styles */ /* increase categories tab width */ /* ******************************** */ QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{ min-width: 200px; } QTreeWidget#categoriesList::item { background-position: center left; background-repeat: no-repeat; padding: 0.35em 4px; } /* ********************* */ /* Display Radio Button */ /* ********************* */ QRadioButton::indicator{ width: 16px; height: 16px; } QRadioButton::indicator::checked{ image: url(./Transparent-Style/radio-BOS-checked.png); } QRadioButton::indicator::unchecked{ image: url(./Transparent-Style/radio-BOS.png); } QRadioButton::indicator::unchecked:hover{ image: url(./Transparent-Style/radio-BOS-hover.png); } /* **************************************** */ /* Spinners #QSpinBox, #QDoubleSpinBox */ /* **************************************** */ QAbstractSpinBox{ padding: 5px; background-color: transparent; color: #eff0f1; border-radius: 2px; min-width: Auto; } QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{ border-style: solid; border-width: 1px; subcontrol-origin: border; } QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{ background-color: transparent; } QAbstractSpinBox::up-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center right; padding-right: 5px; /* subcontrol-position: top right; */ } QAbstractSpinBox::down-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center left; padding-left: 5px; /* subcontrol-position: bottom right; */ } QAbstractSpinBox::up-arrow{ border-image: url(./Transparent-Style/narrow-arrow-right.png); }QAbstractSpinBox::down-arrow{ border-image: url(./Transparent-Style/narrow-arrow-left.png); }/* QTextEdit,QWebView,QLineEdit,QComboBox{ border-color:#3F3F46; /* Grey - Blue*/ /*}*/ /* **************************************** */ /* Tooltips #QToolTip, #SaveGameInfoWidget */ /* **************************************** */ QToolTip{ background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } SaveGameInfoWidget{ font-size: 16px; background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* **************************** */ /* Handles Web, Nexus info tab */ /* **************************** */ QWebView{ background-color: Black; } QLineEdit{ font-family: Segoe UI; min-height: 20px; font-size: 16px; background-color:#3F3F46; selection-background-color: rgba(154,154,0,0.6);border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } QTextEdit{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* background-color:#000; */ selection-background-color: rgba(154,154,0,0.6); border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* Font size */ QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* was 14px Profile font size */ } QAbstractItemView{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; /* Body font size*/ } QRadioButton{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; } QWebView,QComboBox,QComboBox:editable{ font-family:Segoe UI; font-style: normal; font-weight: normal; font-size: 16px; background-color:#000; /* border-color:#3F3F46; /* Grey - Blue*/ color: #cccccc; font-family: Arial; font-size: 16px; /* Filter Name*/ } QHeaderView::section{ /* font-family: Source Sans Pro; */ font-family: Segoe UI; font-size: 16px; /*Top Bar on menus font*/ } QListView::item{ color:#F1F1F1; /* White */ } QGroupBox { } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; } QGroupBox::indicator { subcontrol-origin: margin; subcontrol-position: top center; } QLabel { color: #cccccc; /* color: #F1F1F1; /* White */ /* border: none;outline: none; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00;*/ } \ No newline at end of file diff --git a/src/stylesheets/Transparent-Style-Skyrim.qss b/src/stylesheets/Transparent-Style-Skyrim.qss new file mode 100644 index 00000000..b5fd7473 --- /dev/null +++ b/src/stylesheets/Transparent-Style-Skyrim.qss @@ -0,0 +1 @@ +#centralWidget { border-image: url(./Transparent-Style/Background-skyrim.png) 0 0 0 0 stretch stretch; } QWidget#TextViewer{ } QWidget{ color: #fff; background-color: rgba(45,45,48,30); alternate-background-color: rgba(38,38,38,30); } QWidget:disabled{ } QAbstractItemView{ color: #dcdcdc; background-color: rgb(45,45,48,30); alternate-background-color: rgb(38,38,38,50); border: 1px solid #3F3F46; /* Grey - Blue*/ border-style:outset; border-radius: 3px; selection-color: #3F3F46; /* Grey - Blue*/ outline: none; padding-left:0; } #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #toolBarArea{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #EditExecutablesDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #SimpleInstallDialog,#LockedDialog,QMenu{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #nameLabel{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); color:#fff; } #ProfilesDialog,#FomodInstallerDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #filesView{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } /* ******************************************** */ /* Main Navigation Button Bar at top of window */ /* ******************************************** */ QToolBar{ /*border: none;*/ } QToolBar::separator{ /*image: url(./Transparent-Style/Vault-101-vault-logo.png);*/ } QToolButton{ border:2px solid None; border-radius: 6px; margin: 3px; padding-left: 8px; padding-right: 8px; padding-top: 0px; padding-bottom: 2px; } QToolButton:hover{ border-radius: 3px; border: 0px; padding: 0px; background: trANSPARENT; border: 0px ridge #9A9A00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53); } QToolButton:pressed{ background: black; } /* **************************************** */ /* Tabs on top of Treeview */ /* **************************************** */ QTabWidget::pane{ border-color:#3F3F46; /* Grey - Blue*/ /* border-top-color:#9A9A00; */ top: 0px; border-style:hidden; border-width:1px; } QTabWidget::tab-bar{ alignment: center; } QTabBar{ color: #cccccc; font-family: Segoe UI; font-size: 16px; text-transform: none; min-height:auto; padding-bottom: 5px; } QTabBar::tab{ border: none; border-bottom-style: none; background-color: rgba(154,154,0,0.3); padding-left: 9px; padding-right: 9px; padding-top: 3px; padding-bottom: 3px; margin-right: 2px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } QTabBar::tab:disabled{ color: #404040; background-color: #000; margin-top: 0px; } QTabBar::tab:selected{ color: #dcdcdc; background-color: #9A9A00; /*Yellow opaque*/ } QTabBar::tab:!selected:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; padding: 1px; text-align: center; background-color: #9A9A00; color:#fff; Height: 20%; } /* QTabBar::tab:!selected{ color: #808080; background-color: #404040; margin-top: 0px; } */ #deactivateESP,#activateESP{ border:#b30000; background:#333337; } /* **************************************** */ /* on top of Treeview */ /* **************************************** */ QTabBar QToolButton{ border-radius: 0px; border: 0px; padding: 0px; background: transparent; } QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{ image: url(./Transparent-Style/arrow-up.png); } QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{ image: url(./Transparent-Style/arrow-down.png); } QTabBar QToolButton::right-arrow{ image: url(./Transparent-Style/narrow-arrow-right.png); } QTabBar QToolButton::left-arrow{ image: url(./Transparent-Style/narrow-arrow-left.png); } /* **************************************** */ /* Column names of TreeView */ /* **************************************** */ QTableView{ gridline-color:#3F3F46; selection-background-color:#9A9A00; selection-color:#F1F1F1; /* White */ text-align: center; min-height:24px; } QHeaderView{ min-height:24px; /*Top Bar on menus*/ padding: 3px; } QHeaderView::section{ /* color: #cc3333; */ background-color: #252526; border-radius: 0px; padding: 0px; padding-left: 5px; } QHeaderView::section:hover{ background: rgba(154,154,0,0.3); border: 1px solid #9a9a00; padding: 0px; padding-left: 5px; } QHeaderView::up-arrow,QHeaderView::down-arrow{ min-height:Auto; min-width:Auto; } QHeaderView::up-arrow{ image: url(./Transparent-Style/arrow-up.png); min-height:25px; min-width:15px; padding-right: 0px; }QHeaderView::down-arrow{ image: url(./Transparent-Style/arrow-down.png); } /* **************************************** */ /* Hover */ /* **************************************** */ QMenu:item:hover,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{ color:#fff; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); } QAbstractItemView::item:hover{ border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); padding: 3px; } /*#DownloadListWidget{ }*/ #DownloadListWidget{ outline: 1px solid #e8e8e8; border: 0px solid #9a9a00; } #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{ border: 1px solid #9a9a00; padding: 1px; text-align: center; color:#fff; } /* **************************************** */ /* Context menus, toolbar dropdowns #QMenu */ /* **************************************** */ QMenu{ border-width: 3px; border-style: solid; }QMenu::item{ padding: 6px 20px; }QMenu::item:selected{ color:#fff; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QMenu::right-arrow{ image: url(./Transparent-Style/arrow-right.png); /* right click main menu top option*/ subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:0px outset #3F3F46; /* Grey - Blue*/ } /* ********************* */ /* LCD Counter */ /* ********************* */ QLCDNumber{ color: #9A9A00; Background: #000; border-color: #3F3F46; /* Grey - Blue*/ border-style: solid; border-width: 1px; border-radius: 5px; } /* **************************************** */ /* Launch application Drop down Box */ /* **************************************** */ QComboBox{ background-color: #333337; padding: 3px 5px 5px 5px; height: 26px; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QComboBox:on{ padding: 3px 5px 5px 5px; color: white; background-color: #3F3F46; /* Grey - Blue*/ } QComboBox:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; /* padding: 0px; */ } QComboBox::drop-down{ /* Down arrow in combo box */ outline: none; border: none; border-width: 1px; } QComboBox::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px outset #3F3F46; /* Grey - Blue*/ } /* ************************* */ /* QComboBox::down-arrow:on, */ /* ************************* */ QComboBox::down-arrow:hover,QComboBox::down-arrow:focus { image: url(./Transparent-Style/arrow-down-hover.png); } QComboBox::up-arrow:hover,QComboBox::up-arrow:focus { image: url(./Transparent-Style/arrow-up-hover.png); } QComboBox::down-arrow{ image:url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; } QComboBox::down-arrow:on{ image:url(./Transparent-Style/arrow-up.png); } QComboBox:editable { background: black; /* color: pink; */ } QComboBox::item{ } QComboBox QAbstractItemView{ selection-color:#fff; outline: 1px solid #9a9a00; selection-background-color:#3F3F46; /* Grey - Blue*/ border-top:1px solid #9a9a00; border-bottom:1px solid #9a9a00; padding: 5px; } /* **************************************************************** */ /* Action Buttons */ /* */ /* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */ /* Sort, Load order backup, Load Order Restore */ /* **************************************************************** */ QPushButton{ background-color: #333337; min-height:26px; padding:1px 5%; text-align: center; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QPushButton::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px hidden #3F3F46; /* Grey - Blue*/ } QPushButton::menu-indicator:Hover{ image: url(./Transparent-Style/arrow-down-hover.png); } QPushButton:focus{ } QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{ background: #3F3F46; /* Grey - Blue*/ border-radius: 1px; border: 1px solid #9a9a00; } QPushButton:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; } QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{ color:#fff; border-color:#707070; border-style:solid; border-width:1px; } QPushButton:disabled{ } QPushButton:open{ } QPushButton:!enabled{ } /* **************************************** */ /* Filter Button */ /* **************************************** */ QPushButton#displayCategoriesBtn{ min-width: 20px; background:transparent; color: transparent; border: 1px hidden #9a9a00; } QPushButton#displayCategoriesBtn:checked{ image: url(./Transparent-Style/arrow-left.png); } QPushButton#displayCategoriesBtn:!checked{ image: url(./Transparent-Style/arrow-right.png); } QPushButton#displayCategoriesBtn:checked:hover{ image: url(./Transparent-Style/arrow-left-hover.png); } QPushButton#displayCategoriesBtn:!checked:hover{ image: url(./Transparent-Style/arrow-right-hover.png); } /* **************************************** */ /* Scroll bar */ /* **************************************** */ QScrollBar{ height:20px; width:20px; background-color:transparent; } QScrollBar::handle{ border: 1px solid #aaa; border-radius: 4px; } QScrollBar::handle:vertical{ margin: 1px 4px; min-height:20px; min-width: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:vertical:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::handle:horizontal{ min-height:10px;min-width:20px;margin:4px 1px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:horizontal:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{ background-color: transparent; } QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{ height:0; width:0; } /* ******************************************************** */ /* Main Tree View Inherited from QAbstractItemView */ /* ******************************************************** */ QTreeView { } QTreeView:item{ padding: 3px; font-size: 16px; height: 18px; /*Bottom text Box*/ } QTreeView:item:selected{ color:#fff; padding: 0px; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QTreeView:item QLineEdit{ outline: none; border: none; padding: 0px; margin: 0px; } QTreeView::branch:has-siblings:!adjoins-item{ background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat; } QTreeView::branch:has-siblings{ background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat; } QTreeView::branch:!has-children:!has-siblings:adjoins-item{ background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat; } QTreeView::branch:closed:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat; } QTreeView::branch:closed:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat; } QTreeView::branch:open:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat; } QTreeView::branch:open:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat; } /* **************************************************************** */ /* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ /* common */ /* **************************************************************** */ QTreeView::indicator,QCheckBox::indicator{ outline: none; border: none; padding: 0px; width: 24px; height: 24px; } QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{ image: url(./Transparent-Style/checkbox-checked.png); } QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{ image: url(./Transparent-Style/checkbox-hover.png); } QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{ image: url(./Transparent-Style/checkbox.png); } QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{ image: url(./Transparent-Style/checkbox-checked-hover.png); } QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QTreeWidget#categoriesList::item:has-children{ background-image: url(./Transparent-Style/arrow-right-small.png); } QTreeWidget#categoriesList::item:has-children:open{ background-image: url(./Transparent-Style/branch-opened.png); } /* ******************************** */ /* Special styles */ /* increase categories tab width */ /* ******************************** */ QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{ min-width: 200px; } QTreeWidget#categoriesList::item { background-position: center left; background-repeat: no-repeat; padding: 0.35em 4px; } /* ********************* */ /* Display Radio Button */ /* ********************* */ QRadioButton::indicator{ width: 16px; height: 16px; } QRadioButton::indicator::checked{ image: url(./Transparent-Style/radio-BOS-checked.png); } QRadioButton::indicator::unchecked{ image: url(./Transparent-Style/radio-BOS.png); } QRadioButton::indicator::unchecked:hover{ image: url(./Transparent-Style/radio-BOS-hover.png); } /* **************************************** */ /* Spinners #QSpinBox, #QDoubleSpinBox */ /* **************************************** */ QAbstractSpinBox{ padding: 5px; background-color: transparent; color: #eff0f1; border-radius: 2px; min-width: Auto; } QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{ border-style: solid; border-width: 1px; subcontrol-origin: border; } QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{ background-color: transparent; } QAbstractSpinBox::up-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center right; padding-right: 5px; /* subcontrol-position: top right; */ } QAbstractSpinBox::down-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center left; padding-left: 5px; /* subcontrol-position: bottom right; */ } QAbstractSpinBox::up-arrow{ border-image: url(./Transparent-Style/narrow-arrow-right.png); }QAbstractSpinBox::down-arrow{ border-image: url(./Transparent-Style/narrow-arrow-left.png); }/* QTextEdit,QWebView,QLineEdit,QComboBox{ border-color:#3F3F46; /* Grey - Blue*/ /*}*/ /* **************************************** */ /* Tooltips #QToolTip, #SaveGameInfoWidget */ /* **************************************** */ QToolTip{ background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } SaveGameInfoWidget{ font-size: 16px; background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* **************************** */ /* Handles Web, Nexus info tab */ /* **************************** */ QWebView{ background-color: Black; } QLineEdit{ font-family: Segoe UI; min-height: 20px; font-size: 16px; background-color:#3F3F46; selection-background-color: rgba(154,154,0,0.6);border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } QTextEdit{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* background-color:#000; */ selection-background-color: rgba(154,154,0,0.6); border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* Font size */ QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* was 14px Profile font size */ } QAbstractItemView{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; /* Body font size*/ } QRadioButton{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; } QWebView,QComboBox,QComboBox:editable{ font-family:Segoe UI; font-style: normal; font-weight: normal; font-size: 16px; background-color:#000; /* border-color:#3F3F46; /* Grey - Blue*/ color: #cccccc; font-family: Arial; font-size: 16px; /* Filter Name*/ } QHeaderView::section{ /* font-family: Source Sans Pro; */ font-family: Segoe UI; font-size: 16px; /*Top Bar on menus font*/ } QListView::item{ color:#F1F1F1; /* White */ } QGroupBox { } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; } QGroupBox::indicator { subcontrol-origin: margin; subcontrol-position: top center; } QLabel { color: #cccccc; /* color: #F1F1F1; /* White */ /* border: none;outline: none; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00;*/ } \ No newline at end of file diff --git a/src/stylesheets/Transparent-Style/Background-skyrim.png b/src/stylesheets/Transparent-Style/Background-skyrim.png new file mode 100644 index 00000000..78a82f08 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Background-skyrim.png differ diff --git a/src/stylesheets/Transparent-Style/Fallout-BOS.png b/src/stylesheets/Transparent-Style/Fallout-BOS.png new file mode 100644 index 00000000..c8585355 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Fallout-BOS.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-item-end.png b/src/stylesheets/Transparent-Style/Green/Vault-101-item-end.png new file mode 100644 index 00000000..5b86f728 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-item-end.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-item-line-v.png b/src/stylesheets/Transparent-Style/Green/Vault-101-item-line-v.png new file mode 100644 index 00000000..17c37a0b Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-item-line-v.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-close-last.png b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-close-last.png new file mode 100644 index 00000000..5582f311 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-close-last.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-end.png b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-end.png new file mode 100644 index 00000000..d2044a86 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-end.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-line.png b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-line.png new file mode 100644 index 00000000..f2b49eba Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-line.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-open-last.png b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-open-last.png new file mode 100644 index 00000000..01b37ebc Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-itemB-open-last.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-itemb-close.png b/src/stylesheets/Transparent-Style/Green/Vault-101-itemb-close.png new file mode 100644 index 00000000..f7011114 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-itemb-close.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-itemb-open.png b/src/stylesheets/Transparent-Style/Green/Vault-101-itemb-open.png new file mode 100644 index 00000000..c8b6c4d4 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-itemb-open.png differ diff --git a/src/stylesheets/Transparent-Style/Green/Vault-101-vault-boy.png b/src/stylesheets/Transparent-Style/Green/Vault-101-vault-boy.png new file mode 100644 index 00000000..dda4af38 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/Vault-101-vault-boy.png differ diff --git a/src/stylesheets/Transparent-Style/Green/arrow-down.png b/src/stylesheets/Transparent-Style/Green/arrow-down.png new file mode 100644 index 00000000..48be99c2 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/arrow-down.png differ diff --git a/src/stylesheets/Transparent-Style/Green/arrow-left.png b/src/stylesheets/Transparent-Style/Green/arrow-left.png new file mode 100644 index 00000000..74a96795 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/arrow-left.png differ diff --git a/src/stylesheets/Transparent-Style/Green/arrow-right.png b/src/stylesheets/Transparent-Style/Green/arrow-right.png new file mode 100644 index 00000000..144605c4 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/arrow-right.png differ diff --git a/src/stylesheets/Transparent-Style/Green/arrow-up.png b/src/stylesheets/Transparent-Style/Green/arrow-up.png new file mode 100644 index 00000000..191c83ce Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/arrow-up.png differ diff --git a/src/stylesheets/Transparent-Style/Green/border-image.png b/src/stylesheets/Transparent-Style/Green/border-image.png new file mode 100644 index 00000000..a1f98702 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/border-image.png differ diff --git a/src/stylesheets/Transparent-Style/Green/checkbox-checked-disabled.png b/src/stylesheets/Transparent-Style/Green/checkbox-checked-disabled.png new file mode 100644 index 00000000..098158d0 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/checkbox-checked-disabled.png differ diff --git a/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover.png b/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover.png new file mode 100644 index 00000000..0e1f8be1 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover.png differ diff --git a/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover1.png b/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover1.png new file mode 100644 index 00000000..413cb2af Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover1.png differ diff --git a/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover2.png b/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover2.png new file mode 100644 index 00000000..bea563f0 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/checkbox-checked-hover2.png differ diff --git a/src/stylesheets/Transparent-Style/Green/checkbox-checked.png b/src/stylesheets/Transparent-Style/Green/checkbox-checked.png new file mode 100644 index 00000000..7d0e94c9 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/checkbox-checked.png differ diff --git a/src/stylesheets/Transparent-Style/Green/checkbox-hover.png b/src/stylesheets/Transparent-Style/Green/checkbox-hover.png new file mode 100644 index 00000000..7e226e41 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/checkbox-hover.png differ diff --git a/src/stylesheets/Transparent-Style/Green/checkbox.png b/src/stylesheets/Transparent-Style/Green/checkbox.png new file mode 100644 index 00000000..74b446c1 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/checkbox.png differ diff --git a/src/stylesheets/Transparent-Style/Green/context-menu-separator.png b/src/stylesheets/Transparent-Style/Green/context-menu-separator.png new file mode 100644 index 00000000..60248313 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/context-menu-separator.png differ diff --git a/src/stylesheets/Transparent-Style/Green/radio-checked.png b/src/stylesheets/Transparent-Style/Green/radio-checked.png new file mode 100644 index 00000000..5fd9f6f7 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/radio-checked.png differ diff --git a/src/stylesheets/Transparent-Style/Green/radio-hover.png b/src/stylesheets/Transparent-Style/Green/radio-hover.png new file mode 100644 index 00000000..42b31aee Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/radio-hover.png differ diff --git a/src/stylesheets/Transparent-Style/Green/radio.png b/src/stylesheets/Transparent-Style/Green/radio.png new file mode 100644 index 00000000..55d09b4d Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/radio.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-101.png b/src/stylesheets/Transparent-Style/Green/vault-101.png new file mode 100644 index 00000000..8c311042 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-101.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-tec-executables.png b/src/stylesheets/Transparent-Style/Green/vault-tec-executables.png new file mode 100644 index 00000000..30f6eba0 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-tec-executables.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-tec-full.png b/src/stylesheets/Transparent-Style/Green/vault-tec-full.png new file mode 100644 index 00000000..f79213c9 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-tec-full.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-tec-overwrite.png b/src/stylesheets/Transparent-Style/Green/vault-tec-overwrite.png new file mode 100644 index 00000000..a61482ff Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-tec-overwrite.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-tec-profiles.png b/src/stylesheets/Transparent-Style/Green/vault-tec-profiles.png new file mode 100644 index 00000000..5a121b06 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-tec-profiles.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-tec-settings.png b/src/stylesheets/Transparent-Style/Green/vault-tec-settings.png new file mode 100644 index 00000000..d6a43c85 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-tec-settings.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-tec-small.png b/src/stylesheets/Transparent-Style/Green/vault-tec-small.png new file mode 100644 index 00000000..999de531 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-tec-small.png differ diff --git a/src/stylesheets/Transparent-Style/Green/vault-tec.png b/src/stylesheets/Transparent-Style/Green/vault-tec.png new file mode 100644 index 00000000..809486e6 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Green/vault-tec.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-item-end.png b/src/stylesheets/Transparent-Style/Vault-101-item-end.png new file mode 100644 index 00000000..744e88d9 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-item-end.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-item-line-v.png b/src/stylesheets/Transparent-Style/Vault-101-item-line-v.png new file mode 100644 index 00000000..48453ee6 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-item-line-v.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemB-close-last.png b/src/stylesheets/Transparent-Style/Vault-101-itemB-close-last.png new file mode 100644 index 00000000..930a3a04 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemB-close-last.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemB-end.png b/src/stylesheets/Transparent-Style/Vault-101-itemB-end.png new file mode 100644 index 00000000..6eb0db48 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemB-end.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemB-line.png b/src/stylesheets/Transparent-Style/Vault-101-itemB-line.png new file mode 100644 index 00000000..86c503b3 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemB-line.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemB-open-last.png b/src/stylesheets/Transparent-Style/Vault-101-itemB-open-last.png new file mode 100644 index 00000000..3037addd Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemB-open-last.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (2).png b/src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (2).png new file mode 100644 index 00000000..fcc44dd0 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (2).png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (3).png b/src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (3).png new file mode 100644 index 00000000..f9960221 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemb-close - Copy (3).png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemb-close.png b/src/stylesheets/Transparent-Style/Vault-101-itemb-close.png new file mode 100644 index 00000000..29a68878 Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemb-close.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-101-itemb-open.png b/src/stylesheets/Transparent-Style/Vault-101-itemb-open.png new file mode 100644 index 00000000..3359205e Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-101-itemb-open.png differ diff --git a/src/stylesheets/Transparent-Style/Vault-BOS-Main.png b/src/stylesheets/Transparent-Style/Vault-BOS-Main.png new file mode 100644 index 00000000..e30609df Binary files /dev/null and b/src/stylesheets/Transparent-Style/Vault-BOS-Main.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-down-hover.png b/src/stylesheets/Transparent-Style/arrow-down-hover.png new file mode 100644 index 00000000..3d53c1a0 Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-down-hover.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-down-small.png b/src/stylesheets/Transparent-Style/arrow-down-small.png new file mode 100644 index 00000000..a61d70e5 Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-down-small.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-down.png b/src/stylesheets/Transparent-Style/arrow-down.png new file mode 100644 index 00000000..41232bb4 Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-down.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-left-hover.png b/src/stylesheets/Transparent-Style/arrow-left-hover.png new file mode 100644 index 00000000..9bd9aa1e Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-left-hover.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-left.png b/src/stylesheets/Transparent-Style/arrow-left.png new file mode 100644 index 00000000..ec965b2b Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-left.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-right-hover.png b/src/stylesheets/Transparent-Style/arrow-right-hover.png new file mode 100644 index 00000000..3df981c2 Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-right-hover.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-right-small.png b/src/stylesheets/Transparent-Style/arrow-right-small.png new file mode 100644 index 00000000..1c4cb237 Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-right-small.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-right.png b/src/stylesheets/Transparent-Style/arrow-right.png new file mode 100644 index 00000000..935f1b7a Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-right.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-up-hover.png b/src/stylesheets/Transparent-Style/arrow-up-hover.png new file mode 100644 index 00000000..9fc94dc4 Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-up-hover.png differ diff --git a/src/stylesheets/Transparent-Style/arrow-up.png b/src/stylesheets/Transparent-Style/arrow-up.png new file mode 100644 index 00000000..797fb740 Binary files /dev/null and b/src/stylesheets/Transparent-Style/arrow-up.png differ diff --git a/src/stylesheets/Transparent-Style/carbonfiber.png b/src/stylesheets/Transparent-Style/carbonfiber.png new file mode 100644 index 00000000..8f92238e Binary files /dev/null and b/src/stylesheets/Transparent-Style/carbonfiber.png differ diff --git a/src/stylesheets/Transparent-Style/checkbox-checked-disabled.png b/src/stylesheets/Transparent-Style/checkbox-checked-disabled.png new file mode 100644 index 00000000..c781b2a3 Binary files /dev/null and b/src/stylesheets/Transparent-Style/checkbox-checked-disabled.png differ diff --git a/src/stylesheets/Transparent-Style/checkbox-checked-hover.png b/src/stylesheets/Transparent-Style/checkbox-checked-hover.png new file mode 100644 index 00000000..6f275c3e Binary files /dev/null and b/src/stylesheets/Transparent-Style/checkbox-checked-hover.png differ diff --git a/src/stylesheets/Transparent-Style/checkbox-checked.png b/src/stylesheets/Transparent-Style/checkbox-checked.png new file mode 100644 index 00000000..4c2d1d77 Binary files /dev/null and b/src/stylesheets/Transparent-Style/checkbox-checked.png differ diff --git a/src/stylesheets/Transparent-Style/checkbox-hover.png b/src/stylesheets/Transparent-Style/checkbox-hover.png new file mode 100644 index 00000000..7fce9dd8 Binary files /dev/null and b/src/stylesheets/Transparent-Style/checkbox-hover.png differ diff --git a/src/stylesheets/Transparent-Style/checkbox.png b/src/stylesheets/Transparent-Style/checkbox.png new file mode 100644 index 00000000..32d6d5b0 Binary files /dev/null and b/src/stylesheets/Transparent-Style/checkbox.png differ diff --git a/src/stylesheets/Transparent-Style/narrow-arrow-down.png b/src/stylesheets/Transparent-Style/narrow-arrow-down.png new file mode 100644 index 00000000..b1bbdf57 Binary files /dev/null and b/src/stylesheets/Transparent-Style/narrow-arrow-down.png differ diff --git a/src/stylesheets/Transparent-Style/narrow-arrow-left.png b/src/stylesheets/Transparent-Style/narrow-arrow-left.png new file mode 100644 index 00000000..5fad0dc4 Binary files /dev/null and b/src/stylesheets/Transparent-Style/narrow-arrow-left.png differ diff --git a/src/stylesheets/Transparent-Style/narrow-arrow-right.png b/src/stylesheets/Transparent-Style/narrow-arrow-right.png new file mode 100644 index 00000000..982a100f Binary files /dev/null and b/src/stylesheets/Transparent-Style/narrow-arrow-right.png differ diff --git a/src/stylesheets/Transparent-Style/narrow-arrow-up.png b/src/stylesheets/Transparent-Style/narrow-arrow-up.png new file mode 100644 index 00000000..62006d20 Binary files /dev/null and b/src/stylesheets/Transparent-Style/narrow-arrow-up.png differ diff --git a/src/stylesheets/Transparent-Style/radio-BOS-checked.png b/src/stylesheets/Transparent-Style/radio-BOS-checked.png new file mode 100644 index 00000000..4c2d1d77 Binary files /dev/null and b/src/stylesheets/Transparent-Style/radio-BOS-checked.png differ diff --git a/src/stylesheets/Transparent-Style/radio-BOS-hover.png b/src/stylesheets/Transparent-Style/radio-BOS-hover.png new file mode 100644 index 00000000..7d7ae49c Binary files /dev/null and b/src/stylesheets/Transparent-Style/radio-BOS-hover.png differ diff --git a/src/stylesheets/Transparent-Style/radio-BOS.png b/src/stylesheets/Transparent-Style/radio-BOS.png new file mode 100644 index 00000000..6f275c3e Binary files /dev/null and b/src/stylesheets/Transparent-Style/radio-BOS.png differ -- cgit v1.3.1 From 545b7b4eb7f629ccbbe03d7c20c305f1225b5416 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 9 Nov 2018 17:42:15 -0600 Subject: Fix button colors in the settings dialog with the default theme --- src/settings.cpp | 15 ++++++--------- src/settingsdialog.cpp | 32 ++++++++++++++++++-------------- src/settingsdialog.h | 6 ++++++ 3 files changed, 30 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/settings.cpp b/src/settings.cpp index 7d9fb7c0..0f8eaa2a 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -741,24 +741,21 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog) m_containsBtn->setPalette(palette3); m_containedBtn->setPalette(palette4); */ - - //version with stylesheet - QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); - - m_overwritingBtn->setStyleSheet(COLOR_STYLE.arg( + //version with stylesheet + m_overwritingBtn->setStyleSheet(m_dialog.getColoredButtonStyleSheet().arg( m_parent->modlistOverwritingLooseColor().name()).arg(getIdealTextColor( m_parent->modlistOverwritingLooseColor()).name())); - m_overwrittenBtn->setStyleSheet(COLOR_STYLE.arg( + m_overwrittenBtn->setStyleSheet(m_dialog.getColoredButtonStyleSheet().arg( m_parent->modlistOverwrittenLooseColor().name()).arg(getIdealTextColor( m_parent->modlistOverwrittenLooseColor()).name())); - m_containsBtn->setStyleSheet(COLOR_STYLE.arg( + m_containsBtn->setStyleSheet(m_dialog.getColoredButtonStyleSheet().arg( m_parent->modlistContainsPluginColor().name()).arg(getIdealTextColor( m_parent->modlistContainsPluginColor()).name())); - m_containedBtn->setStyleSheet(COLOR_STYLE.arg( + m_containedBtn->setStyleSheet(m_dialog.getColoredButtonStyleSheet().arg( m_parent->pluginListContainedColor().name()).arg(getIdealTextColor( m_parent->pluginListContainedColor()).name())); - + m_dialog.setOverwritingColor(m_parent->modlistOverwritingLooseColor()); m_dialog.setOverwrittenColor(m_parent->modlistOverwrittenLooseColor()); m_dialog.setContainsColor(m_parent->modlistContainsPluginColor()); diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 7f484830..8a983896 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -59,6 +59,16 @@ SettingsDialog::~SettingsDialog() delete ui; } +QString SettingsDialog::getColoredButtonStyleSheet() const +{ + return QString("QPushButton {" + "background-color: %1;" + "color: %2;" + "border: 1px solid;" + "padding: 3px;" + "}"); +} + void SettingsDialog::accept() { QString newModPath = ui->modDirEdit->text(); @@ -184,8 +194,7 @@ void SettingsDialog::on_containsBtn_clicked() if (result.isValid()) { m_ContainsColor = result; - QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); - ui->containsBtn->setStyleSheet(COLOR_STYLE.arg( + ui->containsBtn->setStyleSheet(getColoredButtonStyleSheet().arg( result.name()).arg(Settings::getIdealTextColor( result).name())); @@ -203,8 +212,7 @@ void SettingsDialog::on_containedBtn_clicked() if (result.isValid()) { m_ContainedColor = result; - QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); - ui->containedBtn->setStyleSheet(COLOR_STYLE.arg( + ui->containedBtn->setStyleSheet(getColoredButtonStyleSheet().arg( result.name()).arg(Settings::getIdealTextColor( result).name())); @@ -222,8 +230,7 @@ void SettingsDialog::on_overwrittenBtn_clicked() if (result.isValid()) { m_OverwrittenColor = result; - QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); - ui->overwrittenBtn->setStyleSheet(COLOR_STYLE.arg( + ui->overwrittenBtn->setStyleSheet(getColoredButtonStyleSheet().arg( result.name()).arg(Settings::getIdealTextColor( result).name())); @@ -241,8 +248,7 @@ void SettingsDialog::on_overwritingBtn_clicked() if (result.isValid()) { m_OverwritingColor = result; - QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); - ui->overwritingBtn->setStyleSheet(COLOR_STYLE.arg( + ui->overwritingBtn->setStyleSheet(getColoredButtonStyleSheet().arg( result.name()).arg(Settings::getIdealTextColor( result).name())); @@ -261,21 +267,19 @@ void SettingsDialog::on_resetColorsBtn_clicked() m_ContainsColor = QColor(0, 0, 255, 64); m_ContainedColor = QColor(0, 0, 255, 64); - QString COLOR_STYLE("QPushButton { background-color : %1; color : %2; }"); - - ui->overwritingBtn->setStyleSheet(COLOR_STYLE.arg( + ui->overwritingBtn->setStyleSheet(getColoredButtonStyleSheet().arg( QColor(255, 0, 0, 64).name()).arg(Settings::getIdealTextColor( QColor(255, 0, 0, 64)).name())); - ui->overwrittenBtn->setStyleSheet(COLOR_STYLE.arg( + ui->overwrittenBtn->setStyleSheet(getColoredButtonStyleSheet().arg( QColor(0, 255, 0, 64).name()).arg(Settings::getIdealTextColor( QColor(0, 255, 0, 64)).name())); - ui->containsBtn->setStyleSheet(COLOR_STYLE.arg( + ui->containsBtn->setStyleSheet(getColoredButtonStyleSheet().arg( QColor(0, 0, 255, 64).name()).arg(Settings::getIdealTextColor( QColor(0, 0, 255, 64)).name())); - ui->containedBtn->setStyleSheet(COLOR_STYLE.arg( + ui->containedBtn->setStyleSheet(getColoredButtonStyleSheet().arg( QColor(0, 0, 255, 64).name()).arg(Settings::getIdealTextColor( QColor(0, 0, 255, 64)).name())); diff --git a/src/settingsdialog.h b/src/settingsdialog.h index c678ec78..7df52ccd 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -44,6 +44,12 @@ public: explicit SettingsDialog(PluginContainer *pluginContainer, QWidget *parent = 0); ~SettingsDialog(); + /** + * @brief get stylesheet of settings buttons with colored background + * @return string of stylesheet + */ + QString getColoredButtonStyleSheet() const; + public slots: virtual void accept(); -- cgit v1.3.1 From effd05df06a8db24020d289e1734ba57e5488cb5 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 9 Nov 2018 19:05:06 -0600 Subject: Tweak text color selection to prevent white text on bright green background --- src/settings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/settings.cpp b/src/settings.cpp index 0f8eaa2a..ce3a68ff 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -194,9 +194,9 @@ QString Settings::deObfuscate(const QString &password) QColor Settings::getIdealTextColor(const QColor& rBackgroundColor) { - const int THRESHOLD = 105; + const int THRESHOLD = 106; int BackgroundDelta = (rBackgroundColor.red() * 0.299) + (rBackgroundColor.green() * 0.587) + (rBackgroundColor.blue() * 0.114); - return QColor((255 - BackgroundDelta < THRESHOLD) ? Qt::black : Qt::white); + return QColor((255 - BackgroundDelta <= THRESHOLD) ? Qt::black : Qt::white); } -- cgit v1.3.1 From aaa1523db9c7e93ca9b258a74f36c17e29e5fc5a Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 10 Nov 2018 16:24:45 -0600 Subject: Normalize path settings to prevent extra characters --- src/settingsdialog.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/settingsdialog.h | 11 +++++++++++ 2 files changed, 52 insertions(+) (limited to 'src') diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 8a983896..91ce0e25 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -358,3 +358,44 @@ void SettingsDialog::on_clearCacheButton_clicked() NexusInterface::instance(m_PluginContainer)->clearCache(); } +void SettingsDialog::normalizePath(QLineEdit *lineEdit) +{ + QString text = lineEdit->text(); + QString new_text = text; + if (text.contains("%BASE_DIR%")) { + QString baseDir = ui->baseDirEdit->text(); + new_text = new_text.replace("%BASE_DIR%", baseDir); + new_text = QDir(new_text).absolutePath(); + new_text = new_text.replace(baseDir, "%BASE_DIR%"); + } else { + new_text = QDir(new_text).absolutePath(); + } + if (new_text.compare(text, Qt::CaseInsensitive)) { + lineEdit->setText(new_text); + } +} + +void SettingsDialog::on_downloadDirEdit_editingFinished() +{ + normalizePath(ui->downloadDirEdit); +} + +void SettingsDialog::on_modDirEdit_editingFinished() +{ + normalizePath(ui->modDirEdit); +} + +void SettingsDialog::on_cacheDirEdit_editingFinished() +{ + normalizePath(ui->cacheDirEdit); +} + +void SettingsDialog::on_profilesDirEdit_editingFinished() +{ + normalizePath(ui->profilesDirEdit); +} + +void SettingsDialog::on_overwriteDirEdit_editingFinished() +{ + normalizePath(ui->overwriteDirEdit); +} diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 7df52ccd..3609c940 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -61,6 +61,7 @@ signals: private: void storeSettings(QListWidgetItem *pluginItem); + void normalizePath(QLineEdit *lineEdit); public: @@ -113,6 +114,16 @@ private slots: void on_resetColorsBtn_clicked(); + void on_downloadDirEdit_editingFinished(); + + void on_modDirEdit_editingFinished(); + + void on_cacheDirEdit_editingFinished(); + + void on_profilesDirEdit_editingFinished(); + + void on_overwriteDirEdit_editingFinished(); + private: Ui::SettingsDialog *ui; PluginContainer *m_PluginContainer; -- cgit v1.3.1 From ad01e1d6085a97681537fe3328955dd1660dae36 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 10 Nov 2018 22:04:12 -0600 Subject: Less strict implementation of path normalization --- src/settingsdialog.cpp | 19 ++++++++----------- src/settingsdialog.h | 2 ++ 2 files changed, 10 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 91ce0e25..31c1d0fe 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -361,18 +361,15 @@ void SettingsDialog::on_clearCacheButton_clicked() void SettingsDialog::normalizePath(QLineEdit *lineEdit) { QString text = lineEdit->text(); - QString new_text = text; - if (text.contains("%BASE_DIR%")) { - QString baseDir = ui->baseDirEdit->text(); - new_text = new_text.replace("%BASE_DIR%", baseDir); - new_text = QDir(new_text).absolutePath(); - new_text = new_text.replace(baseDir, "%BASE_DIR%"); - } else { - new_text = QDir(new_text).absolutePath(); - } - if (new_text.compare(text, Qt::CaseInsensitive)) { - lineEdit->setText(new_text); + while (text.endsWith('/') || text.endsWith('\\')) { + text.chop(1); } + lineEdit->setText(text); +} + +void SettingsDialog::on_baseDirEdit_editingFinished() +{ + normalizePath(ui->baseDirEdit); } void SettingsDialog::on_downloadDirEdit_editingFinished() diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 3609c940..386cd24e 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -114,6 +114,8 @@ private slots: void on_resetColorsBtn_clicked(); + void on_baseDirEdit_editingFinished(); + void on_downloadDirEdit_editingFinished(); void on_modDirEdit_editingFinished(); -- cgit v1.3.1 From a219d034448496880f9deed48ef6905ac4ce594e Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Mon, 26 Nov 2018 03:13:33 -0600 Subject: Add cancel button to "Start Steam?" dialog to not start binary --- src/organizer_en.ts | 160 +++++++++++++++++++++++++------------------------- src/organizercore.cpp | 22 ++++--- 2 files changed, 93 insertions(+), 89 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 5a3826b0..9b1294ac 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -2650,6 +2650,18 @@ You can also use online editors and converters instead. Remove Backup... + + + + Change Categories + + + + + + Primary Category + + Rename Separator... @@ -2660,11 +2672,6 @@ You can also use online editors and converters instead. Remove Separator... - - - Set the priority of the selected mods - - Select Color... @@ -2675,18 +2682,6 @@ You can also use online editors and converters instead. Reset Color - - - - Change Categories - - - - - - Primary Category - - Change versioning scheme @@ -3151,6 +3146,11 @@ You can also use online editors and converters instead. Ignore file + + + Set the priority of the selected mods + + MessageDialog @@ -4326,118 +4326,118 @@ p, li { white-space: pre-wrap; } - + Start Steam? - + Steam is required to be running already to correctly start the game. Should MO try to start steam now? - + Error - + Windows Event Log Error - + The Windows Event Log service is disabled and/or not running. This prevents USVFS from running properly. Your mods may not be working in the executable that you are launching. Note that you may have to restart MO and/or your PC after the service is fixed. Continue launching %1? - + No profile set - + Failed to refresh list of esps: %1 - + Multiple esps/esls activated, please check that they don't conflict. - + Download? - + A download has been started but no installed page plugin recognizes it. If you download anyway no information (i.e. version) will be associated with the download. Continue? - + failed to update mod list: %1 - - + + login successful - + Login failed - + Login failed, try again? - + login failed: %1. Download will not be associated with an account - + login failed: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + MO1 "Script Extender" load mechanism has left hook.dll in your game folder - - + + Description missing - + <a href="%1">hook.dll</a> has been found in your game folder (right click to copy the full path). This is most likely a leftover of setting the ModOrganizer 1 load mechanism to "Script Extender", in which case you must remove this file either by changing the load mechanism in ModOrganizer 1 or manually removing the file, otherwise the game is likely to crash and burn. - + failed to save load order: %1 - + The designated write target "%1" is not enabled. @@ -5034,7 +5034,8 @@ p, li { white-space: pre-wrap; } QObject - + + Error @@ -5397,7 +5398,7 @@ If the folder was still in use, restart MO and try again. - + Mod Organizer @@ -5474,12 +5475,12 @@ If the folder was still in use, restart MO and try again. - + Script Extender - + Proxy DLL @@ -5699,12 +5700,12 @@ Select Show Details option to see the full change-log. - + Error - + Failed to create "%1", you may not have the necessary permission. path remains unchanged. @@ -5784,6 +5785,11 @@ If you use pre-releases, never contact me directly by e-mail or via private mess Colors + + + Mod Contains selected Plugin + + Plugin is Contained in selected Mod @@ -5795,23 +5801,24 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - - If checked, the download interface will be more compact. + + Is overwritten (loose files) - - Compact Download Interface + + Is overwriting (loose files) - - If checked, the download list will display meta information instead of file names. + + + Modify the categories available to arrange your mods. - - Download Meta Information + + Configure Mod Categories @@ -5819,12 +5826,6 @@ If you use pre-releases, never contact me directly by e-mail or via private mess Reset stored information from dialogs. - - - Mod Contains selected Plugin - Is contained in selected Mod - - This will make all dialogs show up again where you checked the "Remember selection"-box. @@ -5836,24 +5837,23 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - - - Modify the categories available to arrange your mods. + + If checked, the download interface will be more compact. - - Configure Mod Categories + + Compact Download Interface - - Is overwriting (loose files) + + If checked, the download list will display meta information instead of file names. - - Is overwritten (loose files) + + Download Meta Information @@ -6327,52 +6327,52 @@ For the other games this is not a sufficient replacement for AI! - + Confirm - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? - + Select base directory - + Select download directory - + Select mod directory - + Select cache directory - + Select profiles directory - + Select overwrite directory - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? diff --git a/src/organizercore.cpp b/src/organizercore.cpp index fe720a0c..b66895db 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1183,8 +1183,8 @@ ModList *OrganizerCore::modList() QStringList OrganizerCore::modsSortedByProfilePriority() const { QStringList res; - for (int i = currentProfile()->getPriorityMinimum(); - i < currentProfile()->getPriorityMinimum() + (int)currentProfile()->numRegularMods(); + for (int i = currentProfile()->getPriorityMinimum(); + i < currentProfile()->getPriorityMinimum() + (int)currentProfile()->numRegularMods(); ++i) { int modIndex = currentProfile()->modIndexByPriority(i); res.push_back(ModInfo::getByIndex(modIndex)->name()); @@ -1289,12 +1289,16 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary, .exists()) && (m_Settings.getLoadMechanism() == LoadMechanism::LOAD_MODORGANIZER)) { if (!testForSteam()) { - if (QuestionBoxMemory::query(window, "steamQuery", binary.fileName(), - tr("Start Steam?"), - tr("Steam is required to be running already to correctly start the game. " - "Should MO try to start steam now?"), - QDialogButtonBox::Yes | QDialogButtonBox::No) == QDialogButtonBox::Yes) { + QDialogButtonBox::StandardButton result; + result = QuestionBoxMemory::query(window, "steamQuery", binary.fileName(), + tr("Start Steam?"), + tr("Steam is required to be running already to correctly start the game. " + "Should MO try to start steam now?"), + QDialogButtonBox::Yes | QDialogButtonBox::No | QDialogButtonBox::Cancel); + if (result == QDialogButtonBox::Yes) { startSteam(window); + } else if(result == QDialogButtonBox::Cancel) { + return INVALID_HANDLE_VALUE; } } } @@ -1334,7 +1338,7 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary, return INVALID_HANDLE_VALUE; } } - + QString modsPath = settings().getModDirectory(); // Check if this a request with either an executable or a working directory under our mods folder @@ -1727,7 +1731,7 @@ void OrganizerCore::refreshBSAList() if (m_ActiveArchives.isEmpty()) { m_ActiveArchives = m_DefaultArchives; } - + if (m_UserInterface != nullptr) { m_UserInterface->updateBSAList(m_DefaultArchives, m_ActiveArchives); } -- cgit v1.3.1 From 4eaa0d16bb02bb08d0bde75a3b767e8f10b4559c Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Mon, 26 Nov 2018 06:44:09 -0600 Subject: Resize plugin settings to make keys visible --- src/settingsdialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 31c1d0fe..de18a850 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -48,6 +48,7 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, QWidget *parent , m_PluginContainer(pluginContainer) { ui->setupUi(this); + ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}"); QShortcut *delShortcut = new QShortcut(QKeySequence(Qt::Key_Delete), ui->pluginBlacklist); @@ -340,6 +341,9 @@ void SettingsDialog::on_pluginsList_currentItemChanged(QListWidgetItem *current, newItem->setFlags(newItem->flags() | Qt::ItemIsEditable); ui->pluginSettingsList->addTopLevelItem(newItem); } + + ui->pluginSettingsList->resizeColumnToContents(0); + ui->pluginSettingsList->resizeColumnToContents(1); } void SettingsDialog::deleteBlacklistItem() -- cgit v1.3.1 From 7fbfc121182c4893a317f55b78021e58e29a7605 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Mon, 26 Nov 2018 07:23:11 -0600 Subject: Sort the plugin list --- src/settingsdialog.ui | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 4d6535dc..555180b5 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -17,7 +17,7 @@ - 0 + 4 @@ -715,6 +715,9 @@ p, li { white-space: pre-wrap; } 0
    + + true +
    -- cgit v1.3.1 From 4cae1397e7e54a2b4f5593d6ad74c969471c3055 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Mon, 26 Nov 2018 07:44:26 -0600 Subject: Prevent the user from setting a negative mod priority --- src/modlist.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/modlist.cpp b/src/modlist.cpp index 539ba6fc..6c04738a 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -526,6 +526,9 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role) case COL_PRIORITY: { bool ok = false; int newPriority = value.toInt(&ok); + if (ok && newPriority < 0) { + newPriority = 0; + } if (ok) { m_Profile->setModPriority(modID, newPriority); -- cgit v1.3.1 From 6142872620983a2bdd352d4e9e391ddb11c40305 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Mon, 26 Nov 2018 07:51:45 -0600 Subject: Prevent the user from renaming unmanaged and DLC mods --- src/modlist.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/modlist.cpp b/src/modlist.cpp index 6c04738a..7ca0667a 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -616,17 +616,20 @@ Qt::ItemFlags ModList::flags(const QModelIndex &modelIndex) const } if (modelIndex.isValid()) { ModInfo::Ptr modInfo = ModInfo::getByIndex(modelIndex.row()); + std::vector flags = modInfo->getFlags(); if (modInfo->getFixedPriority() == INT_MIN) { result |= Qt::ItemIsDragEnabled; result |= Qt::ItemIsUserCheckable; - if ((modelIndex.column() == COL_NAME) || - (modelIndex.column() == COL_PRIORITY) || + if ((modelIndex.column() == COL_PRIORITY) || (modelIndex.column() == COL_VERSION) || (modelIndex.column() == COL_MODID)) { result |= Qt::ItemIsEditable; } + if ((modelIndex.column() == COL_NAME) + && (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) == flags.end())) { + result |= Qt::ItemIsEditable; + } } - std::vector flags = modInfo->getFlags(); if (m_DropOnItems && (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) == flags.end())) { result |= Qt::ItemIsDropEnabled; -- cgit v1.3.1 From 2212ad6f1c0bbaff7025cdb7227023661e399596 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 29 Nov 2018 08:17:28 -0600 Subject: Add executable blacklisting --- src/mainwindow.cpp | 14 +-- src/organizer_en.ts | 263 +++++++++++++++++++++++++++++-------------------- src/organizercore.cpp | 20 +++- src/organizercore.h | 2 +- src/settings.cpp | 18 ++++ src/settings.h | 7 +- src/settingsdialog.cpp | 27 +++++ src/settingsdialog.h | 13 ++- src/settingsdialog.ui | 22 ++++- src/usvfsconnector.cpp | 13 ++- src/usvfsconnector.h | 2 +- 11 files changed, 272 insertions(+), 129 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index d0591d6e..9a0e02aa 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2877,7 +2877,7 @@ void MainWindow::createSeparator_clicked() } int newPriority = -1; - if (m_ContextRow >= 0 && m_ModListSortProxy->sortColumn() == ModList::COL_PRIORITY) + if (m_ContextRow >= 0 && m_ModListSortProxy->sortColumn() == ModList::COL_PRIORITY) { newPriority = m_OrganizerCore.currentProfile()->getModPriority(m_ContextRow); } @@ -2885,7 +2885,7 @@ void MainWindow::createSeparator_clicked() if (m_OrganizerCore.createMod(name) == nullptr) { return; } m_OrganizerCore.refreshModList(); - if (newPriority >= 0) + if (newPriority >= 0) { m_OrganizerCore.modList()->changeModPriority(ModInfo::getIndex(name), newPriority); } @@ -4129,7 +4129,7 @@ void MainWindow::on_actionSettings_triggered() updateDownloadListDelegate(); - m_OrganizerCore.updateVFSParams(settings.logLevel(), settings.crashDumpsType()); + m_OrganizerCore.updateVFSParams(settings.logLevel(), settings.crashDumpsType(), settings.executablesBlacklist()); m_OrganizerCore.cycleDiagnostics(); } @@ -4405,8 +4405,8 @@ void MainWindow::sendSelectedPluginsToBottom_clicked() void MainWindow::sendSelectedPluginsToPriority_clicked() { bool ok; - int newPriority = QInputDialog::getInt(this, - tr("Set Priority"), tr("Set the priority of the selected plugins"), + int newPriority = QInputDialog::getInt(this, + tr("Set Priority"), tr("Set the priority of the selected plugins"), 0, 0, INT_MAX, 1, &ok); if (!ok) return; @@ -5678,8 +5678,8 @@ void MainWindow::sendSelectedModsToBottom_clicked() void MainWindow::sendSelectedModsToPriority_clicked() { bool ok; - int newPriority = QInputDialog::getInt(this, - tr("Set Priority"), tr("Set the priority of the selected mods"), + int newPriority = QInputDialog::getInt(this, + tr("Set Priority"), tr("Set the priority of the selected mods"), 0, 0, INT_MAX, 1, &ok); if (!ok) return; diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 9b1294ac..518e49bc 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -4041,113 +4041,113 @@ p, li { white-space: pre-wrap; } - + 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><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table> - + Time this mod was installed @@ -4353,91 +4353,103 @@ Continue launching %1? - + + Blacklisted Executable + + + + + The executable you are attempted to launch is blacklisted in the virtual file system. This will likely prevent the executable, and any executables that are launched by this one, from seeing any mods. This could extend to INI files, save games and any other virtualized files. + +Continue launching %1? + + + + No profile set - + Failed to refresh list of esps: %1 - + Multiple esps/esls activated, please check that they don't conflict. - + Download? - + A download has been started but no installed page plugin recognizes it. If you download anyway no information (i.e. version) will be associated with the download. Continue? - + failed to update mod list: %1 - - + + login successful - + Login failed - + Login failed, try again? - + login failed: %1. Download will not be associated with an account - + login failed: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + MO1 "Script Extender" load mechanism has left hook.dll in your game folder - - + + Description missing - + <a href="%1">hook.dll</a> has been found in your game folder (right click to copy the full path). This is most likely a leftover of setting the ModOrganizer 1 load mechanism to "Script Extender", in which case you must remove this file either by changing the load mechanism in ModOrganizer 1 or manually removing the file, otherwise the game is likely to crash and burn. - + failed to save load order: %1 - + The designated write target "%1" is not enabled. @@ -5398,7 +5410,7 @@ If the folder was still in use, restart MO and try again. - + Mod Organizer @@ -5475,12 +5487,12 @@ If the folder was still in use, restart MO and try again. - + Script Extender - + Proxy DLL @@ -5694,18 +5706,18 @@ Select Show Details option to see the full change-log. - - + + attempt to store setting for unknown plugin "%1" - + Error - + Failed to create "%1", you may not have the necessary permission. path remains unchanged. @@ -6042,52 +6054,52 @@ p, li { white-space: pre-wrap; } - + Author: - + Version: - + Description: - + Key - + Value - + Blacklisted Plugins (use <del> to remove): - + Workarounds - + Steam App ID - + The Steam AppID for your game - + <!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; } @@ -6103,17 +6115,17 @@ p, li { white-space: pre-wrap; } - + Load Mechanism - + Select loading mechanism. See help for details. - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -6124,17 +6136,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6143,44 +6155,44 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - + Hide inactive ESPs/ESMs - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - + Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content. - + By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods. However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly. @@ -6188,44 +6200,63 @@ If you disable this feature, MO will only display official DLCs this way. Please - + Display mods installed outside MO - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! - + Back-date BSAs + + + Add executables to the blacklist to prevent them from +accessing the virtual file system. This is useful to prevent +unintended programs from being hooked. Hooking unintended +programs may affect the execution of these programs or the +programs you are intentionally running. + + + + + Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running. + + + Configure Executables Blacklist + + + + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - + Diagnostics - + Log Level - + Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log". "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6233,37 +6264,37 @@ For the other games this is not a sufficient replacement for AI! - + Debug - + Info (recommended) - + Warning - + Error - + Crash Dumps - + Decides which type of crash dumps are collected when injected processes crash. - + Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6274,37 +6305,37 @@ For the other games this is not a sufficient replacement for AI! - + None - + Mini (recommended) - + Data - + Full - + Max Dumps To Keep - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6312,12 +6343,12 @@ For the other games this is not a sufficient replacement for AI! - + Hint: right click link and copy link location - + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. @@ -6327,52 +6358,68 @@ For the other games this is not a sufficient replacement for AI! - + Confirm - + Changing the mod directory affects all your profiles! Mods not present (or named differently) in the new location will be disabled in all profiles. There is no way to undo this unless you backed up your profiles manually. Proceed? - + + Executables Blacklist + + + + + Enter one executable per line to be blacklisted from the virtual file system. +Mods and other virtualized files will not be visible to these executables and +any executables launched by them. + +Example: + Chrome.exe + Firefox.exe + + + + Select base directory - + Select download directory - + Select mod directory - + Select cache directory - + Select profiles directory - + Select overwrite directory - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? @@ -6576,7 +6623,7 @@ On Windows XP: UsvfsConnector - + Preparing vfs diff --git a/src/organizercore.cpp b/src/organizercore.cpp index b66895db..9ac3cb63 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -762,9 +762,9 @@ void OrganizerCore::prepareVFS() m_USVFS.updateMapping(fileMapping(m_CurrentProfile->name(), QString())); } -void OrganizerCore::updateVFSParams(int logLevel, int crashDumpsType) { +void OrganizerCore::updateVFSParams(int logLevel, int crashDumpsType, QString executableBlacklist) { setGlobalCrashDumpsType(crashDumpsType); - m_USVFS.updateParams(logLevel, crashDumpsType); + m_USVFS.updateParams(logLevel, crashDumpsType, executableBlacklist); } bool OrganizerCore::cycleDiagnostics() { @@ -1339,10 +1339,24 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary, } } + for (auto exec : settings().executablesBlacklist().split(";")) { + if (exec.compare(binary.fileName(), Qt::CaseInsensitive)) { + if (QuestionBoxMemory::query(window, QString("blacklistedExecutable"), binary.fileName(), + tr("Blacklisted Executable"), + tr("The executable you are attempted to launch is blacklisted in the virtual file" + " system. This will likely prevent the executable, and any executables that are" + " launched by this one, from seeing any mods. This could extend to INI files, save" + " games and any other virtualized files.\n\nContinue launching %1?").arg(binary.fileName()), + QDialogButtonBox::Yes | QDialogButtonBox::No) == QDialogButtonBox::No) { + return INVALID_HANDLE_VALUE; + } + } + } + QString modsPath = settings().getModDirectory(); // Check if this a request with either an executable or a working directory under our mods folder - // then will start the processs in a virtualized "environment" with the appropriate paths fixed: + // then will start the process in a virtualized "environment" with the appropriate paths fixed: // (i.e. mods\FNIS\path\exe => game\data\path\exe) QString cwdPath = currentDirectory.absolutePath(); bool virtualizedCwd = cwdPath.startsWith(modsPath, Qt::CaseInsensitive); diff --git a/src/organizercore.h b/src/organizercore.h index 28ecef48..086fa11d 100644 --- a/src/organizercore.h +++ b/src/organizercore.h @@ -167,7 +167,7 @@ public: void prepareVFS(); - void updateVFSParams(int logLevel, int crashDumpsType); + void updateVFSParams(int logLevel, int crashDumpsType, QString executableBlacklist); bool cycleDiagnostics(); diff --git a/src/settings.cpp b/src/settings.cpp index ce3a68ff..c311ef29 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -386,6 +386,20 @@ QColor Settings::pluginListContainedColor() const return m_Settings.value("Settings/containedColor", QColor(0, 0, 255, 64)).value(); } +QString Settings::executablesBlacklist() const +{ + return m_Settings.value("Settings/executable_blacklist", ( + QStringList() + << "Chrome.exe" + << "Firefox.exe" + << "TSVNCache.exe" + << "TGitCache.exe" + << "Steam.exe" + << "GameOverlayUI.exe" + ).join(";") + ).toString(); +} + void Settings::setNexusLogin(QString username, QString password) { m_Settings.setValue("Settings/nexus_login", true); @@ -1080,6 +1094,8 @@ Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent, m_forceEnableBox->setChecked(m_parent->forceEnableCoreFiles()); m_displayForeignBox->setChecked(m_parent->displayForeign()); + m_dialog.setExecutableBlacklist(m_parent->executablesBlacklist()); + } void Settings::WorkaroundsTab::update() @@ -1094,4 +1110,6 @@ void Settings::WorkaroundsTab::update() m_Settings.setValue("Settings/hide_unchecked_plugins", m_hideUncheckedBox->isChecked()); m_Settings.setValue("Settings/force_enable_core_files", m_forceEnableBox->isChecked()); m_Settings.setValue("Settings/display_foreign", m_displayForeignBox->isChecked()); + + m_Settings.setValue("Settings/executable_blacklist", m_dialog.getExecutableBlacklist()); } diff --git a/src/settings.h b/src/settings.h index 8fe053e8..667b1b4c 100644 --- a/src/settings.h +++ b/src/settings.h @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#ifndef WORKAROUNDS_H -#define WORKAROUNDS_H +#ifndef SETTINGS_H +#define SETTINGS_H #include "loadmechanism.h" @@ -227,6 +227,7 @@ public: QColor pluginListContainedColor() const; + QString executablesBlacklist() const; /** * @brief set the nexus login information @@ -525,4 +526,4 @@ private: }; -#endif // WORKAROUNDS_H +#endif // SETTINGS_H diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index de18a850..e1c4b10d 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -34,6 +34,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #define WIN32_LEAN_AND_MEAN #include @@ -115,6 +116,32 @@ void SettingsDialog::on_categoriesBtn_clicked() } } +void SettingsDialog::on_execBlacklistBtn_clicked() +{ + bool ok = false; + QString result = QInputDialog::getMultiLineText( + this, + tr("Executables Blacklist"), + tr("Enter one executable per line to be blacklisted from the virtual file system.\n" + "Mods and other virtualized files will not be visible to these executables and\n" + "any executables launched by them.\n\n" + "Example:\n" + " Chrome.exe\n" + " Firefox.exe"), + m_ExecutableBlacklist.split(";").join("\n"), + &ok + ); + if (ok) { + QStringList blacklist; + for (auto exec : result.split("\n")) { + if (exec.trimmed().endsWith(".exe", Qt::CaseInsensitive)) { + blacklist << exec.trimmed(); + } + } + m_ExecutableBlacklist = blacklist.join(";"); + } +} + void SettingsDialog::on_bsaDateBtn_clicked() { IPluginGame const *game diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 386cd24e..911f910d 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#ifndef WORKAROUNDDIALOG_H -#define WORKAROUNDDIALOG_H +#ifndef SETTINGSDIALOG_H +#define SETTINGSDIALOG_H #include "tutorabledialog.h" #include @@ -69,17 +69,22 @@ public: QColor getOverwrittenColor() { return m_OverwrittenColor; } QColor getContainsColor() { return m_ContainsColor; } QColor getContainedColor() { return m_ContainedColor; } + QString getExecutableBlacklist() { return m_ExecutableBlacklist; } void setOverwritingColor(QColor col) { m_OverwritingColor = col; } void setOverwrittenColor(QColor col) { m_OverwrittenColor = col; } void setContainsColor(QColor col) { m_ContainsColor = col; } void setContainedColor(QColor col) { m_ContainedColor = col; } + void setExecutableBlacklist(QString blacklist) { m_ExecutableBlacklist = blacklist; } + private slots: void on_loginCheckBox_toggled(bool checked); void on_categoriesBtn_clicked(); + void on_execBlacklistBtn_clicked(); + void on_bsaDateBtn_clicked(); void on_browseDownloadDirBtn_clicked(); @@ -134,8 +139,10 @@ private: QColor m_OverwrittenColor; QColor m_ContainsColor; QColor m_ContainedColor; + + QString m_ExecutableBlacklist; }; -#endif // WORKAROUNDDIALOG_H +#endif // SETTINGSDIALOG_H diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 555180b5..ae13b9f2 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -17,7 +17,7 @@ - 4 + 5 @@ -1037,6 +1037,26 @@ For the other games this is not a sufficient replacement for AI! + + + + Add executables to the blacklist to prevent them from +accessing the virtual file system. This is useful to prevent +unintended programs from being hooked. Hooking unintended +programs may affect the execution of these programs or the +programs you are intentionally running. + + + Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running. + + + Configure Executables Blacklist + + + false + + + diff --git a/src/usvfsconnector.cpp b/src/usvfsconnector.cpp index 4ffc81c0..9c81d0d9 100644 --- a/src/usvfsconnector.cpp +++ b/src/usvfsconnector.cpp @@ -132,7 +132,11 @@ UsvfsConnector::UsvfsConnector() CreateVFS(¶ms); - BlacklistExecutable(L"TSVNCache.exe"); + ClearExecutableBlacklist(); + for (auto exec : Settings::instance().executablesBlacklist().split(";")) { + std::wstring buf = exec.toStdWString(); + BlacklistExecutable(buf.data()); + } m_LogWorker.moveToThread(&m_WorkerThread); @@ -199,6 +203,11 @@ void UsvfsConnector::updateMapping(const MappingType &mapping) */ } -void UsvfsConnector::updateParams(int logLevel, int crashDumpsType) { +void UsvfsConnector::updateParams(int logLevel, int crashDumpsType, QString executableBlacklist) { USVFSUpdateParams(::logLevel(logLevel), ::crashDumpsType(crashDumpsType)); + ClearExecutableBlacklist(); + for (auto exec : executableBlacklist.split(";")) { + std::wstring buf = exec.toStdWString(); + BlacklistExecutable(buf.data()); + } } diff --git a/src/usvfsconnector.h b/src/usvfsconnector.h index 40f8857b..3aefb703 100644 --- a/src/usvfsconnector.h +++ b/src/usvfsconnector.h @@ -82,7 +82,7 @@ public: ~UsvfsConnector(); void updateMapping(const MappingType &mapping); - void updateParams(int logLevel, int crashDumpsType); + void updateParams(int logLevel, int crashDumpsType, QString executableBlacklist); private: -- cgit v1.3.1 From 4566b51093c9dfe0afbfa33020cffebca7a99aa3 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 29 Nov 2018 15:23:25 -0600 Subject: Set general settings tab as the default again --- src/settingsdialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index ae13b9f2..a6c6a03b 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -17,7 +17,7 @@ - 5 + 0 -- cgit v1.3.1 From 9431597e6683ed74285e78057145f5ff6d326bb9 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 29 Nov 2018 15:33:47 -0600 Subject: Correct comparison logic for blacklist warning --- src/organizercore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 9ac3cb63..4dbe7c86 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1340,7 +1340,7 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary, } for (auto exec : settings().executablesBlacklist().split(";")) { - if (exec.compare(binary.fileName(), Qt::CaseInsensitive)) { + if (exec.compare(binary.fileName(), Qt::CaseInsensitive) == 0) { if (QuestionBoxMemory::query(window, QString("blacklistedExecutable"), binary.fileName(), tr("Blacklisted Executable"), tr("The executable you are attempted to launch is blacklisted in the virtual file" -- cgit v1.3.1 From c9658e1a65097434867819a2b9c18531e32d7d75 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 1 Dec 2018 23:23:28 +0100 Subject: * Added Folders and Files icons to Data tab. * Fixed empty folders not showing up in Data tab. --- src/mainwindow.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9a0e02aa..e0064ce2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -106,6 +106,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include #include @@ -1147,7 +1148,9 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly) { + QFileIconProvider *iconProvider = new QFileIconProvider(); { + for (const FileEntry::Ptr current : directoryEntry.getFiles()) { if (conflictsOnly && (current->getAlternatives().size() == 0)) { continue; @@ -1183,6 +1186,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director fileChild->setFont(1, font); } fileChild->setData(0, Qt::UserRole, ToQString(current->getFullPath())); + fileChild->setData(0, Qt::DecorationRole, iconProvider->icon(QFileIconProvider::File)); fileChild->setData(0, Qt::UserRole + 1, isArchive); fileChild->setData(1, Qt::UserRole, source); fileChild->setData(1, Qt::UserRole + 1, originID); @@ -1219,6 +1223,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director columns.append(""); if (!(*current)->isEmpty()) { QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); + directoryChild->setData(0, Qt::DecorationRole, iconProvider->icon(QFileIconProvider::Folder)); if (conflictsOnly) { updateTo(directoryChild, temp.str(), **current, conflictsOnly); if (directoryChild->childCount() != 0) { @@ -1235,6 +1240,11 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director subTree->addChild(directoryChild); } } + else { + QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); + directoryChild->setData(0, Qt::DecorationRole, iconProvider->icon(QFileIconProvider::Folder)); + subTree->addChild(directoryChild); + } } } @@ -1339,6 +1349,7 @@ void MainWindow::refreshDataTree() QStringList columns("data"); columns.append(""); QTreeWidgetItem *subTree = new QTreeWidgetItem(columns); + subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked()); tree->insertTopLevelItem(0, subTree); subTree->setExpanded(true); @@ -1363,6 +1374,7 @@ void MainWindow::refreshDataTreeKeepExpandedNodes() QStringList columns("data"); columns.append(""); QTreeWidgetItem *subTree = new QTreeWidgetItem(columns); + subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked()); tree->insertTopLevelItem(0, subTree); subTree->setExpanded(true); -- cgit v1.3.1 From f1384cdfa7f6affc5a2a66e78e7514662ee6c4ea Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 2 Dec 2018 12:48:16 +0100 Subject: Fixed context menu for Data tab showing the File version for empty folders. --- src/mainwindow.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e0064ce2..704ce838 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1148,9 +1148,8 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly) { - QFileIconProvider *iconProvider = new QFileIconProvider(); - { - + bool isDirectory = false; + { for (const FileEntry::Ptr current : directoryEntry.getFiles()) { if (conflictsOnly && (current->getAlternatives().size() == 0)) { continue; @@ -1186,7 +1185,8 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director fileChild->setFont(1, font); } fileChild->setData(0, Qt::UserRole, ToQString(current->getFullPath())); - fileChild->setData(0, Qt::DecorationRole, iconProvider->icon(QFileIconProvider::File)); + fileChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::File)); + fileChild->setData(0, Qt::UserRole + 3, isDirectory); fileChild->setData(0, Qt::UserRole + 1, isArchive); fileChild->setData(1, Qt::UserRole, source); fileChild->setData(1, Qt::UserRole + 1, originID); @@ -1215,6 +1215,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director std::wostringstream temp; temp << directorySoFar << "\\" << directoryEntry.getName(); { + isDirectory = true; std::vector::const_iterator current, end; directoryEntry.getSubDirectories(current, end); for (; current != end; ++current) { @@ -1223,7 +1224,9 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director columns.append(""); if (!(*current)->isEmpty()) { QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, iconProvider->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::UserRole + 3, isDirectory); + if (conflictsOnly) { updateTo(directoryChild, temp.str(), **current, conflictsOnly); if (directoryChild->childCount() != 0) { @@ -1242,7 +1245,8 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director } else { QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, iconProvider->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::UserRole + 3, isDirectory); subTree->addChild(directoryChild); } } @@ -4570,7 +4574,8 @@ void MainWindow::on_dataTree_customContextMenuRequested(const QPoint &pos) m_ContextItem = dataTree->itemAt(pos.x(), pos.y()); QMenu menu; - if ((m_ContextItem != nullptr) && (m_ContextItem->childCount() == 0)) { + if ((m_ContextItem != nullptr) && (m_ContextItem->childCount() == 0) + && (m_ContextItem->data(0, Qt::UserRole + 3).toBool() != true)) { menu.addAction(tr("Open/Execute"), this, SLOT(openDataFile())); menu.addAction(tr("Add as Executable"), this, SLOT(addAsExecutable())); -- cgit v1.3.1 From c0b55690bc47102459ef7b1720d69945d6523d08 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 2 Dec 2018 20:26:26 -0600 Subject: Add "send to separator..." option for mods --- src/CMakeLists.txt | 3 ++ src/listdialog.cpp | 46 ++++++++++++++++++++++++++ src/listdialog.h | 25 ++++++++++++++ src/listdialog.ui | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mainwindow.cpp | 57 +++++++++++++++++++++++++++++--- src/mainwindow.h | 1 + src/organizer.pro | 9 +++-- 7 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 src/listdialog.cpp create mode 100644 src/listdialog.h create mode 100644 src/listdialog.ui (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 372b9519..3f004ddc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -91,6 +91,7 @@ SET(organizer_SRCS usvfsconnector.cpp eventfilter.cpp moshortcut.cpp + listdialog.cpp shared/windows_error.cpp shared/error_report.cpp @@ -185,6 +186,7 @@ SET(organizer_HDRS eventfilter.h descriptionpage.h moshortcut.h + listdialog.h shared/windows_error.h shared/error_report.h @@ -225,6 +227,7 @@ SET(organizer_UIS previewdialog.ui browserdialog.ui aboutdialog.ui + listdialog.ui ) SET(organizer_QRCS diff --git a/src/listdialog.cpp b/src/listdialog.cpp new file mode 100644 index 00000000..4acfa5de --- /dev/null +++ b/src/listdialog.cpp @@ -0,0 +1,46 @@ +/* +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see . +*/ + +#include "listdialog.h" +#include "ui_listdialog.h" + +ListDialog::ListDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::ListDialog) +{ + ui->setupUi(this); +} + +ListDialog::~ListDialog() +{ + delete ui; +} + +void ListDialog::setChoices(QStringList choices) +{ + ui->listWidget->clear(); + ui->listWidget->addItems(choices); +} + +QString ListDialog::getChoice() const +{ + if (ui->listWidget->selectedItems().length()) { + return ui->listWidget->currentItem()->text(); + } else { + return ""; + } +} diff --git a/src/listdialog.h b/src/listdialog.h new file mode 100644 index 00000000..5e826a30 --- /dev/null +++ b/src/listdialog.h @@ -0,0 +1,25 @@ +#ifndef LISTDIALOG_H +#define LISTDIALOG_H + +#include + +namespace Ui { +class ListDialog; +} + +class ListDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ListDialog(QWidget *parent = nullptr); + ~ListDialog(); + + void setChoices(QStringList choices); + QString getChoice() const; + +private: + Ui::ListDialog *ui; +}; + +#endif // LISTDIALOG_H diff --git a/src/listdialog.ui b/src/listdialog.ui new file mode 100644 index 00000000..38819c87 --- /dev/null +++ b/src/listdialog.ui @@ -0,0 +1,96 @@ + + + ListDialog + + + + 0 + 0 + 260 + 340 + + + + Dialog + + + + + 90 + 299 + 161 + 32 + + + + Qt::LeftToRight + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 10 + 240 + 280 + + + + + 0 + 0 + + + + + 240 + 280 + + + + QAbstractItemView::ScrollPerPixel + + + + + + + buttonBox + accepted() + ListDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ListDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 704ce838..44fc0bf3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -85,6 +85,7 @@ along with Mod Organizer. If not, see . #include #include #include "localsavegames.h" +#include "listdialog.h" #include #include @@ -1149,7 +1150,7 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly) { bool isDirectory = false; - { + { for (const FileEntry::Ptr current : directoryEntry.getFiles()) { if (conflictsOnly && (current->getAlternatives().size() == 0)) { continue; @@ -3721,6 +3722,7 @@ void MainWindow::addModSendToContextMenu(QMenu *menu) sub_menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); sub_menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); sub_menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); + sub_menu->addAction(tr("Separator..."), this, SLOT(sendSelectedModsToSeparator_clicked())); menu->addMenu(sub_menu); menu->addSeparator(); @@ -4574,7 +4576,7 @@ void MainWindow::on_dataTree_customContextMenuRequested(const QPoint &pos) m_ContextItem = dataTree->itemAt(pos.x(), pos.y()); QMenu menu; - if ((m_ContextItem != nullptr) && (m_ContextItem->childCount() == 0) + if ((m_ContextItem != nullptr) && (m_ContextItem->childCount() == 0) && (m_ContextItem->data(0, Qt::UserRole + 3).toBool() != true)) { menu.addAction(tr("Open/Execute"), this, SLOT(openDataFile())); menu.addAction(tr("Add as Executable"), this, SLOT(addAsExecutable())); @@ -5673,8 +5675,8 @@ void MainWindow::sendSelectedModsToPriority(int newPriority) QItemSelectionModel *selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { std::vector modsToMove; - for (QModelIndex idx : selection->selectedRows()) { - modsToMove.push_back(idx.data().toInt()); + for (auto idx : selection->selectedRows(ModList::COL_PRIORITY)) { + modsToMove.push_back(m_OrganizerCore.currentProfile()->modIndexByPriority(idx.data().toInt())); } m_OrganizerCore.modList()->changeModPriority(modsToMove, newPriority); } else { @@ -5702,3 +5704,50 @@ void MainWindow::sendSelectedModsToPriority_clicked() sendSelectedModsToPriority(newPriority); } + +void MainWindow::sendSelectedModsToSeparator_clicked() +{ + QStringList separators; + for (auto mod : m_OrganizerCore.modList()->allMods()) { + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(mod)); + if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR)) { + separators << mod.chopped(10); + } + } + + ListDialog dialog(this); + dialog.setChoices(separators); + if (dialog.exec() == QDialog::Accepted) { + QString result = dialog.getChoice(); + if (!result.isEmpty()) { + result += "_separator"; + + int newPriority = INT_MAX; + bool foundSection = false; + for (auto mod : m_OrganizerCore.modsSortedByProfilePriority()) { + unsigned int modIndex = ModInfo::getIndex(mod); + ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex); + if (!foundSection && result.compare(mod) == 0) { + foundSection = true; + } else if (foundSection && modInfo->hasFlag(ModInfo::FLAG_SEPARATOR)) { + newPriority = m_OrganizerCore.currentProfile()->getModPriority(modIndex); + break; + } + } + + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + std::vector modsToMove; + for (QModelIndex idx : selection->selectedRows(ModList::COL_PRIORITY)) { + modsToMove.push_back(m_OrganizerCore.currentProfile()->modIndexByPriority(idx.data().toInt())); + } + m_OrganizerCore.modList()->changeModPriority(modsToMove, newPriority); + } else { + int oldPriority = m_OrganizerCore.currentProfile()->getModPriority(m_ContextRow); + if (oldPriority < newPriority) + --newPriority; + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, newPriority); + } + } + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 06219a5a..62ffe3de 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -431,6 +431,7 @@ private slots: void sendSelectedModsToTop_clicked(); void sendSelectedModsToBottom_clicked(); void sendSelectedModsToPriority_clicked(); + void sendSelectedModsToSeparator_clicked(); // savegame context menu void deleteSavegame_clicked(); void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets); diff --git a/src/organizer.pro b/src/organizer.pro index 0ef2638b..582fde9f 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -91,7 +91,8 @@ SOURCES += \ modinforegular.cpp \ modinfobackup.cpp \ modinfooverwrite.cpp \ - modinfoforeign.cpp + modinfoforeign.cpp \ + listdialog.cpp HEADERS += \ @@ -167,7 +168,8 @@ HEADERS += \ modinforegular.h \ modinfobackup.h \ modinfooverwrite.h \ - modinfoforeign.h + modinfoforeign.h \ + listdialog.h FORMS += \ transfersavesdialog.ui \ @@ -196,7 +198,8 @@ FORMS += \ problemsdialog.ui \ previewdialog.ui \ browserdialog.ui \ - aboutdialog.ui + aboutdialog.ui \ + listdialog.ui RESOURCES += \ resources.qrc \ -- cgit v1.3.1 From 87292ca30fd628c29e3acdc7a9fb40eba3eb9ff4 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 2 Dec 2018 22:07:58 -0600 Subject: Add filter to "send to separator..." dialog --- src/listdialog.cpp | 46 ++++- src/listdialog.h | 16 +- src/listdialog.ui | 37 +++- src/organizer_en.ts | 540 +++++++++++++++++++++++++++------------------------- 4 files changed, 356 insertions(+), 283 deletions(-) (limited to 'src') diff --git a/src/listdialog.cpp b/src/listdialog.cpp index 4acfa5de..52bba80d 100644 --- a/src/listdialog.cpp +++ b/src/listdialog.cpp @@ -18,29 +18,57 @@ along with Mod Organizer. If not, see . #include "listdialog.h" #include "ui_listdialog.h" -ListDialog::ListDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ListDialog) +ListDialog::ListDialog(QWidget *parent) + : QDialog(parent) + , ui(new Ui::ListDialog) + , m_Choices() { - ui->setupUi(this); + ui->setupUi(this); + ui->filterEdit->setFocus(); } ListDialog::~ListDialog() { - delete ui; + delete ui; } void ListDialog::setChoices(QStringList choices) { - ui->listWidget->clear(); - ui->listWidget->addItems(choices); + m_Choices = choices; + ui->choiceList->clear(); + ui->choiceList->addItems(m_Choices); } QString ListDialog::getChoice() const { - if (ui->listWidget->selectedItems().length()) { - return ui->listWidget->currentItem()->text(); + if (ui->choiceList->selectedItems().length()) { + return ui->choiceList->currentItem()->text(); } else { return ""; } } + +void ListDialog::on_filterEdit_textChanged(QString filter) +{ + QStringList newChoices; + for (auto choice : m_Choices) { + if (choice.contains(filter, Qt::CaseInsensitive)){ + newChoices << choice; + } + } + ui->choiceList->clear(); + ui->choiceList->addItems(newChoices); + + if (newChoices.length() == 1) { + QListWidgetItem *item = ui->choiceList->item(0); + ui->choiceList->setItemSelected(item, true); + ui->choiceList->setCurrentItem(item); + } + + if (!filter.isEmpty()) { + ui->choiceList->setStyleSheet("QListWidget { border: 2px ridge #f00; }"); + } else { + ui->choiceList->setStyleSheet(""); + } +} + diff --git a/src/listdialog.h b/src/listdialog.h index 5e826a30..7b5a5461 100644 --- a/src/listdialog.h +++ b/src/listdialog.h @@ -9,17 +9,21 @@ class ListDialog; class ListDialog : public QDialog { - Q_OBJECT + Q_OBJECT public: - explicit ListDialog(QWidget *parent = nullptr); - ~ListDialog(); + explicit ListDialog(QWidget *parent = nullptr); + ~ListDialog(); - void setChoices(QStringList choices); - QString getChoice() const; + void setChoices(QStringList choices); + QString getChoice() const; + +public slots: + void on_filterEdit_textChanged(QString filter); private: - Ui::ListDialog *ui; + Ui::ListDialog *ui; + QStringList m_Choices; }; #endif // LISTDIALOG_H diff --git a/src/listdialog.ui b/src/listdialog.ui index 38819c87..032bc131 100644 --- a/src/listdialog.ui +++ b/src/listdialog.ui @@ -7,18 +7,18 @@ 0 0 260 - 340 + 380 - Dialog + Select an item... - 90 - 299 - 161 + 10 + 345 + 240 32 @@ -32,13 +32,13 @@ QDialogButtonBox::Cancel|QDialogButtonBox::Ok - + 10 10 240 - 280 + 300 @@ -57,7 +57,30 @@ QAbstractItemView::ScrollPerPixel + + + + 10 + 320 + 240 + 20 + + + + + + + Filter + + + + + MOBase::LineEditClear + QLineEdit +
    lineeditclear.h
    +
    +
    diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 518e49bc..191058ed 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1442,6 +1442,19 @@ This is likely due to a corrupted or incompatible download or unrecognized archi
    + + ListDialog + + + Dialog + + + + + Filter + + + LockedDialog @@ -1607,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1771,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1956,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1967,7 +1980,7 @@ p, li { white-space: pre-wrap; } - + No Problems @@ -1997,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2017,788 +2030,793 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + + Separator... + + + + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2806,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2819,335 +2837,335 @@ 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Set the priority of the selected mods @@ -5425,18 +5443,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 79c451bb170c15d19f0d0f71a9e1d86fb843b641 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Mon, 3 Dec 2018 06:04:16 -0600 Subject: Improvements to "send to separator..." dialog * Scale contents with dialog size * Save and restore dialog geometry * Add a better window title --- src/listdialog.ui | 104 +++++++++++++++++++++++------------------------------ src/mainwindow.cpp | 6 ++++ 2 files changed, 50 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/listdialog.ui b/src/listdialog.ui index 032bc131..7aa3eba0 100644 --- a/src/listdialog.ui +++ b/src/listdialog.ui @@ -13,66 +13,50 @@ Select an item... - - - - 10 - 345 - 240 - 32 - - - - Qt::LeftToRight - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 10 - 10 - 240 - 300 - - - - - 0 - 0 - - - - - 240 - 280 - - - - QAbstractItemView::ScrollPerPixel - - - - - - 10 - 320 - 240 - 20 - - - - - - - Filter - - + + + + + + 0 + 0 + + + + + 240 + 280 + + + + QAbstractItemView::ScrollPerPixel + + + + + + + + + + Filter + + + + + + + Qt::LeftToRight + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 44fc0bf3..f68d9846 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -5716,7 +5716,12 @@ void MainWindow::sendSelectedModsToSeparator_clicked() } ListDialog dialog(this); + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QString key = QString("geometry/%1").arg(dialog.objectName()); + + dialog.setWindowTitle("Select a separator..."); dialog.setChoices(separators); + dialog.restoreGeometry(settings.value(key).toByteArray()); if (dialog.exec() == QDialog::Accepted) { QString result = dialog.getChoice(); if (!result.isEmpty()) { @@ -5750,4 +5755,5 @@ void MainWindow::sendSelectedModsToSeparator_clicked() } } } + settings.setValue(key, dialog.saveGeometry()); } -- cgit v1.3.1 From 40919c15203acd106e6451de14bf1cd6c9a162fc Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 4 Dec 2018 18:08:39 -0600 Subject: Create empty mods above the selected mod --- src/mainwindow.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f68d9846..3f88f5ad 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2861,12 +2861,21 @@ void MainWindow::createEmptyMod_clicked() return; } + int newPriority = -1; + if (m_ContextRow >= 0 && m_ModListSortProxy->sortColumn() == ModList::COL_PRIORITY) { + newPriority = m_OrganizerCore.currentProfile()->getModPriority(m_ContextRow); + } + IModInterface *newMod = m_OrganizerCore.createMod(name); if (newMod == nullptr) { return; } m_OrganizerCore.refreshModList(); + + if (newPriority >= 0) { + m_OrganizerCore.modList()->changeModPriority(ModInfo::getIndex(name), newPriority); + } } void MainWindow::createSeparator_clicked() -- cgit v1.3.1 From 25448ef076439062a54702d2db226f5a1faea9fb Mon Sep 17 00:00:00 2001 From: Al12rs Date: Wed, 5 Dec 2018 22:50:03 +0100 Subject: * Changed "Local game settings" to "Use profile-specific Game INI files". * Added tooltip to the option explaining what it does since it was missing. * Improved Local Savegames text and tooltip as well. --- src/profilesdialog.ui | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/profilesdialog.ui b/src/profilesdialog.ui index 9b4e7e62..a1d7497e 100644 --- a/src/profilesdialog.ui +++ b/src/profilesdialog.ui @@ -35,20 +35,26 @@ p, li { white-space: pre-wrap; } - If checked, savegames are local to this profile and will not appear when starting with a different profile. + <html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> If checked, savegames are local to this profile and will not appear when starting with a different profile. - Local Savegames + Use profile-specific Savagemes + + <html><head/><body><p>If checked, MO2 will use a local set of game INI files (configuration and settings files), different from the default ones found in MyGames. This way changes to the INI settings will only affect this profile and the Global INI files can remain vanilla. MO2 will then show the profile INI files to the game instead of the Global ones.</p></body></html> + + + <html><head/><body><p>If checked MO2 will use his own profile-specific game INI files, so that the &quot;Global&quot; ones in MyGames can be left vanilla. This different set of INI files is then offered to the game instead of the default one.</p></body></html> + - Local Game Settings + Use profile-specific Game INI Files false -- cgit v1.3.1 From deb3c5ca21f8baa68204302d0cc5c4ef4d9c1a14 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Wed, 5 Dec 2018 22:57:52 +0100 Subject: Fixed tooltip and "What's this" to better explain INI options. --- src/profileinputdialog.ui | 6 +++--- src/profilesdialog.ui | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/profileinputdialog.ui b/src/profileinputdialog.ui index 76265aa1..55b3b15c 100644 --- a/src/profileinputdialog.ui +++ b/src/profileinputdialog.ui @@ -27,13 +27,13 @@ - If checked, the new profile will use the default game settings. + If checked, the new profile will use the default game INI settings. - If checked, the new profile will use the default game settings instead of the "global" settings. Global settings are the settings you configure when running the game launcher directly, without MO. + If checked, the new profile will use the default game INI settings instead of the "global" settings. Global settings are the settings you configure when running the game launcher directly, without MO. - Default Game Settings + Default Game INI Settings diff --git a/src/profilesdialog.ui b/src/profilesdialog.ui index a1d7497e..784963c8 100644 --- a/src/profilesdialog.ui +++ b/src/profilesdialog.ui @@ -48,10 +48,10 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p>If checked, MO2 will use a local set of game INI files (configuration and settings files), different from the default ones found in MyGames. This way changes to the INI settings will only affect this profile and the Global INI files can remain vanilla. MO2 will then show the profile INI files to the game instead of the Global ones.</p></body></html> + <html><head/><body><p>If checked MO2 will use his own profile-specific game INI files, so that the &quot;Global&quot; ones in MyGames can be left vanilla. This different set of INI files is then offered to the game instead of the default one.</p></body></html> - <html><head/><body><p>If checked MO2 will use his own profile-specific game INI files, so that the &quot;Global&quot; ones in MyGames can be left vanilla. This different set of INI files is then offered to the game instead of the default one.</p></body></html> + <html><head/><body><p>If checked, MO2 will use a local set of game INI files (configuration and settings files), different from the default ones found in MyGames. This way changes to the INI settings will only affect this profile and the Global INI files can remain vanilla. MO2 will then show the profile INI files to the game instead of the Global ones.</p></body></html> Use profile-specific Game INI Files -- cgit v1.3.1 From 849d00521a9797620c019991fda47f3ccffaca60 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 4 Dec 2018 19:09:22 -0600 Subject: Transition profile settings to settings.ini --- src/profile.cpp | 132 +++++++++++++++++++++++++++++++++++--------------------- src/profile.h | 17 ++++++-- 2 files changed, 95 insertions(+), 54 deletions(-) (limited to 'src') diff --git a/src/profile.cpp b/src/profile.cpp index 00818d0b..821be4b4 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -73,9 +73,6 @@ Profile::Profile(const QString &name, IPluginGame const *gamePlugin, bool useDef { QString profilesDir = Settings::instance().getProfileDirectory(); QDir profileBase(profilesDir); - - m_Settings = new QSettings(profileBase.absoluteFilePath("settings.ini")); - QString fixedName = name; if (!fixDirectoryName(fixedName)) { throw MyException(tr("invalid profile name %1").arg(name)); @@ -86,6 +83,9 @@ Profile::Profile(const QString &name, IPluginGame const *gamePlugin, bool useDef } QString fullPath = profilesDir + "/" + fixedName; m_Directory = QDir(fullPath); + m_Settings = new QSettings(m_Directory.absoluteFilePath("settings.ini"), + QSettings::IniFormat); + findProfileSettings(); try { // create files. Needs to happen after m_Directory was set! @@ -119,6 +119,7 @@ Profile::Profile(const QDir &directory, IPluginGame const *gamePlugin) m_Settings = new QSettings(directory.absoluteFilePath("settings.ini"), QSettings::IniFormat); + findProfileSettings(); if (!QFile::exists(m_Directory.filePath("modlist.txt"))) { qWarning("missing modlist.txt in %s", qPrintable(directory.path())); @@ -141,6 +142,7 @@ Profile::Profile(const Profile &reference) { m_Settings = new QSettings(m_Directory.absoluteFilePath("settings.ini"), QSettings::IniFormat); + findProfileSettings(); refreshModStatus(); } @@ -151,6 +153,50 @@ Profile::~Profile() m_ModListWriter.writeImmediately(true); } +void Profile::findProfileSettings() +{ + if (setting("LocalSaves") == QVariant()) { + if (m_Directory.exists("saves")) { + storeSetting("LocalSaves", true); + } else { + if (m_Directory.exists("_saves")) { + m_Directory.rename("_saves", "saves"); + } + storeSetting("LocalSaves", false); + } + } + + if (setting("LocalSettings") == QVariant()) { + QString backupFile = getIniFileName() + "_"; + if (m_Directory.exists(backupFile)) { + storeSetting("LocalSettings", false); + m_Directory.rename(backupFile, getIniFileName()); + } else if (m_Directory.exists(getIniFileName())) { + storeSetting("LocalSettings", true); + } else { + storeSetting("LocalSettings", false); + } + } + + if (setting("AutomaticArchiveInvalidation") == QVariant()) { + BSAInvalidation *invalidation = m_GamePlugin->feature(); + DataArchives *dataArchives = m_GamePlugin->feature(); + bool found = false; + if ((invalidation != nullptr) && (dataArchives != nullptr)) { + for (const QString &archive : dataArchives->archives(this)) { + if (invalidation->isInvalidationBSA(archive)) { + storeSetting("AutomaticArchiveInvalidation", true); + found = true; + break; + } + } + } + if (!found) { + storeSetting("AutomaticArchiveInvalidation", false); + } + } +} + bool Profile::exists() const { return m_Directory.exists(); @@ -658,23 +704,11 @@ bool Profile::invalidationActive(bool *supported) const BSAInvalidation *invalidation = m_GamePlugin->feature(); DataArchives *dataArchives = m_GamePlugin->feature(); - if ((invalidation != nullptr) && (dataArchives != nullptr)) { - if (supported != nullptr) { - *supported = true; - } - - for (const QString &archive : dataArchives->archives(this)) { - if (invalidation->isInvalidationBSA(archive)) { - return true; - } - } - return false; - } else { - if (supported != nullptr) { - *supported = false; - } + if (supported != nullptr) { + *supported = ((invalidation != nullptr) && (dataArchives != nullptr)); } - return false; + + return setting("AutomaticArchiveInvalidation", false).toBool(); } @@ -685,6 +719,8 @@ void Profile::deactivateInvalidation() if (invalidation != nullptr) { invalidation->deactivate(this); } + + storeSetting("AutomaticArchiveInvalidation", false); } @@ -695,66 +731,51 @@ void Profile::activateInvalidation() if (invalidation != nullptr) { invalidation->activate(this); } + + storeSetting("AutomaticArchiveInvalidation", true); } bool Profile::localSavesEnabled() const { - return m_Directory.exists("saves"); + return setting("LocalSaves", false).toBool(); } bool Profile::enableLocalSaves(bool enable) { if (enable) { - if (m_Directory.exists("_saves")) { - m_Directory.rename("_saves", "saves"); - } else { + if (!m_Directory.exists("saves")) { m_Directory.mkdir("saves"); } - } else { + } else { QMessageBox::StandardButton res = QMessageBox::question( - QApplication::activeModalWidget(), tr("Delete savegames?"), - tr("Do you want to delete local savegames? (If you select \"No\", the " - "save games will show up again if you re-enable local savegames)"), - QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, - QMessageBox::Cancel); + QApplication::activeModalWidget(), tr("Delete savegames?"), + tr("Do you want to delete local savegames? (If you select \"No\", the " + "save games will show up again if you re-enable local savegames)"), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, + QMessageBox::Cancel); if (res == QMessageBox::Yes) { shellDelete(QStringList(m_Directory.absoluteFilePath("saves"))); } else if (res == QMessageBox::No) { - m_Directory.rename("saves", "_saves"); + // No action } else { return false; } } - - // default: assume success + storeSetting("LocalSaves", enable); return true; + } bool Profile::localSettingsEnabled() const { - return m_Directory.exists(getIniFileName()); + return setting("LocalSettings", false).toBool(); } bool Profile::enableLocalSettings(bool enable) { - // TODO: this currently assumes game settings are stored in an ini file. - // This shall become very interesting when a game stores its settings in the - // registry - QString backupFile = getIniFileName() + "_"; - if (enable) { - if (m_Directory.exists(backupFile)) { - - shellRename(backupFile, getIniFileName()); - } else { - IPluginGame *game = qApp->property("managed_game").value(); - game->initializeProfile(m_Directory, IPluginGame::CONFIGURATION); - } - } else { - shellRename(getIniFileName(), backupFile); - } - + storeSetting("LocalSettings", enable); return true; } @@ -817,22 +838,33 @@ void Profile::rename(const QString &newName) } QVariant Profile::setting(const QString §ion, const QString &name, - const QVariant &fallback) + const QVariant &fallback) const { return m_Settings->value(section + "/" + name, fallback); } + void Profile::storeSetting(const QString §ion, const QString &name, const QVariant &value) { m_Settings->setValue(section + "/" + name, value); } +void Profile::storeSetting(const QString &name, const QVariant &value) +{ + storeSetting("", name, value); +} + void Profile::removeSetting(const QString §ion, const QString &name) { m_Settings->remove(section + "/" + name); } +void Profile::removeSetting(const QString &name) +{ + removeSetting("", name); +} + int Profile::getPriorityMinimum() const { return m_ModIndexByPriority.begin()->first; diff --git a/src/profile.h b/src/profile.h index 9ddd5b89..a9d68062 100644 --- a/src/profile.h +++ b/src/profile.h @@ -78,6 +78,13 @@ public: ~Profile(); + /** + * Determines the default settings for the profile based on the current state of the profile's + * files. This function should remain backwards compatible as much as possible. + **/ + + void findProfileSettings(void); + /** * @return true if this profile (still) exists on disc */ @@ -230,7 +237,7 @@ public: * retrieve the number of mods for which this object has status information. * This is usually the same as ModInfo::getNumMods() except between * calls to ModInfo::updateFromDisc() and the Profile::refreshModStatus() - * + * * @return number of mods for which the profile has status information **/ size_t numMods() const { return m_ModStatus.size(); } @@ -287,12 +294,14 @@ public: void dumpModStatus() const; - QVariant setting(const QString §ion, const QString &name, - const QVariant &fallback = QVariant()); + QVariant setting(const QString §ion, const QString &name = QString(), + const QVariant &fallback = QVariant()) const; void storeSetting(const QString §ion, const QString &name, const QVariant &value); - void removeSetting(const QString §ion, const QString &name); + void storeSetting(const QString &name, const QVariant &value); + void removeSetting(const QString §ion, const QString &name = QString()); + void removeSetting(const QString &name); int getPriorityMinimum() const; -- cgit v1.3.1 From b53be165fde4138bbe3e0ee95326c3ffcbd9c84f Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 6 Dec 2018 02:59:41 -0600 Subject: Savagemes -> Savegames --- src/profilesdialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/profilesdialog.ui b/src/profilesdialog.ui index 784963c8..d33e2283 100644 --- a/src/profilesdialog.ui +++ b/src/profilesdialog.ui @@ -41,7 +41,7 @@ p, li { white-space: pre-wrap; } If checked, savegames are local to this profile and will not appear when starting with a different profile. - Use profile-specific Savagemes + Use profile-specific Savegames -- cgit v1.3.1 From e76891b926e951cf0f7955a618b601cf2eac8ffc Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 6 Dec 2018 03:06:46 -0600 Subject: Update translation file --- src/organizer_en.ts | 472 +++++++++++++++++++++++++++------------------------- 1 file changed, 243 insertions(+), 229 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 191058ed..2ea1c09a 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1446,11 +1446,11 @@ This is likely due to a corrupted or incompatible download or unrecognized archi ListDialog - Dialog + Select an item... - + Filter @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2281,16 +2281,16 @@ Right now this has very limited functionality - - + + failed to rename "%1" to "%2" - - - + + + Confirm @@ -2354,8 +2354,8 @@ Right now this has very limited functionality - - + + Create Mod... @@ -2367,456 +2367,456 @@ Please enter a name: - + A mod with this name already exists - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,335 +2837,335 @@ 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Set the priority of the selected mods @@ -4763,66 +4763,66 @@ p, li { white-space: pre-wrap; } Profile - + invalid profile name %1 - + failed to create %1 - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - + failed to open %1 - + "%1" is missing or inaccessible - - - - - + + + + + invalid index %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 - + Delete savegames? - + Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) @@ -4841,17 +4841,17 @@ p, li { white-space: pre-wrap; } - If checked, the new profile will use the default game settings. + If checked, the new profile will use the default game INI settings. - If checked, the new profile will use the default game settings instead of the "global" settings. Global settings are the settings you configure when running the game launcher directly, without MO. + If checked, the new profile will use the default game INI settings instead of the "global" settings. Global settings are the settings you configure when running the game launcher directly, without MO. - Default Game Settings + Default Game INI Settings @@ -4880,27 +4880,41 @@ p, li { white-space: pre-wrap; } + <html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> + + + If checked, savegames are local to this profile and will not appear when starting with a different profile. - Local Savegames + Use profile-specific Savegames - Local Game Settings + <html><head/><body><p>If checked MO2 will use his own profile-specific game INI files, so that the &quot;Global&quot; ones in MyGames can be left vanilla. This different set of INI files is then offered to the game instead of the default one.</p></body></html> + + + + + <html><head/><body><p>If checked, MO2 will use a local set of game INI files (configuration and settings files), different from the default ones found in MyGames. This way changes to the INI settings will only affect this profile and the Global INI files can remain vanilla. MO2 will then show the profile INI files to the game instead of the Global ones.</p></body></html> - + + Use profile-specific Game INI Files + + + + This ensures data files from mods are actually used. You want to enable this unless you use a different tool for Archive Invalidation. - + <!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; } @@ -4912,65 +4926,65 @@ p, li { white-space: pre-wrap; } - + Automatic Archive Invalidation - - + + Create a new profile from scratch - + Create - + Clone the selected profile - + This creates a new profile with the same settings and active mods as the selected one. - + Copy - - + + Delete the selected Profile. This can not be un-done! - + Remove - + Rename - - + + Transfer save games to the selected profile. - + Transfer Saves - + Close @@ -5449,7 +5463,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> -- cgit v1.3.1 From 02fe0d3384c60b96e85274e94f4c3b344780a0ca Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Fri, 7 Dec 2018 12:52:20 -0600 Subject: Improve refresh of data when changing profile settings --- src/mainwindow.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3f88f5ad..de015c54 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1141,8 +1141,15 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) } LocalSavegames *saveGames = m_OrganizerCore.managedGame()->feature(); - if (saveGames != nullptr && saveGames->updateSaveGames(m_OrganizerCore.currentProfile())) { - refreshSaveList(); + if (saveGames != nullptr) { + if (saveGames->prepareProfile(m_OrganizerCore.currentProfile())) + refreshSaveList(); + } + + BSAInvalidation *invalidation = m_OrganizerCore.managedGame()->feature(); + if (invalidation != nullptr) { + if (invalidation->prepareProfile(m_OrganizerCore.currentProfile())) + QTimer::singleShot(5, &m_OrganizerCore, SLOT(profileRefresh())); } } } @@ -1407,12 +1414,17 @@ QDir MainWindow::currentSavesDir() const if (m_OrganizerCore.currentProfile()->localSavesEnabled()) { savesDir.setPath(m_OrganizerCore.currentProfile()->savePath()); } else { + QString iniPath = m_OrganizerCore.currentProfile()->localSettingsEnabled() + ? m_OrganizerCore.currentProfile()->absolutePath() + : m_OrganizerCore.managedGame()->documentsDirectory().absolutePath(); + iniPath += "/" + m_OrganizerCore.managedGame()->iniFiles()[0]; + wchar_t path[MAX_PATH]; ::GetPrivateProfileStringW( L"General", L"SLocalSavePath", L"Saves", path, MAX_PATH, - ToWString(m_OrganizerCore.currentProfile()->absolutePath() + "/" + - m_OrganizerCore.managedGame()->iniFiles()[0]).c_str()); + iniPath.toStdWString().c_str() + ); savesDir.setPath(m_OrganizerCore.managedGame()->documentsDirectory().absoluteFilePath(QString::fromWCharArray(path))); } @@ -2026,11 +2038,16 @@ void MainWindow::on_actionAdd_Profile_triggered() } LocalSavegames *saveGames = m_OrganizerCore.managedGame()->feature(); - if (saveGames != nullptr && saveGames->updateSaveGames(m_OrganizerCore.currentProfile())) { - refreshSaveList(); + if (saveGames != nullptr) { + if (saveGames->prepareProfile(m_OrganizerCore.currentProfile())) + refreshSaveList(); } -// addProfile(); + BSAInvalidation *invalidation = m_OrganizerCore.managedGame()->feature(); + if (invalidation != nullptr) { + if (invalidation->prepareProfile(m_OrganizerCore.currentProfile())) + QTimer::singleShot(5, &m_OrganizerCore, SLOT(profileRefresh())); + } } void MainWindow::on_actionModify_Executables_triggered() -- cgit v1.3.1 From 4914fd172deffe15631ab37264a1ffda33637e99 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 8 Dec 2018 01:19:37 -0600 Subject: Add workarounds button to reset window geometries --- src/mainwindow.cpp | 34 ++-- src/organizer_en.ts | 527 +++++++++++++++++++++++++------------------------ src/settings.cpp | 11 ++ src/settingsdialog.cpp | 4 + src/settingsdialog.h | 1 + src/settingsdialog.ui | 16 ++ 6 files changed, 323 insertions(+), 270 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index de015c54..84b77945 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1738,21 +1738,31 @@ void MainWindow::processUpdates() { void MainWindow::storeSettings(QSettings &settings) { settings.setValue("group_state", ui->groupCombo->currentIndex()); - - settings.setValue("window_geometry", saveGeometry()); - settings.setValue("window_split", ui->splitter->saveState()); - settings.setValue("log_split", ui->topLevelSplitter->saveState()); - - settings.setValue("browser_geometry", m_IntegratedBrowser.saveGeometry()); - - settings.setValue("filters_visible", ui->displayCategoriesBtn->isChecked()); - settings.setValue("selected_executable", ui->executablesListBox->currentIndex()); - for (const std::pair kv : m_PersistedGeometry) { - QString key = QString("geometry/") + kv.first; - settings.setValue(key, kv.second->saveState()); + if (settings.value("reset_geometry", false).toBool()) { + settings.remove("window_geometry"); + settings.remove("window_split"); + settings.remove("log_split"); + settings.remove("filters_visible"); + settings.remove("browser_geometry"); + settings.beginGroup("geometry"); + for (auto key : settings.childKeys()) { + settings.remove(key); + } + settings.endGroup(); + settings.remove("reset_geometry"); + } else { + settings.setValue("window_geometry", saveGeometry()); + settings.setValue("window_split", ui->splitter->saveState()); + settings.setValue("log_split", ui->topLevelSplitter->saveState()); + settings.setValue("browser_geometry", m_IntegratedBrowser.saveGeometry()); + settings.setValue("filters_visible", ui->displayCategoriesBtn->isChecked()); + for (const std::pair kv : m_PersistedGeometry) { + QString key = QString("geometry/") + kv.first; + settings.setValue(key, kv.second->saveState()); + } } } diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 2ea1c09a..1b752ae5 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2145,678 +2145,678 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,335 +2837,335 @@ 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Set the priority of the selected mods @@ -5462,13 +5462,13 @@ If the folder was still in use, restart MO and try again. - - + + <Manage...> - + failed to parse profile %1: %2 @@ -6268,27 +6268,38 @@ programs you are intentionally running. - + + + Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations. + + + + + Reset Window Geometries + + + + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - + Diagnostics - + Log Level - + Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log". "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6296,37 +6307,37 @@ programs you are intentionally running. - + Debug - + Info (recommended) - + Warning - + Error - + Crash Dumps - + Decides which type of crash dumps are collected when injected processes crash. - + Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6337,37 +6348,37 @@ programs you are intentionally running. - + None - + Mini (recommended) - + Data - + Full - + Max Dumps To Keep - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6375,12 +6386,12 @@ programs you are intentionally running. - + Hint: right click link and copy link location - + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. diff --git a/src/settings.cpp b/src/settings.cpp index c311ef29..3abb0988 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1112,4 +1112,15 @@ void Settings::WorkaroundsTab::update() m_Settings.setValue("Settings/display_foreign", m_displayForeignBox->isChecked()); m_Settings.setValue("Settings/executable_blacklist", m_dialog.getExecutableBlacklist()); + + if (m_dialog.getResetGeometries()) { + m_Settings.setValue("reset_geometry", true); + if (QMessageBox::question(nullptr, + tr("Restart Mod Organizer?"), + tr("In order to reset the window geometries, MO must be restarted.\n" + "Restart it now?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + qApp->exit(INT_MAX); + } + } } diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index e1c4b10d..dec2532c 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -94,6 +94,10 @@ void SettingsDialog::accept() TutorableDialog::accept(); } +bool SettingsDialog::getResetGeometries() +{ + return ui->resetGeometryBtn->isChecked(); +} void SettingsDialog::on_loginCheckBox_toggled(bool checked) { diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 911f910d..95ed288f 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -70,6 +70,7 @@ public: QColor getContainsColor() { return m_ContainsColor; } QColor getContainedColor() { return m_ContainedColor; } QString getExecutableBlacklist() { return m_ExecutableBlacklist; } + bool getResetGeometries(); void setOverwritingColor(QColor col) { m_OverwritingColor = col; } void setOverwrittenColor(QColor col) { m_OverwrittenColor = col; } diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index a6c6a03b..91bfca4e 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -1057,6 +1057,22 @@ programs you are intentionally running. + + + + Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations. + + + Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations. + + + Reset Window Geometries + + + true + + + -- cgit v1.3.1 From c87d97de8c4e15c91f17ab35173ec6f22e80c8e5 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sat, 8 Dec 2018 15:01:01 +0100 Subject: Added missing games to the suggested names list. Imroved dialog description. --- src/instancemanager.cpp | 7 +- src/organizer_en.ts | 529 ++++++++++++++++++++++++------------------------ 2 files changed, 274 insertions(+), 262 deletions(-) (limited to 'src') diff --git a/src/instancemanager.cpp b/src/instancemanager.cpp index 9e785fc4..9066741d 100644 --- a/src/instancemanager.cpp +++ b/src/instancemanager.cpp @@ -137,12 +137,13 @@ QString InstanceManager::queryInstanceName(const QStringList &instanceList) cons QInputDialog dialog; dialog.setWindowTitle(QObject::tr("Enter a Name for the new Instance")); - dialog.setLabelText(QObject::tr("Enter a new name or select one from the suggested list:")); + dialog.setLabelText(QObject::tr("Enter a new name or select one from the suggested list: \n" + "(This is just the name of the Instance, not the game selection)")); // would be neat if we could take the names from the game plugins but // the required initialization order requires the ini file to be // available *before* we load plugins - dialog.setComboBoxItems({ "NewName", "Fallout 4", "SkyrimSE", "Skyrim", "Fallout 3", - "Fallout NV", "FO4VR", "Oblivion" }); + dialog.setComboBoxItems({ "NewName", "Fallout 4", "SkyrimSE", "Skyrim", "SkyrimVR", "Fallout 3", + "Fallout NV", "TTW", "FO4VR", "Oblivion", "Morrowind" }); dialog.setComboBoxEditable(true); if (dialog.exec() == QDialog::Rejected) { diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 1b752ae5..1e699dfe 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2175,648 +2175,648 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,335 +2837,335 @@ 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Set the priority of the selected mods @@ -5463,7 +5463,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> @@ -5753,6 +5753,17 @@ Select Show Details option to see the full change-log. Failed to create "%1", you may not have the necessary permission. path remains unchanged. + + + Restart Mod Organizer? + + + + + In order to reset the window geometries, MO must be restarted. +Restart it now? + + SettingsDialog @@ -6279,27 +6290,27 @@ programs you are intentionally running. - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - + Diagnostics - + Log Level - + Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log". "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6307,37 +6318,37 @@ programs you are intentionally running. - + Debug - + Info (recommended) - + Warning - + Error - + Crash Dumps - + Decides which type of crash dumps are collected when injected processes crash. - + Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6348,37 +6359,37 @@ programs you are intentionally running. - + None - + Mini (recommended) - + Data - + Full - + Max Dumps To Keep - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6386,12 +6397,12 @@ programs you are intentionally running. - + Hint: right click link and copy link location - + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. @@ -6411,12 +6422,12 @@ programs you are intentionally running. - + Executables Blacklist - + Enter one executable per line to be blacklisted from the virtual file system. Mods and other virtualized files will not be visible to these executables and any executables launched by them. @@ -6427,42 +6438,42 @@ Example: - + Select base directory - + Select download directory - + Select mod directory - + Select cache directory - + Select profiles directory - + Select overwrite directory - + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? -- cgit v1.3.1 From c501b5cca081e1b3697904a3b4e1e236ea9c4e69 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 8 Dec 2018 10:37:46 -0600 Subject: Add notes column to mod list --- src/mainwindow.cpp | 4 ++++ src/modinfo.cpp | 2 +- src/modinfo.h | 17 ++++++++++++++--- src/modinfodialog.cpp | 2 ++ src/modinfodialog.ui | 25 ++++++++++++++++++++++++- src/modinfoforeign.h | 2 ++ src/modinfooverwrite.h | 2 ++ src/modinforegular.cpp | 17 +++++++++++++++-- src/modinforegular.h | 12 ++++++++++++ src/modlist.cpp | 24 ++++++++++++++++++++++-- src/modlist.h | 3 ++- 11 files changed, 100 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 84b77945..9a40ce2e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -299,6 +299,7 @@ MainWindow::MainWindow(QSettings &initSettings ui->modList->header()->setSectionHidden(ModList::COL_MODID, true); ui->modList->header()->setSectionHidden(ModList::COL_GAME, true); ui->modList->header()->setSectionHidden(ModList::COL_INSTALLTIME, true); + ui->modList->header()->setSectionHidden(ModList::COL_NOTES, true); } ui->modList->header()->setSectionHidden(ModList::COL_NAME, false); // prevent the name-column from being hidden @@ -1726,6 +1727,9 @@ void MainWindow::processUpdates() { lastHidden = hidden; } } + if (lastVersion < QVersionNumber(2,1,6)) { + ui->modList->header()->setSectionHidden(ModList::COL_NOTES, true); + } } if (currentVersion > lastVersion) diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 4c41a114..1c6139f6 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -104,7 +104,7 @@ QString ModInfo::getContentTypeName(int contentType) case CONTENT_SOUND: return tr("Sound Effects"); case CONTENT_SCRIPT: return tr("Scripts"); case CONTENT_SKSE: return tr("Script Extender"); - case CONTENT_SKSEFILES: return tr("Script Extender Files"); + case CONTENT_SKSEFILES: return tr("Script Extender Files"); case CONTENT_SKYPROC: return tr("SkyProc Tools"); case CONTENT_MCM: return tr("MCM Data"); case CONTENT_INI: return tr("INI files"); diff --git a/src/modinfo.h b/src/modinfo.h index 235fb50c..5a69185d 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -44,7 +44,7 @@ namespace MOShared { class DirectoryEntry; } /** * @brief Represents meta information about a single mod. - * + * * Represents meta information about a single mod. The class interface is used * to manage the mod collection * @@ -85,7 +85,7 @@ public: CONTENT_SOUND, CONTENT_SCRIPT, CONTENT_SKSE, - CONTENT_SKSEFILES, + CONTENT_SKSEFILES, CONTENT_SKYPROC, CONTENT_MCM, CONTENT_INI, @@ -268,6 +268,12 @@ public: **/ virtual void setCategory(int categoryID, bool active) = 0; + /** + * @brief changes the comments (manually set information displayed in the mod list) for this mod + * @param comments new comments + */ + virtual void setComments(const QString &comments) = 0; + /** * @brief change the notes (manually set information) for this mod * @param notes new notes @@ -495,6 +501,11 @@ public: */ virtual QString getDescription() const = 0; + /** + * @return comments for this mod + */ + virtual QString comments() const = 0; + /** * @return notes for this mod */ @@ -526,7 +537,7 @@ public: virtual QStringList archives() const = 0; /* - *@return the color choosen by the user for the mod/separator + *@return the color choosen by the user for the mod/separator */ virtual QColor getColor() { return QColor(); } diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 54910e41..416eca58 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -112,6 +112,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo } ui->sourceGameEdit->setCurrentIndex(ui->sourceGameEdit->findData(gameName)); + ui->commentsEdit->setText(modInfo->comments()); ui->notesEdit->setText(modInfo->notes()); ui->descriptionView->setPage(new DescriptionPage); @@ -189,6 +190,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ModInfoDialog::~ModInfoDialog() { + m_ModInfo->setComments(ui->commentsEdit->text()); m_ModInfo->setNotes(ui->notesEdit->toPlainText()); saveCategories(ui->categoriesTree->invisibleRootItem()); saveIniTweaks(); // ini tweaks are written to the ini file directly. This is the only information not managed by ModInfo diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index b3873bf3..671c7f31 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -782,7 +782,30 @@ p, li { white-space: pre-wrap; } - + + + Enter comments about the mod here. These are displayed in the notes column of the mod list. + + + Enter comments about the mod here. These are displayed in the notes column of the mod list. + + + Enter comments about the mod here. These are displayed in the notes column of the mod list. + + + + + + + Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column. + + + Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column. + + + Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column. + + diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h index 0d7b3847..93061294 100644 --- a/src/modinfoforeign.h +++ b/src/modinfoforeign.h @@ -18,6 +18,7 @@ public: virtual bool updateNXMInfo() { return false; } virtual void setCategory(int, bool) {} virtual bool setName(const QString&) { return false; } + virtual void setComments(const QString&) {} virtual void setNotes(const QString&) {} virtual void setGameName(QString) {} virtual void setNexusID(int) {} @@ -33,6 +34,7 @@ public: virtual bool isEmpty() const { return false; } virtual QString name() const; virtual QString internalName() const { return name(); } + virtual QString comments() const { return ""; } virtual QString notes() const { return ""; } virtual QDateTime creationTime() const; virtual QString absolutePath() const; diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h index 5681dc6f..4b98d715 100644 --- a/src/modinfooverwrite.h +++ b/src/modinfooverwrite.h @@ -20,6 +20,7 @@ public: virtual bool updateNXMInfo() { return false; } virtual void setCategory(int, bool) {} virtual bool setName(const QString&) { return false; } + virtual void setComments(const QString&) {} virtual void setNotes(const QString&) {} virtual void setGameName(QString) {} virtual void setNexusID(int) {} @@ -35,6 +36,7 @@ public: virtual bool alwaysEnabled() const { return true; } virtual bool isEmpty() const; virtual QString name() const { return "Overwrite"; } + virtual QString comments() const { return ""; } virtual QString notes() const { return ""; } virtual QDateTime creationTime() const { return QDateTime(); } virtual QString absolutePath() const; diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index d0f56a52..6a52d3df 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -76,6 +76,7 @@ bool ModInfoRegular::isEmpty() const void ModInfoRegular::readMeta() { QSettings metaFile(m_Path + "/meta.ini", QSettings::IniFormat); + m_Comments = metaFile.value("comments", "").toString(); m_Notes = metaFile.value("notes", "").toString(); QString tempGameName = metaFile.value("gameName", m_GameName).toString(); if (tempGameName.size()) m_GameName = tempGameName; @@ -148,6 +149,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("repository", m_Repository); metaFile.setValue("gameName", m_GameName); metaFile.setValue("modid", m_NexusID); + metaFile.setValue("comments", m_Comments); metaFile.setValue("notes", m_Notes); metaFile.setValue("nexusDescription", m_NexusDescription); metaFile.setValue("url", m_URL); @@ -324,6 +326,12 @@ bool ModInfoRegular::setName(const QString &name) return true; } +void ModInfoRegular::setComments(const QString &comments) +{ + m_Comments = comments; + m_MetaInfoChanged = true; +} + void ModInfoRegular::setNotes(const QString ¬es) { m_Notes = notes; @@ -405,7 +413,7 @@ void ModInfoRegular::setColor(QColor color) m_MetaInfoChanged = true; } -QColor ModInfoRegular::getColor() +QColor ModInfoRegular::getColor() { return m_Color; } @@ -510,7 +518,7 @@ std::vector ModInfoRegular::getContents() const if (sePluginDir.entryList(QStringList() << "*.dll").size() > 0) { m_CachedContent.push_back(CONTENT_SKSE); } - } + } } if (dir.exists("textures") || dir.exists("icons") || dir.exists("bookart")) m_CachedContent.push_back(CONTENT_TEXTURE); @@ -567,6 +575,11 @@ QString ModInfoRegular::getDescription() const } } +QString ModInfoRegular::comments() const +{ + return m_Comments; +} + QString ModInfoRegular::notes() const { return m_Notes; diff --git a/src/modinforegular.h b/src/modinforegular.h index 78a6e58a..33b26998 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -90,6 +90,12 @@ public: **/ bool setName(const QString &name); + /** + * @brief changes the comments (manually set information displayed in the mod list) for this mod + * @param comments new comments + */ + void setComments(const QString &comments); + /** * @brief change the notes (manually set information) for this mod * @param notes new notes @@ -279,6 +285,11 @@ public: */ virtual QString getDescription() const; + /** + * @return comments for this mod + */ + virtual QString comments() const; + /** * @return manually set notes for this mod */ @@ -353,6 +364,7 @@ private: QString m_Name; QString m_Path; QString m_InstallationFile; + QString m_Comments; QString m_Notes; QString m_NexusDescription; QString m_Repository; diff --git a/src/modlist.cpp b/src/modlist.cpp index 7ca0667a..547cc853 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -150,7 +150,14 @@ QString ModList::getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const case ModInfo::FLAG_SEPARATOR: return tr("Separator"); case ModInfo::FLAG_INVALID: return tr("No valid game data"); case ModInfo::FLAG_NOTENDORSED: return tr("Not endorsed yet"); - case ModInfo::FLAG_NOTES: return QString("%1").arg(modInfo->notes().replace("\n", "
    ")); + case ModInfo::FLAG_NOTES: { + QStringList output; + if (!modInfo->comments().isEmpty()) + output << QString("%1").arg(modInfo->comments()); + if (!modInfo->notes().isEmpty()) + output << QString("%1").arg(modInfo->notes()).replace("\n", "
    "); + return output.join("
    "); + } case ModInfo::FLAG_CONFLICT_OVERWRITE: return tr("Overwrites files"); case ModInfo::FLAG_CONFLICT_OVERWRITTEN: return tr("Overwritten files"); case ModInfo::FLAG_CONFLICT_MIXED: return tr("Overwrites & Overwritten"); @@ -276,6 +283,8 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } else { return QVariant(); } + } else if (column == COL_NOTES) { + return modInfo->comments(); } else { return tr("invalid"); } @@ -295,6 +304,8 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } } else if (column == COL_VERSION) { return QVariant(Qt::AlignRight | Qt::AlignVCenter); + } else if (column == COL_NOTES) { + return QVariant(Qt::AlignLeft | Qt::AlignVCenter); } else { return QVariant(Qt::AlignCenter | Qt::AlignVCenter); } @@ -443,6 +454,8 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } return ToQString(categoryString.str()); + } else if (column == COL_NOTES) { + return getFlagText(ModInfo::FLAG_NOTES, modInfo); } else { return QVariant(); } @@ -559,6 +572,10 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role) result = false; } } break; + case COL_NOTES: { + info->setComments(value.toString()); + result = true; + } break; default: { qWarning("edit on column \"%s\" not supported", getColumnName(index.column()).toUtf8().constData()); @@ -625,7 +642,8 @@ Qt::ItemFlags ModList::flags(const QModelIndex &modelIndex) const (modelIndex.column() == COL_MODID)) { result |= Qt::ItemIsEditable; } - if ((modelIndex.column() == COL_NAME) + if (((modelIndex.column() == COL_NAME) || + (modelIndex.column() == COL_NOTES)) && (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) == flags.end())) { result |= Qt::ItemIsEditable; } @@ -1147,6 +1165,7 @@ QString ModList::getColumnName(int column) case COL_GAME: return tr("Source Game"); case COL_MODID: return tr("Nexus ID"); case COL_INSTALLTIME: return tr("Installation"); + case COL_NOTES: return tr("Notes"); default: return tr("unknown"); } } @@ -1182,6 +1201,7 @@ QString ModList::getColumnToolTip(int column) ""); case COL_INSTALLTIME: return tr("Time this mod was installed"); + case COL_NOTES: return tr("User notes about the mod"); default: return tr("unknown"); } } diff --git a/src/modlist.h b/src/modlist.h index 8de08da3..42269386 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -65,8 +65,9 @@ public: COL_VERSION, COL_INSTALLTIME, COL_PRIORITY, + COL_NOTES, - COL_LASTCOLUMN = COL_PRIORITY + COL_LASTCOLUMN = COL_NOTES }; typedef boost::signals2::signal SignalModStateChanged; -- cgit v1.3.1 From a94977988bb587a290ae8c448baf742ed1eee79f Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 8 Dec 2018 10:42:30 -0600 Subject: Move the mod info separator flag to the end as it's hidden --- src/modinfoseparator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/modinfoseparator.cpp b/src/modinfoseparator.cpp index 60014f66..58c8310a 100644 --- a/src/modinfoseparator.cpp +++ b/src/modinfoseparator.cpp @@ -9,7 +9,7 @@ std::vector ModInfoSeparator::getFlags() const { { auto result = ModInfoRegular::getFlags(); - result.insert(result.begin(), FLAG_SEPARATOR); + result.push_back(FLAG_SEPARATOR); return result; } } -- cgit v1.3.1 From 93763a93640754f468d4a5d1aeaf5ad4effa6d56 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 8 Dec 2018 11:15:16 -0600 Subject: Add workaround setting to prevent the GUI from locking when running an executable --- src/organizercore.cpp | 5 ++- src/settings.cpp | 8 ++++ src/settings.h | 6 +++ src/settingsdialog.ui | 117 +++++++++++++++++++++++++++++--------------------- 4 files changed, 85 insertions(+), 51 deletions(-) (limited to 'src') diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 4dbe7c86..1a5a9484 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1223,7 +1223,7 @@ HANDLE OrganizerCore::spawnBinaryDirect(const QFileInfo &binary, LPDWORD exitCode) { HANDLE processHandle = spawnBinaryProcess(binary, arguments, profileName, currentDirectory, steamAppID, customOverwrite); - if (processHandle != INVALID_HANDLE_VALUE) { + if (Settings::instance().lockGUI() && processHandle != INVALID_HANDLE_VALUE) { std::unique_ptr dlg; ILockedWaitingForProcess* uilock = nullptr; @@ -1485,6 +1485,9 @@ HANDLE OrganizerCore::startApplication(const QString &executable, bool OrganizerCore::waitForApplication(HANDLE handle, LPDWORD exitCode) { + if (!Settings::instance().lockGUI()) + return true; + ILockedWaitingForProcess* uilock = nullptr; if (m_UserInterface != nullptr) { uilock = m_UserInterface->lock(); diff --git a/src/settings.cpp b/src/settings.cpp index 3abb0988..b067106f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -210,6 +210,11 @@ bool Settings::forceEnableCoreFiles() const return m_Settings.value("Settings/force_enable_core_files", true).toBool(); } +bool Settings::lockGUI() const +{ + return m_Settings.value("Settings/lock_gui", true).toBool(); +} + bool Settings::automaticLoginEnabled() const { return m_Settings.value("Settings/nexus_login", false).toBool(); @@ -1060,6 +1065,7 @@ Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent, , m_hideUncheckedBox(m_dialog.findChild("hideUncheckedBox")) , m_forceEnableBox(m_dialog.findChild("forceEnableBox")) , m_displayForeignBox(m_dialog.findChild("displayForeignBox")) + , m_lockGUIBox(m_dialog.findChild("lockGUIBox")) { m_appIDEdit->setText(m_parent->getSteamAppID()); @@ -1093,6 +1099,7 @@ Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent, m_hideUncheckedBox->setChecked(m_parent->hideUncheckedPlugins()); m_forceEnableBox->setChecked(m_parent->forceEnableCoreFiles()); m_displayForeignBox->setChecked(m_parent->displayForeign()); + m_lockGUIBox->setChecked(m_parent->lockGUI()); m_dialog.setExecutableBlacklist(m_parent->executablesBlacklist()); @@ -1110,6 +1117,7 @@ void Settings::WorkaroundsTab::update() m_Settings.setValue("Settings/hide_unchecked_plugins", m_hideUncheckedBox->isChecked()); m_Settings.setValue("Settings/force_enable_core_files", m_forceEnableBox->isChecked()); m_Settings.setValue("Settings/display_foreign", m_displayForeignBox->isChecked()); + m_Settings.setValue("Settings/lock_gui", m_lockGUIBox->isChecked()); m_Settings.setValue("Settings/executable_blacklist", m_dialog.getExecutableBlacklist()); diff --git a/src/settings.h b/src/settings.h index 667b1b4c..2b8186f3 100644 --- a/src/settings.h +++ b/src/settings.h @@ -109,6 +109,11 @@ public: */ bool forceEnableCoreFiles() const; + /** + * @return true if the GUI should be locked when running executables + */ + bool lockGUI() const; + /** * @brief register download speed * @param url complete download url @@ -496,6 +501,7 @@ private: QCheckBox *m_hideUncheckedBox; QCheckBox *m_forceEnableBox; QCheckBox *m_displayForeignBox; + QCheckBox *m_lockGUIBox; }; private slots: diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 91bfca4e..203078a6 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -966,57 +966,77 @@ tl;dr-version: If Nexus-features don't work, insert the current version number o
    - - - false - - - Enforces that inactive ESPs and ESMs are never loaded. - - - It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. -I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - - - Hide inactive ESPs/ESMs - - - - - - - If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - - - If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) + + + + + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) + + + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - - - Force-enable game files - - - true - - - - - - - Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content. - - - By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods. + + + Force-enable game files + + + true + + + + + + + Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content. + + + By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods. However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly. If you disable this feature, MO will only display official DLCs this way. Please note that plugins (esps, esms, and esls) displayed in the right pane are completely unaffected by this feature. - - - Display mods installed outside MO - - - true - - + + + Display mods installed outside MO + + + true + + + + + + + false + + + Enforces that inactive ESPs and ESMs are never loaded. + + + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. +I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. + + + Hide inactive ESPs/ESMs + + + + + + + Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior. + + + Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior. + + + Lock GUI when running executable + + + true + + + +
    @@ -1330,9 +1350,6 @@ programs you are intentionally running. appIDEdit mechanismBox nmmVersionEdit - hideUncheckedBox - forceEnableBox - displayForeignBox bsaDateBtn tabWidget -- cgit v1.3.1 From 9d9dbd9f7e06f4abc3ad57f1574f98210ac65bc9 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 8 Dec 2018 14:46:42 -0600 Subject: Add shortcut to select name filters on mod list and plugin list --- src/mainwindow.cpp | 28 ++++++++++++++++++++++++++++ src/mainwindow.h | 3 +++ 2 files changed, 31 insertions(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9a40ce2e..c1e00feb 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -412,6 +412,8 @@ MainWindow::MainWindow(QSettings &initSettings new QShortcut(QKeySequence::Refresh, this, SLOT(refreshProfile_activated())); + new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F), this, SLOT(search_activated())); + new QShortcut(QKeySequence(Qt::Key_Escape), this, SLOT(searchClear_activated())); m_UpdateProblemsTimer.setSingleShot(true); connect(&m_UpdateProblemsTimer, SIGNAL(timeout()), this, SLOT(updateProblemsButton())); @@ -2862,6 +2864,32 @@ void MainWindow::refreshProfile_activated() m_OrganizerCore.profileRefresh(); } +void MainWindow::search_activated() +{ + if (ui->modList->hasFocus() || ui->modFilterEdit->hasFocus()) { + ui->modFilterEdit->setFocus(); + ui->modFilterEdit->setSelection(0, INT_MAX); + } + + if (ui->espList->hasFocus() || ui->espFilterEdit->hasFocus()) { + ui->espFilterEdit->setFocus(); + ui->espFilterEdit->setSelection(0, INT_MAX); + } +} + +void MainWindow::searchClear_activated() +{ + if (ui->modFilterEdit->hasFocus()) { + ui->modFilterEdit->clear(); + ui->modList->setFocus(); + } + + if (ui->espFilterEdit->hasFocus()) { + ui->espFilterEdit->clear(); + ui->espList->setFocus(); + } +} + void MainWindow::information_clicked() { try { diff --git a/src/mainwindow.h b/src/mainwindow.h index 62ffe3de..366765a2 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -577,6 +577,9 @@ private slots: void modlistSelectionsChanged(const QItemSelection ¤t); void esplistSelectionsChanged(const QItemSelection ¤t); + void search_activated(); + void searchClear_activated(); + private slots: // ui slots // actions void on_actionAdd_Profile_triggered(); -- cgit v1.3.1 From d7e6fd1dd65edc265b8d44928dc02cd4c76af069 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 8 Dec 2018 20:23:45 -0600 Subject: Don't disable ESMs when disabling mods if alternatives are available --- src/organizercore.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 1a5a9484..d52ef40b 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1772,7 +1772,16 @@ void OrganizerCore::updateModActiveState(int index, bool active) QDir dir(modInfo->absolutePath()); for (const QString &esm : dir.entryList(QStringList() << "*.esm", QDir::Files)) { - m_PluginList.enableESP(esm, active); + const FileEntry::Ptr file = m_DirectoryStructure->findFile(ToWString(esm)); + if (file.get() == nullptr) { + qWarning("failed to activate %s", qPrintable(esm)); + continue; + } + + if (active != m_PluginList.isEnabled(esm) + && file->getAlternatives().empty()) { + m_PluginList.enableESP(esm, active); + } } int enabled = 0; for (const QString &esl : -- cgit v1.3.1 From f61236e4cf13786ab8606ba5ff33e6d7164cc63e Mon Sep 17 00:00:00 2001 From: Al12rs Date: Mon, 10 Dec 2018 20:53:45 +0100 Subject: Added UI locking while loadbar is active (for refresh of modlist). --- src/mainwindow.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index c1e00feb..97b6cd43 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2105,7 +2105,9 @@ void MainWindow::refresher_progress(int percent) if (percent == 100) { m_RefreshProgress->setVisible(false); statusBar()->hide(); + this->setEnabled(true); } else if (!m_RefreshProgress->isVisible()) { + this->setEnabled(false); statusBar()->show(); m_RefreshProgress->setVisible(true); m_RefreshProgress->setRange(0, 100); -- cgit v1.3.1 From f4af3264f049425610d3c829ce1d92482191daf4 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 00:25:03 -0600 Subject: Sort tools menu to provide consistent results --- src/mainwindow.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 97b6cd43..2551aa2a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -436,7 +436,14 @@ MainWindow::MainWindow(QSettings &initSettings for (const QString &fileName : m_PluginContainer.pluginFileNames()) { installTranslator(QFileInfo(fileName).baseName()); } - for (IPluginTool *toolPlugin : m_PluginContainer.plugins()) { + + std::vector toolPlugins = m_PluginContainer.plugins(); + std::sort(toolPlugins.begin(), toolPlugins.end(), + [](IPluginTool *left, IPluginTool *right){ + return left->displayName().toLower() < right->displayName().toLower(); + } + ); + for (IPluginTool *toolPlugin : toolPlugins) { registerPluginTool(toolPlugin); } -- cgit v1.3.1 From 1266e13921812ac647e1b788fab5eb04e8267ec9 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 01:52:53 -0600 Subject: Add the ability to change the managed game directory --- src/mainwindow.cpp | 13 +++++++++++-- src/settings.cpp | 11 +++++++++++ src/settings.h | 5 +++++ src/settingsdialog.cpp | 10 ++++++++++ src/settingsdialog.h | 2 ++ src/settingsdialog.ui | 7 +++++++ 6 files changed, 46 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2551aa2a..834a1fce 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4178,11 +4178,22 @@ void MainWindow::on_actionSettings_triggered() QString oldModDirectory(settings.getModDirectory()); QString oldCacheDirectory(settings.getCacheDirectory()); QString oldProfilesDirectory(settings.getProfileDirectory()); + QString oldManagedGameDirectory(settings.getManagedGameDirectory()); bool oldDisplayForeign(settings.displayForeign()); bool proxy = settings.useProxy(); + DownloadManager *dlManager = m_OrganizerCore.downloadManager(); settings.query(&m_PluginContainer, this); + if (oldManagedGameDirectory != settings.getManagedGameDirectory()) { + QMessageBox::about(this, tr("Restarting MO"), + tr("Changing the managed game directory requires restarting MO.\n" + "Any pending downloads will be paused.\n\n" + "Click OK to restart MO now.")); + dlManager->pauseAll(); + qApp->exit(INT_MAX); + } + InstallationManager *instManager = m_OrganizerCore.installationManager(); instManager->setModsDirectory(settings.getModDirectory()); instManager->setDownloadDirectory(settings.getDownloadDirectory()); @@ -4194,8 +4205,6 @@ void MainWindow::on_actionSettings_triggered() refreshProfiles(); } - DownloadManager *dlManager = m_OrganizerCore.downloadManager(); - if (dlManager->getOutputDirectory() != settings.getDownloadDirectory()) { if (dlManager->downloadsInProgress()) { MessageDialog::showMessage(tr("Can't change download directory while " diff --git a/src/settings.cpp b/src/settings.cpp index b067106f..5db656d8 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -298,6 +298,11 @@ QString Settings::getModDirectory(bool resolve) const return getConfigurablePath("mod_directory", ToQString(AppConfig::modsPath()), resolve); } +QString Settings::getManagedGameDirectory() const +{ + return m_Settings.value("gamePath", "").toString(); +} + QString Settings::getProfileDirectory(bool resolve) const { return getConfigurablePath("profiles_directory", ToQString(AppConfig::profilesPath()), resolve); @@ -882,6 +887,12 @@ void Settings::PathsTab::update() } else { m_Settings.remove("Settings/base_directory"); } + + QFileInfo oldGameExe(m_parent->m_GamePlugin->gameDirectory().absoluteFilePath(m_parent->m_GamePlugin->binaryName())); + QFileInfo newGameExe(m_managedGameDirEdit->text()); + if (oldGameExe != newGameExe) { + m_Settings.setValue("gamePath", newGameExe.absolutePath()); + } } Settings::DiagnosticsTab::DiagnosticsTab(Settings *m_parent, SettingsDialog &m_dialog) diff --git a/src/settings.h b/src/settings.h index 2b8186f3..4009d4a3 100644 --- a/src/settings.h +++ b/src/settings.h @@ -160,6 +160,11 @@ public: **/ QString getCacheDirectory(bool resolve = true) const; + /** + * retrieve the directory where the managed game is stored (with native separators) + **/ + QString getManagedGameDirectory() const; + /** * retrieve the directory where profiles stored (with native separators) **/ diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index dec2532c..0d96e63a 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -220,6 +220,16 @@ void SettingsDialog::on_browseOverwriteDirBtn_clicked() } } +void SettingsDialog::on_browseGameDirBtn_clicked() +{ + QFileInfo oldGameExe(ui->managedGameDirEdit->text()); + + QString temp = QFileDialog::getOpenFileName(this, tr("Select game executable"), oldGameExe.absolutePath(), oldGameExe.fileName()); + if (!temp.isEmpty()) { + ui->managedGameDirEdit->setText(temp); + } +} + void SettingsDialog::on_containsBtn_clicked() { QColor result = QColorDialog::getColor(m_ContainsColor, this); diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 95ed288f..f0567d87 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -110,6 +110,8 @@ private slots: void on_browseProfilesDirBtn_clicked(); + void on_browseGameDirBtn_clicked(); + void on_overwritingBtn_clicked(); void on_overwrittenBtn_clicked(); diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 203078a6..80a6a0e7 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -386,6 +386,13 @@ If you use pre-releases, never contact me directly by e-mail or via private mess + + + + ... + + + -- cgit v1.3.1 From 413c04538359391b1544b329671b81947a2a6c24 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Tue, 11 Dec 2018 14:57:03 +0100 Subject: * Fixed order of data tab to be Folders first. * Remember expanded folders across refreshes. --- src/mainwindow.cpp | 95 +++++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 834a1fce..935c3612 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1166,7 +1166,52 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly) { - bool isDirectory = false; + bool isDirectory = true; + + std::wostringstream temp; + temp << directorySoFar << "\\" << directoryEntry.getName(); + { + + std::vector::const_iterator current, end; + directoryEntry.getSubDirectories(current, end); + for (; current != end; ++current) { + QString pathName = ToQString((*current)->getName()); + QStringList columns(pathName); + columns.append(""); + if (!(*current)->isEmpty()) { + QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); + directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::UserRole + 3, isDirectory); + + if (conflictsOnly) { + updateTo(directoryChild, temp.str(), **current, conflictsOnly); + if (directoryChild->childCount() != 0) { + subTree->addChild(directoryChild); + } + else { + delete directoryChild; + } + } + else { + QTreeWidgetItem *onDemandLoad = new QTreeWidgetItem(QStringList()); + onDemandLoad->setData(0, Qt::UserRole + 0, "__loaded_on_demand__"); + onDemandLoad->setData(0, Qt::UserRole + 1, ToQString(temp.str())); + onDemandLoad->setData(0, Qt::UserRole + 2, conflictsOnly); + directoryChild->addChild(onDemandLoad); + subTree->addChild(directoryChild); + } + } + else { + QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); + directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::UserRole + 3, isDirectory); + subTree->addChild(directoryChild); + } + } + } + + + isDirectory = false; { for (const FileEntry::Ptr current : directoryEntry.getFiles()) { if (conflictsOnly && (current->getAlternatives().size() == 0)) { @@ -1230,47 +1275,9 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director } } - std::wostringstream temp; - temp << directorySoFar << "\\" << directoryEntry.getName(); - { - isDirectory = true; - std::vector::const_iterator current, end; - directoryEntry.getSubDirectories(current, end); - for (; current != end; ++current) { - QString pathName = ToQString((*current)->getName()); - QStringList columns(pathName); - columns.append(""); - if (!(*current)->isEmpty()) { - QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); - directoryChild->setData(0, Qt::UserRole + 3, isDirectory); - - if (conflictsOnly) { - updateTo(directoryChild, temp.str(), **current, conflictsOnly); - if (directoryChild->childCount() != 0) { - subTree->addChild(directoryChild); - } else { - delete directoryChild; - } - } else { - QTreeWidgetItem *onDemandLoad = new QTreeWidgetItem(QStringList()); - onDemandLoad->setData(0, Qt::UserRole + 0, "__loaded_on_demand__"); - onDemandLoad->setData(0, Qt::UserRole + 1, ToQString(temp.str())); - onDemandLoad->setData(0, Qt::UserRole + 2, conflictsOnly); - directoryChild->addChild(onDemandLoad); - subTree->addChild(directoryChild); - } - } - else { - QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); - directoryChild->setData(0, Qt::UserRole + 3, isDirectory); - subTree->addChild(directoryChild); - } - } - } + - subTree->sortChildren(0, Qt::AscendingOrder); + //subTree->sortChildren(0, Qt::AscendingOrder); } void MainWindow::delayedRemove() @@ -1832,7 +1839,7 @@ void MainWindow::on_tabWidget_currentChanged(int index) } else if (index == 1) { m_OrganizerCore.refreshBSAList(); } else if (index == 2) { - refreshDataTree(); + refreshDataTreeKeepExpandedNodes(); } else if (index == 3) { refreshSaveList(); } @@ -2126,7 +2133,7 @@ void MainWindow::directory_refreshed() { // some problem-reports may rely on the virtual directory tree so they need to be updated // now - refreshDataTree(); + refreshDataTreeKeepExpandedNodes(); updateProblemsButton(); statusBar()->hide(); } @@ -4691,7 +4698,7 @@ void MainWindow::on_dataTree_customContextMenuRequested(const QPoint &pos) void MainWindow::on_conflictsCheckBox_toggled(bool) { - refreshDataTree(); + refreshDataTreeKeepExpandedNodes(); } -- cgit v1.3.1 From 0af33ccddf1962ff7ba72edda3d0aef660914a3c Mon Sep 17 00:00:00 2001 From: Al12rs Date: Tue, 11 Dec 2018 16:26:41 +0100 Subject: Added "Open Origin in Explorer" and "Open Origin Info..." options to ESPList context menu. --- src/mainwindow.cpp | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mainwindow.h | 2 ++ 2 files changed, 70 insertions(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 935c3612..55ffedc0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2837,6 +2837,29 @@ void MainWindow::openExplorer_clicked() } } +void MainWindow::openOriginExplorer_clicked() +{ + QItemSelectionModel *selection = ui->espList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 0) { + for (QModelIndex idx : selection->selectedRows()) { + QString fileName = idx.data().toString(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } + } + else { + QModelIndex idx = selection->currentIndex(); + QString fileName = idx.data().toString(); + + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } +} + void MainWindow::openExplorer_activated() { if (ui->modList->hasFocus()) { @@ -3150,6 +3173,38 @@ void MainWindow::on_listOptionsBtn_pressed() m_ContextRow = -1; } +void MainWindow::openOriginInformation_clicked() +{ + try { + QItemSelectionModel *selection = ui->espList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 0) { + for (QModelIndex idx : selection->selectedRows()) { + QString fileName = idx.data().toString(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { + displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + } + } + } + else { + QModelIndex idx = selection->currentIndex(); + QString fileName = idx.data().toString(); + + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { + displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + } + } + } + catch (const std::exception &e) { + reportError(e.what()); + } +} + void MainWindow::on_espList_doubleClicked(const QModelIndex &index) { if (!index.isValid()) { @@ -5175,6 +5230,19 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addAction(tr("Lock load order"), this, SLOT(lockESPIndex())); } + menu.addSeparator(); + menu.addAction(tr("Open Origin in Explorer"), this, SLOT(openOriginExplorer_clicked())); + + QModelIndex idx = ui->espList->selectionModel()->currentIndex(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(idx.data().toString()))); + std::vector flags = modInfo->getFlags(); + + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) == flags.end()) { + menu.addSeparator(); + QAction *infoAction = menu.addAction(tr("Open Origin Info..."), this, SLOT(openOriginInformation_clicked())); + menu.setDefaultAction(infoAction); + } + try { menu.exec(ui->espList->mapToGlobal(pos)); } catch (const std::exception &e) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 366765a2..d5484400 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -425,6 +425,8 @@ private slots: void visitOnNexus_clicked(); void visitWebPage_clicked(); void openExplorer_clicked(); + void openOriginExplorer_clicked(); + void openOriginInformation_clicked(); void information_clicked(); void enableSelectedMods_clicked(); void disableSelectedMods_clicked(); -- cgit v1.3.1 From c486220d20c2cea78beab12317c5493c720304a3 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Tue, 11 Dec 2018 16:33:39 +0100 Subject: Updated translations and removed an excessive separator from previous commit. --- src/mainwindow.cpp | 1 - src/organizer_en.ts | 1070 +++++++++++++++++++++++++++------------------------ 2 files changed, 568 insertions(+), 503 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 55ffedc0..b06eb44d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -5238,7 +5238,6 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) std::vector flags = modInfo->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) == flags.end()) { - menu.addSeparator(); QAction *infoAction = menu.addAction(tr("Open Origin Info..."), this, SLOT(openOriginInformation_clicked())); menu.setDefaultAction(infoAction); } diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 1e699dfe..e3d6729c 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1980,7 +1980,7 @@ p, li { white-space: pre-wrap; } - + No Problems @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2030,793 +2030,793 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,335 +2837,358 @@ You can also use online editors and converters instead. - + failed to remove %1 - + failed to create %1 - + + Restarting MO + + + + + Changing the managed game directory requires restarting MO. +Any pending downloads will be paused. + +Click OK to restart MO now. + + + + 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + + Open Origin in Explorer + + + + + Open Origin Info... + + + + 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 - + Set the priority of the selected mods @@ -3542,22 +3565,36 @@ p, li { white-space: pre-wrap; } - + + + + Enter comments about the mod here. These are displayed in the notes column of the mod list. + + + + + + + Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column. + + + + Filetree - + Open Mod in Explorer - + A directory view of this mod - + <!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; } @@ -3567,288 +3604,288 @@ p, li { white-space: pre-wrap; } - + Previous - + Next - + Close - + &Delete - + &Rename - + &Hide - + &Unhide - + &Open - + &New Folder - - + + Save changes? - - + + Save changes to "%1"? - + File Exists - + A file with that name exists, please enter a new one - + failed to move file - + failed to create directory "optional" - - + + Info requested, please wait - + Main - + Update - + Optional - + Old - + Misc - + Unknown - + Current Version: %1 - + No update available - + (description incomplete, please visit nexus) - + <a href="%1">Visit on Nexus</a> - + Failed to delete %1 - - - - + + + + Confirm - - + + Are sure you want to delete "%1"? - - + + Are sure you want to delete the selected files? - - + + New Folder - + Failed to create "%1" - - + + 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? - - + + failed to rename %1 to %2 - + There already is a visible version of this file. Replace it? - + Select binary - + Binary - + file not found: %1 - + failed to generate preview for %1 - + Sorry - + Sorry, can't preview anything. This function currently does not support extracting from bsas. - + Un-Hide - + Hide - - + + Open/Execute - - + + Preview - + Name - + Please enter a name - - + + Error - + Invalid name. Must be a valid file name - + A tweak by that name exists - + Create Tweak @@ -3887,18 +3924,18 @@ p, li { white-space: pre-wrap; } ModInfoRegular - - + + failed to write %1/meta.ini: error %2 - + %1 contains no esp/esm/esl and no asset (textures, meshes, interface, ...) directory - + Categories: <br> @@ -3999,176 +4036,186 @@ p, li { white-space: pre-wrap; } - + Overwrites files - + Overwritten files - + Overwrites & Overwritten - + Redundant - + Alternate game source - + Non-MO - + invalid - + 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 - - + + Notes + + + + + 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><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table> - + Time this mod was installed + + + User notes about the mod + + ModListSortProxy @@ -4388,86 +4435,86 @@ Continue launching %1? - + Failed to refresh list of esps: %1 - + Multiple esps/esls activated, please check that they don't conflict. - + Download? - + A download has been started but no installed page plugin recognizes it. If you download anyway no information (i.e. version) will be associated with the download. Continue? - + failed to update mod list: %1 - - + + login successful - + Login failed - + Login failed, try again? - + login failed: %1. Download will not be associated with an account - + login failed: %1 - + login failed: %1. You need to log-in with Nexus to update MO. - + MO1 "Script Extender" load mechanism has left hook.dll in your game folder - - + + Description missing - + <a href="%1">hook.dll</a> has been found in your game folder (right click to copy the full path). This is most likely a leftover of setting the ModOrganizer 1 load mechanism to "Script Extender", in which case you must remove this file either by changing the load mechanism in ModOrganizer 1 or manually removing the file, otherwise the game is likely to crash and burn. - + failed to save load order: %1 - + The designated write target "%1" is not enabled. @@ -5249,88 +5296,90 @@ If the folder was still in use, restart MO and try again. - Enter a new name or select one from the suggested list: + Enter a new name or select one from the suggested list: +(This is just the name of the Instance, not the game selection) + Enter a new name or select one from the suggested list: - - + + Canceled - + Invalid instance name - + The instance name "%1" is invalid. Use the name "%2" instead? - + The instance "%1" already exists. - + Please choose a different instance name, like: "%1 1" . - + Choose Instance - + Each Instance is a full set of MO data files (mods, downloads, profiles, configuration, ...). You can use multiple instances for different games. Instances are stored in Appdata and can be accessed by all MO installations. If your MO folder is writable, you can also store a single instance locally (called a Portable install, and all the MO data files will be inside the installation folder). - + New - + Create a new instance. - + Portable - + Use MO folder for data. - + Manage Instances - + Delete an Instance. - + failed to create %1 - + Data directory created - + New data directory created at %1. If you don't want to store a lot of data there, reconfigure the storage directories via settings. @@ -5442,7 +5491,7 @@ If the folder was still in use, restart MO and try again. - + Mod Organizer @@ -5457,18 +5506,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 @@ -5519,12 +5568,12 @@ If the folder was still in use, restart MO and try again. - + Script Extender - + Proxy DLL @@ -5738,28 +5787,28 @@ Select Show Details option to see the full change-log. - - + + attempt to store setting for unknown plugin "%1" - + Error - + Failed to create "%1", you may not have the necessary permission. path remains unchanged. - + Restart Mod Organizer? - + In order to reset the window geometries, MO must be restarted. Restart it now? @@ -5920,6 +5969,7 @@ If you use pre-releases, never contact me directly by e-mail or via private mess + ... @@ -5980,23 +6030,23 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - + Important: All directories have to be writeable! - - + + Nexus - + Allows automatic log-in when the Nexus-Page for the game is clicked. - + <!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; } @@ -6005,144 +6055,144 @@ p, li { white-space: pre-wrap; } - + If checked and if correct credentials are entered below, log-in to Nexus (for browsing and downloading) is automatic. - + Automatically Log-In to Nexus - - + + Username - - + + Password - + Remove cache and cookies. Forces a new login. - + Clear Cache - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - + Associate with "Download with manager" links - + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) - + Steam - + If you save your steam user ID and password here, they will be used when logging into steam. Note, however, your password will be stored unencrypted, so make sure your computer is secure. - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Blacklisted Plugins (use <del> to remove): - + Workarounds - + Steam App ID - + The Steam AppID for your game - + <!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; } @@ -6158,17 +6208,17 @@ p, li { white-space: pre-wrap; } - + Load Mechanism - + Select loading mechanism. See help for details. - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -6179,17 +6229,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6198,44 +6248,44 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - + Hide inactive ESPs/ESMs - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - + Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content. - + By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods. However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly. @@ -6243,24 +6293,35 @@ If you disable this feature, MO will only display official DLCs this way. Please - + Display mods installed outside MO - - + + + Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior. + + + + + Lock GUI when running executable + + + + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! - + Back-date BSAs - + Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended @@ -6269,48 +6330,48 @@ programs you are intentionally running. - + Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running. - + Configure Executables Blacklist - - + + Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations. - + Reset Window Geometries - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - + Diagnostics - + Log Level - + Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log". "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6318,37 +6379,37 @@ programs you are intentionally running. - + Debug - + Info (recommended) - + Warning - + Error - + Crash Dumps - + Decides which type of crash dumps are collected when injected processes crash. - + Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6359,37 +6420,37 @@ programs you are intentionally running. - + None - + Mini (recommended) - + Data - + Full - + Max Dumps To Keep - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6397,12 +6458,12 @@ programs you are intentionally running. - + Hint: right click link and copy link location - + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. @@ -6468,12 +6529,17 @@ Example: - + + Select game executable + + + + Confirm? - + This will make all dialogs show up again where you checked the "Remember selection"-box. Continue? -- cgit v1.3.1 From dac716bb86a9e4ff514fe7d939f33b397dc120e5 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 14:15:37 -0600 Subject: Allow tool plugins to define a submenu with the display name Setting the display name to "/" will group plugins under the submenu. --- src/iuserinterface.h | 5 +++- src/mainwindow.cpp | 66 ++++++++++++++++++++++++++++++++++++++-------------- src/mainwindow.h | 3 ++- 3 files changed, 55 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/iuserinterface.h b/src/iuserinterface.h index 7ce71c24..034fa029 100644 --- a/src/iuserinterface.h +++ b/src/iuserinterface.h @@ -8,6 +8,8 @@ #include #include +#include + class QSettings; class IUserInterface @@ -16,7 +18,8 @@ public: virtual void storeSettings(QSettings &settings) = 0; - virtual void registerPluginTool(MOBase::IPluginTool *tool) = 0; + virtual void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr) = 0; + virtual void registerPluginTools(std::vector toolPlugins) = 0; virtual void registerModPage(MOBase::IPluginModPage *modPage) = 0; virtual void installTranslator(const QString &name) = 0; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b06eb44d..61a745b2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -267,7 +267,7 @@ MainWindow::MainWindow(QSettings &initSettings // insert spacers ui->toolBar->insertWidget(action, spacer); m_Sep = action; - // m_Sep would only use the last seperator anyway, and we only have the one anyway? + // m_Sep would only use the last separator anyway, and we only have the one anyway? break; } } @@ -437,15 +437,7 @@ MainWindow::MainWindow(QSettings &initSettings installTranslator(QFileInfo(fileName).baseName()); } - std::vector toolPlugins = m_PluginContainer.plugins(); - std::sort(toolPlugins.begin(), toolPlugins.end(), - [](IPluginTool *left, IPluginTool *right){ - return left->displayName().toLower() < right->displayName().toLower(); - } - ); - for (IPluginTool *toolPlugin : toolPlugins) { - registerPluginTool(toolPlugin); - } + registerPluginTools(m_PluginContainer.plugins()); for (IPluginModPage *modPagePlugin : m_PluginContainer.plugins()) { registerModPage(modPagePlugin); @@ -1046,15 +1038,57 @@ void MainWindow::modPagePluginInvoke() } } -void MainWindow::registerPluginTool(IPluginTool *tool) +void MainWindow::registerPluginTool(IPluginTool *tool, QString name, QMenu *menu) { - QAction *action = new QAction(tool->icon(), tool->displayName(), ui->toolBar); + if (name.isEmpty()) + name = tool->displayName(); + + QAction *action = new QAction(tool->icon(), name, ui->toolBar); action->setToolTip(tool->tooltip()); tool->setParentWidget(this); action->setData(qVariantFromValue((QObject*)tool)); connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke()), Qt::QueuedConnection); - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); - toolBtn->menu()->addAction(action); + + if (menu == nullptr) { + QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); + toolBtn->menu()->addAction(action); + } else { + menu->addAction(action); + } +} + +void MainWindow::registerPluginTools(std::vector toolPlugins) +{ + // Sort the plugins by display name + std::sort(toolPlugins.begin(), toolPlugins.end(), + [](IPluginTool *left, IPluginTool *right) { + return left->displayName().toLower() < right->displayName().toLower(); + } + ); + + // Group the plugins into submenus + QMap>> submenuMap; + for (auto toolPlugin : toolPlugins) { + QStringList toolName = toolPlugin->displayName().split("/"); + QString submenu = toolName[0]; + toolName.pop_front(); + submenuMap[submenu].append(QPair(toolName.join("/"), toolPlugin)); + } + + // Start registering plugins + for (auto submenuKey : submenuMap.keys()) { + if (submenuMap[submenuKey].length() > 1) { + QMenu *submenu = new QMenu(submenuKey, this); + for (auto info : submenuMap[submenuKey]) { + registerPluginTool(info.second, info.first, submenu); + } + QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); + toolBtn->menu()->addMenu(submenu); + } + else { + registerPluginTool(submenuMap[submenuKey].front().second); + } + } } void MainWindow::registerModPage(IPluginModPage *modPage) @@ -1171,7 +1205,6 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director std::wostringstream temp; temp << directorySoFar << "\\" << directoryEntry.getName(); { - std::vector::const_iterator current, end; directoryEntry.getSubDirectories(current, end); for (; current != end; ++current) { @@ -1275,7 +1308,6 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director } } - //subTree->sortChildren(0, Qt::AscendingOrder); } @@ -2845,7 +2877,7 @@ void MainWindow::openOriginExplorer_clicked() QString fileName = idx.data().toString(); ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); std::vector flags = modInfo->getFlags(); - + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index d5484400..69d08337 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -132,7 +132,8 @@ public: void saveArchiveList(); - void registerPluginTool(MOBase::IPluginTool *tool); + void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr); + void registerPluginTools(std::vector toolPlugins); void registerModPage(MOBase::IPluginModPage *modPage); void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info); -- cgit v1.3.1 From 5335188e635c8c1b1cb2529e2a921d15c7d02058 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 14:47:50 -0600 Subject: Add option to remove column colors for mod list separators --- src/modlist.cpp | 8 +++++--- src/settings.cpp | 8 ++++++++ src/settings.h | 7 +++++++ src/settingsdialog.ui | 40 ++++++++++++++++++++++++++++------------ 4 files changed, 48 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/modlist.cpp b/src/modlist.cpp index 547cc853..dfe2efd3 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -395,7 +395,6 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } else if ((role == Qt::BackgroundRole) || (role == ViewMarkingScrollBar::DEFAULT_ROLE)) { - auto flags = modInfo->getFlags(); if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_PLUGIN) { return Settings::instance().modlistContainsPluginColor(); } else if (m_Overwrite.find(modIndex) != m_Overwrite.end()) { @@ -403,8 +402,11 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) { return Settings::instance().modlistOverwritingLooseColor(); - } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end() && modInfo->getColor().isValid()) { - return modInfo->getColor(); + } else if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR) + && modInfo->getColor().isValid() + && ((role != ViewMarkingScrollBar::DEFAULT_ROLE) + || Settings::instance().colorSeparatorScrollbar())) { + return modInfo->getColor(); } else { return QVariant(); } diff --git a/src/settings.cpp b/src/settings.cpp index 5db656d8..18e893cb 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -148,6 +148,11 @@ void Settings::registerAsNXMHandler(bool force) } } +bool Settings::colorSeparatorScrollbar() const +{ + return m_Settings.value("Settings/colorSeparatorScrollbars", true).toBool(); +} + void Settings::managedGameChanged(IPluginGame const *gamePlugin) { m_GamePlugin = gamePlugin; @@ -716,6 +721,7 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog) , m_overwrittenBtn(m_dialog.findChild("overwrittenBtn")) , m_containsBtn(m_dialog.findChild("containsBtn")) , m_containedBtn(m_dialog.findChild("containedBtn")) + , m_colorSeparatorsBox(m_dialog.findChild("colorSeparatorsBox")) { // FIXME I think 'addLanguages' lives in here not in parent m_parent->addLanguages(m_languageBox); @@ -788,6 +794,7 @@ Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog) m_compactBox->setChecked(m_parent->compactDownloads()); m_showMetaBox->setChecked(m_parent->metaDownloads()); m_usePrereleaseBox->setChecked(m_parent->usePrereleases()); + m_colorSeparatorsBox->setChecked(m_parent->colorSeparatorScrollbar()); } void Settings::GeneralTab::update() @@ -813,6 +820,7 @@ void Settings::GeneralTab::update() m_Settings.setValue("Settings/compact_downloads", m_compactBox->isChecked()); m_Settings.setValue("Settings/meta_downloads", m_showMetaBox->isChecked()); m_Settings.setValue("Settings/use_prereleases", m_usePrereleaseBox->isChecked()); + m_Settings.setValue("Settings/colorSeparatorScrollbars", m_colorSeparatorsBox->isChecked()); } Settings::PathsTab::PathsTab(Settings *parent, SettingsDialog &dialog) diff --git a/src/settings.h b/src/settings.h index 4009d4a3..912864e2 100644 --- a/src/settings.h +++ b/src/settings.h @@ -365,6 +365,12 @@ public: */ void registerAsNXMHandler(bool force); + /** + * @brief color the scrollbar of the mod list for custom separator colors? + * @return the state of the setting + */ + bool colorSeparatorScrollbar() const; + public slots: void managedGameChanged(MOBase::IPluginGame const *gamePlugin); @@ -414,6 +420,7 @@ private: QPushButton *m_overwrittenBtn; QPushButton *m_containsBtn; QPushButton *m_containedBtn; + QCheckBox *m_colorSeparatorsBox; }; class PathsTab : public SettingsTab diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 80a6a0e7..6557bbcc 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -99,31 +99,31 @@ If you use pre-releases, never contact me directly by e-mail or via private mess Colors - - + + - Mod Contains selected Plugin + Reset Colors - - + + - Plugin is Contained in selected Mod + Is overwritten (loose files) - - + + - Reset Colors + Mod Contains selected Plugin - - + + - Is overwritten (loose files) + Plugin is Contained in selected Mod @@ -134,6 +134,22 @@ If you use pre-releases, never contact me directly by e-mail or via private mess + + + + When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section. + + + When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section. + + + Show mod list separator colors on the scrollbar + + + true + + + -- cgit v1.3.1 From f6cd53e9327316b68520ddd0e4e607b22ac5fbd1 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 15:24:25 -0600 Subject: Change color of separator text based on the configured color of the separator --- src/modlist.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/modlist.cpp b/src/modlist.cpp index dfe2efd3..ee7db894 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -378,6 +378,11 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } } return QVariant(); + } else if (role == Qt::TextColorRole) { + if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR) && modInfo->getColor().isValid()) { + return Settings::getIdealTextColor(modInfo->getColor()); + } + return QVariant(); } else if (role == Qt::ForegroundRole) { if (column == COL_NAME) { int highlight = modInfo->getHighlight(); -- cgit v1.3.1 From 2306e006dcf9206508cf11d586cf43f445a9b0b6 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 15:45:29 -0600 Subject: Remove the requirement for a game launcher to be present --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index 43b52609..4d2bb7ed 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -322,7 +322,7 @@ MOBase::IPluginGame *determineCurrentGame(QString const &moPath, QSettings &sett //The following code would try to determine the right game to mange but it would usually find the wrong one //so it was commented out. - /* + /* //OK, we are in a new setup or existing info is useless. //See if MO has been installed inside a game directory for (IPluginGame * const game : plugins.plugins()) { @@ -383,7 +383,7 @@ MOBase::IPluginGame *determineCurrentGame(QString const &moPath, QSettings &sett } } reportError(QObject::tr("No game identified in \"%1\". The directory is required to contain " - "the game binary and its launcher.").arg(gamePath)); + "the game binary.").arg(gamePath)); } } -- cgit v1.3.1 From 7b1ece5f28aff9fc874851f2e3d481ff29ff3c9f Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 18:31:09 -0600 Subject: Further extend the version field to 32 characters --- src/modinfodialog.ui | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 671c7f31..736214f4 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -20,7 +20,7 @@ QTabWidget::Rounded - 8 + 0 true @@ -677,12 +677,12 @@ p, li { white-space: pre-wrap; } - 50 + 150 16777215 - 12 + 32 -- cgit v1.3.1 From 68a1afed49a204268e5b1ca374f3989766d75706 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 20:31:17 -0600 Subject: Implement separator text color in a way that doesn't break everything else --- src/modlist.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/modlist.cpp b/src/modlist.cpp index ee7db894..16d2cd07 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -378,16 +378,15 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } } return QVariant(); - } else if (role == Qt::TextColorRole) { + } else if (role == Qt::ForegroundRole) { if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR) && modInfo->getColor().isValid()) { return Settings::getIdealTextColor(modInfo->getColor()); - } - return QVariant(); - } else if (role == Qt::ForegroundRole) { - if (column == COL_NAME) { + } else if (column == COL_NAME) { int highlight = modInfo->getHighlight(); - if (highlight & ModInfo::HIGHLIGHT_IMPORTANT) return QBrush(Qt::darkRed); - else if (highlight & ModInfo::HIGHLIGHT_INVALID) return QBrush(Qt::darkGray); + if (highlight & ModInfo::HIGHLIGHT_IMPORTANT) + return QBrush(Qt::darkRed); + else if (highlight & ModInfo::HIGHLIGHT_INVALID) + return QBrush(Qt::darkGray); } else if (column == COL_VERSION) { if (!modInfo->getNewestVersion().isValid()) { return QVariant(); -- cgit v1.3.1 From 7f82ffa6645d4c1c327ed7a65e2084386bd7210b Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 20:37:36 -0600 Subject: Add v4.3 Paper Light and Paper Dark themes by 6788 --- src/stylesheets/Paper Dark by 6788.qss | 970 ++++++++++++++++++++ src/stylesheets/Paper Light by 6788.qss | 973 +++++++++++++++++++++ src/stylesheets/Paper/Dark/Arrows/down.svg | 97 ++ src/stylesheets/Paper/Dark/Arrows/left.svg | 97 ++ src/stylesheets/Paper/Dark/Arrows/right.svg | 97 ++ src/stylesheets/Paper/Dark/Arrows/up.svg | 97 ++ src/stylesheets/Paper/Dark/Toolbar/archives.svg | 99 +++ src/stylesheets/Paper/Dark/Toolbar/executables.svg | 99 +++ src/stylesheets/Paper/Dark/Toolbar/help.svg | 128 +++ src/stylesheets/Paper/Dark/Toolbar/instances.svg | 98 +++ src/stylesheets/Paper/Dark/Toolbar/nexus.svg | 122 +++ src/stylesheets/Paper/Dark/Toolbar/problems.svg | 132 +++ src/stylesheets/Paper/Dark/Toolbar/profiles.svg | 112 +++ src/stylesheets/Paper/Dark/Toolbar/settings.svg | 95 ++ src/stylesheets/Paper/Dark/Toolbar/tools.svg | 117 +++ src/stylesheets/Paper/Dark/Toolbar/update.svg | 141 +++ src/stylesheets/Paper/Dark/backup.svg | 128 +++ src/stylesheets/Paper/Dark/check-alt.svg | 94 ++ src/stylesheets/Paper/Dark/check.svg | 94 ++ src/stylesheets/Paper/Dark/cross.svg | 94 ++ src/stylesheets/Paper/Dark/dots.svg | 111 +++ src/stylesheets/Paper/Dark/folder.svg | 94 ++ src/stylesheets/Paper/Dark/heart.svg | 111 +++ src/stylesheets/Paper/Dark/refresh.svg | 103 +++ src/stylesheets/Paper/Dark/restore-alt.svg | 125 +++ src/stylesheets/Paper/Dark/restore.svg | 94 ++ src/stylesheets/Paper/Dark/run.svg | 109 +++ src/stylesheets/Paper/Dark/shortcut.svg | 96 ++ src/stylesheets/Paper/Dark/sort.svg | 122 +++ src/stylesheets/Paper/Dark/unchecked-alt.svg | 100 +++ src/stylesheets/Paper/Dark/unchecked-disabled.svg | 94 ++ src/stylesheets/Paper/Dark/unchecked.svg | 100 +++ src/stylesheets/Paper/Light/Arrows/down.svg | 97 ++ src/stylesheets/Paper/Light/Arrows/left.svg | 97 ++ src/stylesheets/Paper/Light/Arrows/right.svg | 97 ++ src/stylesheets/Paper/Light/Arrows/up.svg | 97 ++ src/stylesheets/Paper/Light/Toolbar/archives.svg | 99 +++ .../Paper/Light/Toolbar/executables.svg | 99 +++ src/stylesheets/Paper/Light/Toolbar/help.svg | 128 +++ src/stylesheets/Paper/Light/Toolbar/instances.svg | 98 +++ src/stylesheets/Paper/Light/Toolbar/nexus.svg | 122 +++ src/stylesheets/Paper/Light/Toolbar/problems.svg | 132 +++ src/stylesheets/Paper/Light/Toolbar/profiles.svg | 112 +++ src/stylesheets/Paper/Light/Toolbar/settings.svg | 95 ++ src/stylesheets/Paper/Light/Toolbar/tools.svg | 117 +++ src/stylesheets/Paper/Light/Toolbar/update.svg | 141 +++ src/stylesheets/Paper/Light/backup.svg | 126 +++ src/stylesheets/Paper/Light/check-alt.svg | 94 ++ src/stylesheets/Paper/Light/check-white.svg | 94 ++ src/stylesheets/Paper/Light/check.svg | 94 ++ src/stylesheets/Paper/Light/cross.svg | 94 ++ src/stylesheets/Paper/Light/dots.svg | 111 +++ src/stylesheets/Paper/Light/folder.svg | 94 ++ src/stylesheets/Paper/Light/heart.svg | 111 +++ src/stylesheets/Paper/Light/refresh.svg | 103 +++ src/stylesheets/Paper/Light/restore-alt.svg | 126 +++ src/stylesheets/Paper/Light/restore.svg | 94 ++ src/stylesheets/Paper/Light/run.svg | 109 +++ src/stylesheets/Paper/Light/shortcut.svg | 94 ++ src/stylesheets/Paper/Light/sort.svg | 125 +++ src/stylesheets/Paper/Light/unchecked-alt.svg | 94 ++ src/stylesheets/Paper/Light/unchecked-disabled.svg | 94 ++ src/stylesheets/Paper/Light/unchecked-hover.svg | 94 ++ src/stylesheets/Paper/Light/unchecked.svg | 94 ++ 64 files changed, 8519 insertions(+) create mode 100644 src/stylesheets/Paper Dark by 6788.qss create mode 100644 src/stylesheets/Paper Light by 6788.qss create mode 100644 src/stylesheets/Paper/Dark/Arrows/down.svg create mode 100644 src/stylesheets/Paper/Dark/Arrows/left.svg create mode 100644 src/stylesheets/Paper/Dark/Arrows/right.svg create mode 100644 src/stylesheets/Paper/Dark/Arrows/up.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/archives.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/executables.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/help.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/instances.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/nexus.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/problems.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/profiles.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/settings.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/tools.svg create mode 100644 src/stylesheets/Paper/Dark/Toolbar/update.svg create mode 100644 src/stylesheets/Paper/Dark/backup.svg create mode 100644 src/stylesheets/Paper/Dark/check-alt.svg create mode 100644 src/stylesheets/Paper/Dark/check.svg create mode 100644 src/stylesheets/Paper/Dark/cross.svg create mode 100644 src/stylesheets/Paper/Dark/dots.svg create mode 100644 src/stylesheets/Paper/Dark/folder.svg create mode 100644 src/stylesheets/Paper/Dark/heart.svg create mode 100644 src/stylesheets/Paper/Dark/refresh.svg create mode 100644 src/stylesheets/Paper/Dark/restore-alt.svg create mode 100644 src/stylesheets/Paper/Dark/restore.svg create mode 100644 src/stylesheets/Paper/Dark/run.svg create mode 100644 src/stylesheets/Paper/Dark/shortcut.svg create mode 100644 src/stylesheets/Paper/Dark/sort.svg create mode 100644 src/stylesheets/Paper/Dark/unchecked-alt.svg create mode 100644 src/stylesheets/Paper/Dark/unchecked-disabled.svg create mode 100644 src/stylesheets/Paper/Dark/unchecked.svg create mode 100644 src/stylesheets/Paper/Light/Arrows/down.svg create mode 100644 src/stylesheets/Paper/Light/Arrows/left.svg create mode 100644 src/stylesheets/Paper/Light/Arrows/right.svg create mode 100644 src/stylesheets/Paper/Light/Arrows/up.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/archives.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/executables.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/help.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/instances.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/nexus.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/problems.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/profiles.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/settings.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/tools.svg create mode 100644 src/stylesheets/Paper/Light/Toolbar/update.svg create mode 100644 src/stylesheets/Paper/Light/backup.svg create mode 100644 src/stylesheets/Paper/Light/check-alt.svg create mode 100644 src/stylesheets/Paper/Light/check-white.svg create mode 100644 src/stylesheets/Paper/Light/check.svg create mode 100644 src/stylesheets/Paper/Light/cross.svg create mode 100644 src/stylesheets/Paper/Light/dots.svg create mode 100644 src/stylesheets/Paper/Light/folder.svg create mode 100644 src/stylesheets/Paper/Light/heart.svg create mode 100644 src/stylesheets/Paper/Light/refresh.svg create mode 100644 src/stylesheets/Paper/Light/restore-alt.svg create mode 100644 src/stylesheets/Paper/Light/restore.svg create mode 100644 src/stylesheets/Paper/Light/run.svg create mode 100644 src/stylesheets/Paper/Light/shortcut.svg create mode 100644 src/stylesheets/Paper/Light/sort.svg create mode 100644 src/stylesheets/Paper/Light/unchecked-alt.svg create mode 100644 src/stylesheets/Paper/Light/unchecked-disabled.svg create mode 100644 src/stylesheets/Paper/Light/unchecked-hover.svg create mode 100644 src/stylesheets/Paper/Light/unchecked.svg (limited to 'src') diff --git a/src/stylesheets/Paper Dark by 6788.qss b/src/stylesheets/Paper Dark by 6788.qss new file mode 100644 index 00000000..9f4db66f --- /dev/null +++ b/src/stylesheets/Paper Dark by 6788.qss @@ -0,0 +1,970 @@ +/* v4.3 Paper Dark by 6788-00 */ +/* https://6788-00.tumblr.com/ */ + +/* Color Palette */ +/* Background - Main | #242424 */ +/* Background - Content | #141414 */ +/* Background - Alternate | #1C1C1C */ +/* Hover | #3D3D3D */ +/* Selected | #006868 */ + +/* All */ + +* { + color: #D3D3D3; + font-size: 12px; +} + +/* Main Window */ + +QWidget { + /* most of the window */ + background: #242424; + color: #D3D3D3; +} + +QWidget:disabled { + /* disabled parts of the window like the update button when there are no updates */ + background: #242424; + color: #808080; +} + +QAbstractItemView { + /* left and right pane container */ + background: #141414; + alternate-background-color: #1C1C1C; + show-decoration-selected: 1; + selection-background-color: #006868; + selection-color: #FFFFFF; +} + +QAbstractItemView::item { + padding: 1px; +} + +QAbstractItemView::item:hover { + /* rows on left and right pane when moused-over */ + background: #3D3D3D; + color: #FFFFFF; +} + +QAbstractItemView::item:selected { + /* rows on left and right pane when clicked */ + background: #006868; + color: #FFFFFF; +} + +QAbstractScrollArea::corner { + /* corner between where a vertical scrollbar and a horizontal scrollbar meet */ + background: #141414; + border: 2px solid #242424; + border-bottom-right-radius: 6px; + margin: 0px -2px -2px 0px; +} + +QSplitter { + width: 8px; +} + +/* Toolbar */ + +QToolBar { + /* top toolbar; */ + background: #242424; + border: 1px solid #242424; +} + +QToolBar::separator { + /* uncertain, assumed: vertical seperator on toolbar left of the warnings button*/ + background: #242424; + margin: 6px 8px; +} + +QToolButton { + /* toolbar buttons */ + padding: 6px; + border-radius: 10px; + margin: 4px 4px 0px 4px; +} + +QToolButton:hover { + /* toolbar buttons when moused-over; */ + background: #006868; +} + +QToolButton:pressed { + /* toolbar buttons when clicked; */ + background: #006868; +} + +QToolButton:menu-indicator { + /* expandable indicator on toolbar buttons */ + image: url(./Paper/Dark/Arrows/down.svg); + margin: 4px; +} + +/* Toolbar Button Icons */ + +#actionChange_Game { + qproperty-icon: url(./Paper/Dark/Toolbar/instances.svg); +} + +#actionInstallMod { + qproperty-icon: url(./Paper/Dark/Toolbar/archives.svg); +} + +#actionNexus { + qproperty-icon: url(./Paper/Dark/Toolbar/nexus.svg); +} + +#actionAdd_Profile { + qproperty-icon: url(./Paper/Dark/Toolbar/profiles.svg); +} + +#actionModify_Executables { + qproperty-icon: url(./Paper/Dark/Toolbar/executables.svg); +} + +#actionTool { + qproperty-icon: url(./Paper/Dark/Toolbar/tools.svg); +} + +#actionSettings { + qproperty-icon: url(./Paper/Dark/Toolbar/settings.svg); +} + +#actionProblems { + qproperty-icon: url(./Paper/Dark/Toolbar/problems.svg); +} + +#actionUpdate { + qproperty-icon: url(./Paper/Dark/Toolbar/update.svg); +} + +#actionHelp { + qproperty-icon: url(./Paper/Dark/Toolbar/help.svg); +} + +/* Left Pane & File Trees */ + +ModListView, PluginListView { + /* Mods List and Plugins List specifically */ + margin: 2px 0px; +} + +QTreeView { + /* left pane and right pane under QAbstractItemView*/ + border-radius: 6px; +} + +QTreeView::branch:hover { + /* rows on the left pane when moused-over (below QAbstractItemView, i.e. to the left of the checkbox) */ + background: #3A3A3A; + color: #FFFFFF; +} + +QTreeView::branch:selected { + /* rows on the left pane when clicked (below QAbstractItemView, i.e. to the left of the checkbox) */ + background: #006868; + color: #FFFFFF; +} + +QTreeView::branch:closed:has-children:has-siblings, +QTreeView::branch:closed:has-children:!has-siblings { + /* a branch that is closed */ + image: url(./Paper/Dark/Arrows/right.svg); +} + +QTreeView::branch:open:has-children:has-siblings, +QTreeView::branch:open:has-children:!has-siblings { + /* a branch that is open */ + image: url(./Paper/Dark/Arrows/down.svg); +} + +QListView { + /* saves window */ + border-radius: 6px; +} + +QListView::item:hover { + /* a row on the saves tab when moused-over */ + background: #3D3D3D; + color: #FFFFFF; + padding: 2px 0px; +} + +QListView::item:selected { + /* a row on the saves tab when clicked */ + background: #006868; + color: #FFFFFF; + padding: 2px 0px; +} + +QTextEdit { + /* large text fields */ + background: #141414; + border-radius: 6px; +} + +QWebView { + /* Nexus Info window */ + background: #141414; + border-radius: 6px; +} + +/* Group Boxes */ + +QGroupBox { + /* boxes that group multiple elements together (e.g. on Settings) */ + padding: 24px 4px; + border: 2px solid #141414; + border-radius: 10px; +} + +QGroupBox::title { + /* title of group boxes */ + background: transparent; + subcontrol-origin: padding; + subcontrol-position: top left; + padding: 8px; +} + +/* Text Fields */ + +QLineEdit { + /* text fields like NameFilter and directory fields */ + background: #141414; + min-height: 14px; + padding: 2px; + border: 2px solid #141414; + border-radius: 6px; +} + +QLineEdit:hover { + /* text fields when moused-over */ + border: 2px solid #006868; +} + +/* Most Dropdown Menus */ + +QComboBox { + /* dropdown menus */ + background: #141414; + min-height: 20px; + padding-left: 5px; + border: 2px solid #141414; + border-radius: 6px; + margin: 4px 0px; +} + +QComboBox:hover { + /* dropdown menus when moused-over */ + border: 2px solid #006868; +} + +QComboBox:on { + /* dropdown menus when expanded */ + background: #006868; + color: #FFFFFF; + border: 2px solid #006868; +} + +QComboBox::drop-down { + /* area for expandable indicator */ + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; +} + +QComboBox QAbstractItemView { + /* actual menu that expands */ + background: #141414; + border: 2px solid #242424; + border-radius: 6px; +} + +QComboBox::down-arrow { + /* expandable indicator */ + image: url(./Paper/Dark/Arrows/down.svg); +} + +/* Most Buttons */ + +QPushButton { + /* most buttons */ + background: #141414; + color: #D3D3D3; + min-height: 20px; + padding: 2px 12px; + border-radius: 6px; + margin: 2px 0px; +} + +QPushButton:disabled { + /* most buttons when disabled */ + border: 2px solid #141414; +} + +QPushButton:hover { + /* most buttons when hovered */ + background: #006868; + color: #FFFFFF; +} + +QPushButton:pressed { + /* most buttons when clicked */ + background: #006868; + color: #FFFFFF; +} + +QPushButton::menu-indicator { + /* expandable indicator for most buttons */ + subcontrol-position: right center; + image: url(./Paper/Dark/Arrows/down.svg); + padding: 2px; + margin: 4px 4px; +} + +/* Icons */ + +#listOptionsBtn { + /* Options button */ + qproperty-icon: url(./Paper/Dark/dots.svg); + qproperty-iconSize: 16px; + padding-left: 2px; +} + +#openFolderMenu { + /* Open Folder button */ + qproperty-icon: url(./Paper/Dark/folder.svg); + qproperty-iconSize: 14px; + padding-left: 4px; +} + +#restoreModsButton, +#restoreButton { + /* Restore Backup buttons */ + qproperty-icon: url(./Paper/Dark/restore.svg); + qproperty-iconSize: 14px; +} + +#saveModsButton, +#saveButton { + /* Backup buttons */ + qproperty-icon: url(./Paper/Dark/backup.svg); + qproperty-iconSize: 14px; +} + +#bossButton { + /* Sort button */ + qproperty-icon: url(./Paper/Dark/sort.svg); + qproperty-iconSize: 14px; +} + +#linkButton { + /* Shortcuts button */ + qproperty-icon: url(./Paper/Dark/shortcut.svg); + qproperty-iconSize: 14px; +} + +#refreshButton, +#btnRefreshData, +#btnRefreshDownloads { + /* Refresh buttons */ + qproperty-icon: url(./Paper/Dark/refresh.svg); + qproperty-iconSize: 14px; +} + +#endorseBtn { + /* Endorse button on the Nexus Info tab of the Information window */ + qproperty-icon: url(./Paper/Dark/heart.svg); + qproperty-iconSize: 14px; +} + +#clearCacheButton { + /* Clear Cache button on the Nexus tab of the Settings window */ + qproperty-icon: url(./Paper/Dark/cross.svg); + qproperty-iconSize: 14px; +} + +#deactivateESP, +#activateESP { + /* activate and deactivate ESP buttons */ + background: #141414; +} + +#deactivateESP:hover, +#activateESP:hover { + /* activate and deactivate ESP buttons when moused-over */ + background: #006868; +} + +#deactivateESP { + /* icon for the deactivate ESP button */ + qproperty-icon: url(./Paper/Dark/backup.svg); +} + +#activateESP { + /* icon for the activate ESP button */ + qproperty-icon: url(./Paper/Dark/restore-alt.svg); +} + +/* Run button */ + +#startButton { + /* Run button */ + background: #006868; + color: #FFFFFF; + qproperty-icon: url(./Paper/Dark/run.svg); + qproperty-iconSize: 30px; + padding: 6px; +} + +#startButton:hover { + /* Run button when moused-over*/ + background: #3D3D3D; +} + +/* Scroll Bars */ + +/* Horizontal */ + +QScrollBar:horizontal { + /* horizontal scroll bar */ + background: #141414; + height: 20px; + border: 2px solid #242424; + margin: 0px 23px -2px 23px; +} + +QScrollBar::handle:horizontal { + /* handle for horizontal scroll bars */ + background: #3D3D3D; + min-width: 32px; + border-radius: 6px; + margin: 2px; +} + +QScrollBar::add-line:horizontal { + /* scroll right button */ + background: #141414; + image: url(./Paper/Dark/Arrows/right.svg); + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; + border: 2px solid #242424; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:horizontal { + /* scroll left button */ + background: #141414; + image: url(./Paper/Dark/Arrows/left.svg); + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; + border: 2px solid #242424; + border-bottom-left-radius: 6px; + margin: 0px 0px -2px -2px; +} + +/* Vertical */ + +QScrollBar:vertical { + /* vertical scroll bar */ + background: #141414; + width: 20px; + border: 2px solid #242424; + margin: 23px -2px 23px 0px; +} + +QScrollBar::handle:vertical { + /* handle for vertical scroll bars */ + background: #3D3D3D; + min-height: 32px; + border-radius: 6px; + margin: 2px; +} + +QScrollBar::add-line:vertical { + /* scroll down button */ + background: #141414; + image: url(./Paper/Dark/Arrows/down.svg); + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; + border: 2px solid #242424; + border-bottom-right-radius: 6px; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:vertical { + /* scroll up button */ + background: #141414; + image: url(./Paper/Dark/Arrows/up.svg); + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; + border: 2px solid #242424; + border-top-right-radius: 6px; + margin: -2px -2px 0px 0px; +} + +/* Combined */ + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover, +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + /* buttons and handles when moused-over */ + background: #006868; +} + +QScrollBar::handle:horizontal:pressed, +QScrollBar::handle:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { + /* buttons and handles when clicked */ + background: #006868; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + /* area on scroll bars where clicking it scrolls to where you clicked */ + background: transparent; +} + +/* Header Rows */ + +QHeaderView { + /* header row (i.e. Mod Name, Flags, Category, etc.) */ + background: #242424; +} + +QHeaderView::section { + /* each section on the header row (i.e. Mod name is one section and Flags another) */ + background: #141414; + color: #D3D3D3; + height: 22px; + padding: 0px 5px; + border: 0px; + border-bottom: 2px solid #242424; + border-right: 2px solid #242424; +} + +QHeaderView::section:first { + /* first section on a header row */ + border-top-left-radius: 6px; +} + +QHeaderView::section:last { + /* last section on a header row */ + border-right: 0px; + border-top-right-radius: 6px; +} + +QHeaderView::section:hover { + /* a section on a header row when hovered */ + background: #3D3D3D; + color: #FFFFFF; +} + +QHeaderView::up-arrow { + /* ascending sort indicator */ + image: url(./Paper/Dark/Arrows/up.svg); + padding-right: 4px; + height: 10px; + width: 10px; +} + +QHeaderView::down-arrow { + /* descending sort indicator */ + image: url(./Paper/Dark/Arrows/down.svg); + padding-right: 4px; + height: 10px; + width: 10px; +} + +/* Right Click Menus, Toolbar Dropdown Menus, & Tooltips */ + +QMenu { + /* right click menu */ + background: #141414; + border: 2px solid #242424; + border-radius: 6px; +} + +QMenu::item { + /* rows on right click menus */ + background: #141414; + padding: 5px 20px 5px 24px; +} + +QMenu::item:selected { + /* rows on right click menus when moused-over (i dunno) */ + background: #006868; + color: #FFFFFF; + border: 0px; + border-radius: 4px; +} + +QMenu::item:disabled { + /* unavailable rows on right click menus */ + background: #242424; + color: #808080; +} + +QMenu::separator { + /* seperators on right click menus */ + height: 2px; + background: #242424; +} + +QMenu::icon { + /* area for icons on right click menus */ + padding: 4px; +} + +QMenu::right-arrow { + /* submenu indicator */ + image: url(./Paper/Dark/Arrows/right.svg); + padding-right: 5px; +} + +QMenu QPushButton { + /* Change Categories and Primary Categories buttons */ + background: #141414; + color: #D3D3D3; + padding: 2px 24px; + text-align: left; + border-radius: 0px; +} + +QMenu QPushButton:hover { + /* Change Categories and Primary Categories buttons when moused-over */ + border-radius: 6px; +} + +QMenu QCheckBox { + /* checkboxes on right click menus (change categories)*/ + background: #141414; + padding: 2px 6px; +} + +QMenu QCheckBox:hover { + /* checkboxes on right click menus when moused-over (change categories) */ + background: #3D3D3D; + color: #FFFFFF; +} + +QMenu QRadioButton { + /* radio buttons on right click menus (primary categories) */ + background: #141414; + padding: 2px 6px; +} + +QToolTip { + /* all tooltips */ + background: #141414; + border: 2px solid #242424; + border-radius: 6px; +} + +/* Progress Bars (Downloads) */ + +QProgressBar { + /* progress bars when downloading */ + background: #141414; + text-align: center; + border: 2px solid #242424; + border-radius: 6px; + margin: 0px 10px; +} + +QProgressBar::chunk { + /* the loading part that moves on progress bars */ + background: #006868; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +/* Right Pane and Tab Bars */ + +QTabWidget::pane { + /* right pane */ + top: 1px; + padding: 2px 2px 10px 2px; + border: 2px solid #141414; + border-radius: 10px; +} + +QTabWidget QAbstractScrollArea::item { + padding: 2px; +} + +QTabWidget::tab-bar { + /* tabs */ + alignment: center; +} + +QTabBar::tab { + /* a tab */ + background: #141414; + color: #141414; + padding: 4px 1em; + border: 2px solid #141414; + margin: 3px 1px; +} + +QTabBar::tab:!selected { + /* a tab that is not clicked */ + background: #141414; + color: #D3D3D3; + border: 2px solid #141414; +} + +QTabBar::tab:disabled { + /* a tab that is disabled */ + background: #242424; + color: #808080; + border: 2px solid transparent; +} + +QTabBar::tab:selected { + /* a tab that is clicked */ + color: #FFFFFF; + background: #006868; + border: 2px solid #006868; +} + +QTabBar::tab:hover { + /* a tab when moused-over */ + color: #FFFFFF; + background: #3D3D3D; + border: 2px solid #3D3D3D; +} + +QTabBar::tab:first { + /* that first tab */ + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; +} + +QTabBar::tab:last { + /* the last tab */ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} + +QTabBar QToolButton { + /* buttons to scroll between more tabs on a tab bar */ + background: #3D3D3D; + padding: 1px; + border-radius: 6px; + margin: 1px; +} + +QTabBar QToolButton:disabled { + /* buttons to scroll on a tab bar when it's unavailable */ + background: transparent; +} + +QLCDNumber { + /* LCD number on the Conflicts tab */ + background: #141414; + color: #006868; + border-radius: 6px; +} + +/* Tables (Configure Mod Categories) */ + +QTableView { + /* a table */ + gridline-color: #242424; + border: 0px; +} + +/* Checkboxes */ + +QTreeView::indicator:unchecked, +QCheckBox::indicator:unchecked, +QGroupBox::indicator:unchecked, +QRadioButton::indicator:unchecked { + /* a checkbox that is unchecked */ + image: url(./Paper/Dark/unchecked.svg); + width: 14px; + height: 14px; +} + +QCheckBox::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:hover { + /* a checkbox that is unchecked when moused-over and clicked */ + image: url(./Paper/Dark/unchecked-alt.svg); +} + +QTreeView::indicator:checked, +QCheckBox::indicator:checked, +QGroupBox::indicator:checked, +QRadioButton::indicator:checked { + /* a checkbox that is checked */ + image: url(./Paper/Dark/check.svg); + width: 14px; + height: 14px; +} + +QTreeView::indicator:checked:selected, +QCheckBox::indicator:checked:hover, +QRadioButton::indicator:checked:hover { + /* a checkbox that is checked when moused-over and clicked */ + image: url(./Paper/Dark/check-alt.svg); +} + +QCheckBox::indicator:disabled { + /* a checkbox that is disabled */ + image: url(./Paper/Dark/unchecked-disabled.svg); +} + +/* Spinboxes */ + +QSpinBox, +QDoubleSpinBox { + /* usually boxes for selecting numbers */ + min-height: 24px; + min-width: 60px; + background: #141414; + padding: 0px 2px; + border: 2px solid #242424; + border-radius: 6px; + margin: 0px -4px; +} + +QSpinBox::up-button, +QDoubleSpinBox::up-button { + /* up button on spinboxes */ + min-height: 28px; + min-width: 20px; + subcontrol-position: center right; + border: 2px solid #242424; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +QSpinBox::up-arrow, +QDoubleSpinBox::up-arrow { + /* arrow for the up button */ + image: url(./Paper/Dark/Arrows/up.svg); +} + +QSpinBox::up-button:hover, +QDoubleSpinBox::up-button:hover { + /* up button on spinboxes when moused-over */ + background: #3D3D3D; +} + +QSpinBox::down-button, +QDoubleSpinBox::down-button { + /* down button on spinboxes */ + min-height: 28px; + min-width: 20px; + subcontrol-position: center left; + border: 2px solid #242424; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +QSpinBox::down-arrow, +QDoubleSpinBox::down-arrow { + /* arrow for the up button */ + image: url(./Paper/Dark/Arrows/down.svg); +} + +QSpinBox::down-button:hover, +QDoubleSpinBox::down-button:hover { + /* down button on spinboxes when moused-over */ + background: #3D3D3D; +} + +/* Sliders */ + +QSlider::groove { + /* sliders */ + height: 0px; + border: 1px solid #3D3D3D; +} + +QSlider::handle { + /* slider handles */ + background: #141414; + border: 2px solid #3D3D3D; + border-radius: 6px; + margin: -10px; +} + +QSlider::handle:hover { + /* Slider handles when moused-over */ + background: #3D3D3D; +} + +/* Downloads Tab */ + +#downloadTab QAbstractScrollArea { + /* background of the entire downloads tab */ + background: #242424; +} + +DownloadListWidget QFrame, +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel { + /* an entry on the Downloads tab */ + background: #141414; +} + +DownloadListWidget#frame { + /* outer box of an entry on the Downloads tab */ + border: none; +} + +#installLabel { + /* installed/done label */ + color: none; +} + +/* Compact Downloads View */ + +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel { + /* an entry on the Downloads tab */ + background: #141414; +} + +/* Categories Filter */ + +#displayCategoriesBtn { + /* Filter button */ + min-width: 12px; +} + +#categoriesList { + /* Categories panel */ + min-width: 200px; + margin-bottom: 4px; +} + +#categoriesGroup { + /* Categories group box */ + padding-bottom: 0px; +} + +/* Fixes */ + +#executablesListBox::item { + /* fixes the black text problem on the Modify Executables window */ + color: #D3D3D3; +} \ No newline at end of file diff --git a/src/stylesheets/Paper Light by 6788.qss b/src/stylesheets/Paper Light by 6788.qss new file mode 100644 index 00000000..36585291 --- /dev/null +++ b/src/stylesheets/Paper Light by 6788.qss @@ -0,0 +1,973 @@ +/* v4.3 Paper Light by 6788-00 */ +/* https://6788-00.tumblr.com/ */ + +/* Color Palette */ +/* Background - Main | #EBEBEB */ +/* Background - Content | #FFFFFF */ +/* Background - Alternate | #F6F6F6 */ +/* Hover | #C2C2C2 */ +/* Selected | #008484 */ + +/* All */ + +* { + color: #000000; + font-size: 12px; +} + +/* Main Window */ + +QWidget { + /* most of the window */ + background: #EBEBEB; + color: #000000; +} + +QWidget:disabled { + /* disabled parts of the window like the update button when there are no updates */ + background: #EBEBEB; + color: #808080; +} + +QAbstractItemView { + /* left and right pane container */ + background: #FFFFFF; + alternate-background-color: #F6F6F6; + show-decoration-selected: 1; + selection-background-color: #008484; + selection-color: #FFFFFF; +} + +QAbstractItemView::item:hover { + /* rows on left and right pane when moused-over */ + background: #C2C2C2; +} + +QAbstractItemView::item:selected { + /* rows on left and right pane when clicked */ + background: #008484; + color: #FFFFFF; +} + +QAbstractScrollArea::corner { + /* corner between where a vertical scrollbar and a horizontal scrollbar meet */ + background: #FFFFFF; + border: 2px solid #EBEBEB; + border-bottom-right-radius: 6px; + margin: 0px -2px -2px 0px; +} + +QSplitter { + width: 8px; +} + +/* Toolbar */ + +QToolBar { + /* top toolbar; */ + background: #EBEBEB; + border: 1px solid #EBEBEB; +} + +QToolBar::separator { + /* uncertain, assumed: vertical seperator on toolbar left of the warnings button*/ + background: #EBEBEB; + margin: 6px 8px; +} + +QToolButton { + /* toolbar buttons */ + padding: 6px; + border-radius: 10px; + margin: 4px 4px 0px 4px; +} + +QToolButton:hover { + /* toolbar buttons when moused-over; */ + background: #008484; +} + +QToolButton:pressed { + /* toolbar buttons when clicked; */ + background: #008484; +} + +QToolButton:menu-indicator { + /* expandable indicator on toolbar buttons */ + image: url(./Paper/Light/Arrows/down.svg); + margin: 4px; +} + +/* Toolbar Button Icons */ + +#actionChange_Game { + qproperty-icon: url(./Paper/Light/Toolbar/instances.svg); +} + +#actionInstallMod { + qproperty-icon: url(./Paper/Light/Toolbar/archives.svg); +} + +#actionNexus { + qproperty-icon: url(./Paper/Light/Toolbar/nexus.svg); +} + +#actionAdd_Profile { + qproperty-icon: url(./Paper/Light/Toolbar/profiles.svg); +} + +#actionModify_Executables { + qproperty-icon: url(./Paper/Light/Toolbar/executables.svg); +} + +#actionTool { + qproperty-icon: url(./Paper/Light/Toolbar/tools.svg); +} + +#actionSettings { + qproperty-icon: url(./Paper/Light/Toolbar/settings.svg); +} + +#actionProblems { + qproperty-icon: url(./Paper/Light/Toolbar/problems.svg); +} + +#actionUpdate { + qproperty-icon: url(./Paper/Light/Toolbar/update.svg); +} + +#actionHelp { + qproperty-icon: url(./Paper/Light/Toolbar/help.svg); +} + +/* Left Pane & File Trees */ + +ModListView, PluginListView { + /* Mods List and Plugins List specifically */ + margin: 4px 0px; +} + +QTreeView { + /* left pane and right pane under QAbstractItemView*/ + border-radius: 6px; +} + +QTreeView::branch:hover { + /* rows on the left pane when moused-over (below QAbstractItemView, i.e. to the left of the checkbox) */ + background: #C2C2C2; + color: #FFFFFF; +} + +QTreeView::branch:selected { + /* rows on the left pane when clicked (below QAbstractItemView, i.e. to the left of the checkbox) */ + background: #008484; + color: #FFFFFF; +} + +QTreeView::item:selected { + /* rows on the left pane when selected */ + background: #008484; + color: #FFFFFF; +} + +QTreeView::branch:closed:has-children:has-siblings, +QTreeView::branch:closed:has-children:!has-siblings { + /* a branch that is closed */ + image: url(./Paper/Light/Arrows/right.svg); +} + +QTreeView::branch:open:has-children:has-siblings, +QTreeView::branch:open:has-children:!has-siblings { + /* a branch that is open */ + image: url(./Paper/Light/Arrows/down.svg); +} + +QListView { + /* saves window */ + border-radius: 6px; +} + +QListView::item { + /* Increases the line height of the Saves tab */ + padding: 2px 0px; +} + +QListView::item:hover { + /* uncertain, assumed: rows on the saves window when moused-over */ + background: #C2C2C2; + padding: 2px 0px; +} + +QListView::item:selected { + /*uncertain, assumed: rows on the saves window when clicked */ + background: #008484; + color: #FFFFFF; + padding: 2px 0px; +} + +QTextEdit { + /* large text fields */ + background: #FFFFFF; + border-radius: 6px; +} + +QWebView { + /* Nexus Info window */ + background: #FFFFFF; + border-radius: 6px; +} + +/* Group Boxes */ + +QGroupBox { + /* boxes that group multiple elements together (e.g. on Settings) */ + padding: 24px 4px; + border: 2px solid #FFFFFF; + border-radius: 10px; +} + +QGroupBox::title { + /* title of group boxes */ + background: transparent; + subcontrol-origin: padding; + subcontrol-position: top left; + padding: 8px; +} + +/* Text Fields */ + +QLineEdit { + /* text fields like NameFilter and directory fields */ + background: #FFFFFF; + min-height: 14px; + padding: 2px; + border: 2px solid #FFFFFF; + border-radius: 6px; +} + +QLineEdit:hover { + /* text fields when moused-over */ + border: 2px solid #008484; +} + +/* Most Dropdown Menus */ + +QComboBox { + /* dropdown menus */ + background: #FFFFFF; + min-height: 20px; + padding-left: 5px; + border: 2px solid #FFFFFF; + border-radius: 6px; + margin: 4px 0px; +} + +QComboBox:hover { + /* dropdown menus when moused-over */ + border: 2px solid #008484; +} + +QComboBox:on { + /* dropdown menus when expanded */ + background: #008484; + color: #FFFFFF; + border: 2px solid #008484; +} + +QComboBox::drop-down { + /* area for expandable indicator */ + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; +} + +QComboBox QAbstractItemView { + /* actual menu that expands */ + background: #FFFFFF; + border: 2px solid #EBEBEB; + border-radius: 6px; +} + +QComboBox::down-arrow { + /* expandable indicator */ + image: url(./Paper/Light/Arrows/down.svg); +} + +/* Most Buttons */ + +QPushButton { + /* most buttons */ + background: #FFFFFF; + color: #000000; + min-height: 20px; + padding: 2px 12px; + border-radius: 6px; +} + +QPushButton:disabled { + /* most buttons when disabled */ + border: 2px solid #FFFFFF; +} + +QPushButton:hover { + /* most buttons when hovered */ + background: #008484; + color: #FFFFFF; +} + +QPushButton:pressed { + /* most buttons when clicked */ + background: #008484; + color: #FFFFFF; +} + +QPushButton::menu-indicator { + /* expandable indicator for most buttons */ + subcontrol-position: right center; + image: url(./Paper/Light/Arrows/down.svg); + padding: 2px; + margin: 4px 4px; +} + +/* Icons */ + +#listOptionsBtn { + /* Options button */ + qproperty-icon: url(./Paper/Light/dots.svg); + qproperty-iconSize: 16px; + padding-left: 2px; +} + +#openFolderMenu { + /* Open Folder button */ + qproperty-icon: url(./Paper/Light/folder.svg); + qproperty-iconSize: 14px; + padding-left: 4px; +} + +#restoreModsButton, +#restoreButton { + /* Restore Backup buttons */ + qproperty-icon: url(./Paper/Light/restore.svg); + qproperty-iconSize: 14px; +} + +#saveModsButton, +#saveButton { + /* Backup buttons */ + qproperty-icon: url(./Paper/Light/backup.svg); + qproperty-iconSize: 14px; +} + +#bossButton { + /* Sort button */ + qproperty-icon: url(./Paper/Light/sort.svg); + qproperty-iconSize: 14px; +} + +#linkButton { + /* Shortcuts button */ + qproperty-icon: url(./Paper/Light/shortcut.svg); + qproperty-iconSize: 14px; +} + +#refreshButton, +#btnRefreshData, +#btnRefreshDownloads { + /* Refresh buttons */ + qproperty-icon: url(./Paper/Light/refresh.svg); + qproperty-iconSize: 14px; +} + +#endorseBtn { + /* Endorse button on the Nexus Info tab of the Information window */ + qproperty-icon: url(./Paper/Light/heart.svg); + qproperty-iconSize: 14px; +} + +#clearCacheButton { + /* Clear Cache button on the Nexus tab of the Settings window */ + qproperty-icon: url(./Paper/Light/cross.svg); + qproperty-iconSize: 14px; +} + +#deactivateESP, +#activateESP { + /* activate and deactivate ESP buttons */ + background: #FFFFFF; +} + +#deactivateESP:hover, +#activateESP:hover { + /* activate and deactivate ESP buttons when moused-over */ + background: #008484; +} + +#deactivateESP { + /* icon for the deactivate ESP button */ + qproperty-icon: url(./Paper/Light/backup.svg); +} + +#activateESP { + /* icon for the activate ESP button */ + qproperty-icon: url(./Paper/Light/restore-alt.svg); +} + +/* Run button */ + +#startButton { + /* Run button */ + background: #008484; + color: #FFFFFF; + qproperty-icon: url(./Paper/Light/run.svg); + qproperty-iconSize: 30px; + padding: 6px; +} + +#startButton:hover { + /* Run button when moused-over*/ + background: #C2C2C2; +} + +/* Scroll Bars */ + +/* Horizontal */ + +QScrollBar:horizontal { + /* horizontal scroll bar */ + background: #FFFFFF; + height: 20px; + border: 2px solid #EBEBEB; + margin: 0px 23px -2px 23px; +} + +QScrollBar::handle:horizontal { + /* handle for horizontal scroll bars */ + background: #C2C2C2; + min-width: 32px; + border-radius: 6px; + margin: 2px; +} + +QScrollBar::add-line:horizontal { + /* scroll right button */ + background: #FFFFFF; + image: url(./Paper/Light/Arrows/right.svg); + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; + border: 2px solid #EBEBEB; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:horizontal { + /* scroll left button */ + background: #FFFFFF; + image: url(./Paper/Light/Arrows/left.svg); + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; + border: 2px solid #EBEBEB; + border-bottom-left-radius: 6px; + margin: 0px 0px -2px -2px; +} + +/* Vertical */ + +QScrollBar:vertical { + /* vertical scroll bar */ + background: #FFFFFF; + width: 20px; + border: 2px solid #EBEBEB; + margin: 23px -2px 23px 0px; +} + +QScrollBar::handle:vertical { + /* handle for vertical scroll bars */ + background: #C2C2C2; + min-height: 32px; + border-radius: 6px; + margin: 2px; +} + +QScrollBar::add-line:vertical { + /* scroll down button */ + background: #FFFFFF; + image: url(./Paper/Light/Arrows/down.svg); + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; + border: 2px solid #EBEBEB; + border-bottom-right-radius: 6px; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:vertical { + /* scroll up button */ + background: #FFFFFF; + image: url(./Paper/Light/Arrows/up.svg); + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; + border: 2px solid #EBEBEB; + border-top-right-radius: 6px; + margin: -2px -2px 0px 0px; +} + +/* Combined */ + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover, +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + /* buttons and handles when moused-over */ + background: #008484; +} + +QScrollBar::handle:horizontal:pressed, +QScrollBar::handle:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { + /* buttons and handles when clicked */ + background: #008484; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + /* area on scroll bars where clicking it scrolls to where you clicked */ + background: transparent; +} + +/* Header Rows */ + +QHeaderView { + /* header row (i.e. Mod Name, Flags, Category, etc.) */ + background: #EBEBEB; +} + +QHeaderView::section { + /* each section on the header row (i.e. Mod name is one section and Flags another) */ + background: #FFFFFF; + color: #000000; + height: 22px; + padding: 0px 5px; + border: 0px; + border-bottom: 2px solid #EBEBEB; + border-right: 2px solid #EBEBEB; +} + +QHeaderView::section:first { + /* first section on a header row */ + border-top-left-radius: 6px; +} + +QHeaderView::section:last { + /* last section on a header row */ + border-right: 0px; + border-top-right-radius: 6px; +} + +QHeaderView::section:hover { + /* a section on a header row when hovered */ + background: #C2C2C2; +} + +QHeaderView::up-arrow { + /* ascending sort indicator */ + image: url(./Paper/Light/Arrows/up.svg); + padding-right: 4px; + height: 10px; + width: 10px; +} + +QHeaderView::down-arrow { + /* descending sort indicator */ + image: url(./Paper/Light/Arrows/down.svg); + padding-right: 4px; + height: 10px; + width: 10px; +} + +/* Right Click Menus, Toolbar Dropdown Menus, & Tooltips */ + +QMenu { + /* right click menu */ + background: #FFFFFF; + border: 2px solid #EBEBEB; + border-radius: 6px; +} + +QMenu::item { + /* rows on right click menus */ + background: #FFFFFF; + padding: 5px 20px 5px 24px; +} + +QMenu::item:selected { + /* rows on right click menus when moused-over (i dunno) */ + background: #008484; + color: #FFFFFF; + border: 0px; + border-radius: 4px; +} + +QMenu::item:disabled { + /* unavailable rows on right click menus */ + background: #EBEBEB; + color: #808080; +} + +QMenu::separator { + /* seperators on right click menus */ + height: 2px; + background: #EBEBEB; +} + +QMenu::icon { + /* area for icons on right click menus */ + padding: 4px; +} + +QMenu::right-arrow { + /* submenu indicator */ + image: url(./Paper/Light/Arrows/right.svg); + padding-right: 5px; +} + +QMenu QPushButton { + /* Change Categories and Primary Categories buttons */ + background: #FFFFFF; + color: #000000; + padding: 2px 24px; + text-align: left; + border-radius: 0px; +} + +QMenu QPushButton:hover { + /* Change Categories and Primary Categories buttons when moused-over */ + border-radius: 6px; +} + +QMenu QCheckBox { + /* checkboxes on right click menus (change categories)*/ + background: #FFFFFF; + padding: 2px 6px; +} + +QMenu QCheckBox:hover { + /* checkboxes on right click menus when moused-over (change categories) */ + background: #C2C2C2; + color: #FFFFFF; +} + +QMenu QRadioButton { + /* radio buttons on right click menus (primary categories) */ + background: #FFFFFF; + padding: 2px 6px; +} + +QToolTip { + /* all tooltips */ + background: #FFFFFF; + border: 2px solid #EBEBEB; + border-radius: 6px; +} + +/* Progress Bars (Downloads) */ + +QProgressBar { + /* progress bars when downloading */ + background: #FFFFFF; + text-align: center; + border: 0px; + border-radius: 6px; + margin: 0px 10px; +} + +QProgressBar::chunk { + /* the loading part that moves on progress bars */ + background: #C2C2C2; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +/* Right Pane and Tab Bars */ + +QTabWidget::pane { + /* right pane */ + top: 1px; + padding: 2px 2px 10px 2px; + border: 2px solid #FFFFFF; + border-radius: 10px; +} + +QTabWidget QAbstractScrollArea::item { + padding: 2px; +} + +QTabWidget::tab-bar { + /* tabs */ + alignment: center; +} + +QTabBar::tab { + /* a tab */ + background: #FFFFFF; + color: #000000; + padding: 4px 1em; + border: 2px solid #FFFFFF; + margin: 3px 1px; +} + +QTabBar::tab:!selected { + /* a tab that is not clicked */ + background: #FFFFFF; + color: #000000; + border: 2px solid #FFFFFF; +} + +QTabBar::tab:disabled { + /* a tab that is disabled */ + background: #EBEBEB; + color: #808080; + border: 2px solid transparent; +} + +QTabBar::tab:selected { + /* a tab that is clicked */ + color: #FFFFFF; + background: #008484; + border: 2px solid #008484; +} + +QTabBar::tab:hover { + /* a tab when moused-over */ + background: #C2C2C2; + color: #000000; + border: 2px solid #C2C2C2; +} + +QTabBar::tab:first { + /* that first tab */ + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; +} + +QTabBar::tab:last { + /* the last tab */ + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} + +QTabBar QToolButton { + /* buttons to scroll between more tabs on a tab bar */ + background: #C2C2C2; + padding: 1px; + border-radius: 6px; + margin: 1px; +} + +QTabBar QToolButton:disabled { + /* buttons to scroll on a tab bar when it's unavailable */ + background: transparent; +} + +QLCDNumber { + /* LCD number on the Conflicts tab */ + background: #FFFFFF; + color: #008484; + border-radius: 6px; +} + +/* Tables (Configure Mod Categories) */ + +QTableView { + /* a table */ + gridline-color: #EBEBEB; + border: 0px; +} + +/* Checkboxes */ + +QTreeView::indicator:unchecked, +QCheckBox::indicator:unchecked, +QGroupBox::indicator:unchecked, +QRadioButton::indicator:unchecked { + /* a checkbox that is unchecked */ + image: url(./Paper/Light/unchecked.svg); + width: 14px; + height: 14px; +} + +QCheckBox::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:hover { + /* a checkbox that is unchecked when moused-over and clicked */ + image: url(./Paper/Light/unchecked-hover.svg); +} + +QTreeView::indicator:unchecked:selected { + image: url(./Paper/Light/unchecked-alt.svg); +} + +QTreeView::indicator:checked, +QCheckBox::indicator:checked, +QGroupBox::indicator:checked, +QRadioButton::indicator:checked { + /* a checkbox that is checked */ + image: url(./Paper/Light/check.svg); + width: 14px; + height: 14px; +} + +QCheckBox::indicator:checked:hover, +QRadioButton::indicator:checked:hover { + /* a checkbox that is checked when moused-over and clicked */ + image: url(./Paper/Light/check-alt.svg); +} + +QTreeView::indicator:checked:selected { + image: url(./Paper/Light/check-white.svg); +} + +QCheckBox::indicator:disabled { + /* a checkbox that is disabled */ + image: url(./Paper/Light/unchecked-disabled.svg); +} + +/* Spinboxes */ + +QSpinBox, +QDoubleSpinBox { + /* usually boxes for selecting numbers */ + min-height: 24px; + min-width: 60px; + background: #FFFFFF; + padding: 0px 2px; + border: 2px solid #EBEBEB; + border-radius: 6px; + margin: 0px -4px; +} + +QSpinBox::up-button, +QDoubleSpinBox::up-button { + /* up button on spinboxes */ + min-height: 28px; + min-width: 20px; + subcontrol-position: center right; + border: 2px solid #EBEBEB; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +QSpinBox::up-arrow, +QDoubleSpinBox::up-arrow { + /* arrow for the up button */ + image: url(./Paper/Light/Arrows/up.svg); +} + +QSpinBox::up-button:hover, +QDoubleSpinBox::up-button:hover { + /* up button on spinboxes when moused-over */ + background: #C2C2C2; +} + +QSpinBox::down-button, +QDoubleSpinBox::down-button { + /* down button on spinboxes */ + min-height: 28px; + min-width: 20px; + subcontrol-position: center left; + border: 2px solid #EBEBEB; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +QSpinBox::down-arrow, +QDoubleSpinBox::down-arrow { + /* arrow for the up button */ + image: url(./Paper/Light/Arrows/down.svg); +} + +QSpinBox::down-button:hover, +QDoubleSpinBox::down-button:hover { + /* down button on spinboxes when moused-over */ + background: #C2C2C2; +} + +/* Sliders */ + +QSlider::groove { + /* sliders */ + height: 0px; + border: 1px solid #008484; +} + +QSlider::handle { + /* slider handles */ + background: #FFFFFF; + border: 2px solid #008484; + border-radius: 6px; + margin: -10px; +} + +QSlider::handle:hover { + /* Slider handles when moused-over */ + background: #008484; +} + +/* Downloads Tab */ + +#downloadTab QAbstractScrollArea { + /* background of the entire downloads tab */ + background: #EBEBEB; +} + +DownloadListWidget QFrame, +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel { + /* an entry on the Downloads tab */ + background: #FFFFFF; +} + +DownloadListWidget #frame { + /* outer box of an entry on the Downloads tab */ + border: none; +} + +#installLabel { + /* installed/done label */ + color: none; +} + +/* Compact Downloads View */ + +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel { + /* an entry on the Downloads tab */ + background: #FFFFFF; +} + +/* Categories Filter */ + +#displayCategoriesBtn { + /* Filter button */ + min-width: 12px; +} + +#categoriesList { + /* Categories panel */ + min-width: 200px; + margin-bottom: 4px; +} + +#categoriesGroup { + /* Categories group box */ + padding-bottom: 0px; +} \ No newline at end of file diff --git a/src/stylesheets/Paper/Dark/Arrows/down.svg b/src/stylesheets/Paper/Dark/Arrows/down.svg new file mode 100644 index 00000000..21d34b87 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Arrows/down.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Arrows/left.svg b/src/stylesheets/Paper/Dark/Arrows/left.svg new file mode 100644 index 00000000..b4aa8784 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Arrows/left.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Arrows/right.svg b/src/stylesheets/Paper/Dark/Arrows/right.svg new file mode 100644 index 00000000..37c9c20b --- /dev/null +++ b/src/stylesheets/Paper/Dark/Arrows/right.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Arrows/up.svg b/src/stylesheets/Paper/Dark/Arrows/up.svg new file mode 100644 index 00000000..b5aed913 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Arrows/up.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/archives.svg b/src/stylesheets/Paper/Dark/Toolbar/archives.svg new file mode 100644 index 00000000..32758c87 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/archives.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/executables.svg b/src/stylesheets/Paper/Dark/Toolbar/executables.svg new file mode 100644 index 00000000..c1b815c2 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/executables.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/help.svg b/src/stylesheets/Paper/Dark/Toolbar/help.svg new file mode 100644 index 00000000..7f0024d5 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/help.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/instances.svg b/src/stylesheets/Paper/Dark/Toolbar/instances.svg new file mode 100644 index 00000000..c5e58489 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/instances.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/nexus.svg b/src/stylesheets/Paper/Dark/Toolbar/nexus.svg new file mode 100644 index 00000000..9bf09e14 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/nexus.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/problems.svg b/src/stylesheets/Paper/Dark/Toolbar/problems.svg new file mode 100644 index 00000000..6cb095aa --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/problems.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/profiles.svg b/src/stylesheets/Paper/Dark/Toolbar/profiles.svg new file mode 100644 index 00000000..3679449a --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/profiles.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/settings.svg b/src/stylesheets/Paper/Dark/Toolbar/settings.svg new file mode 100644 index 00000000..c58bd3dd --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/settings.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/tools.svg b/src/stylesheets/Paper/Dark/Toolbar/tools.svg new file mode 100644 index 00000000..ac492405 --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/tools.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/Toolbar/update.svg b/src/stylesheets/Paper/Dark/Toolbar/update.svg new file mode 100644 index 00000000..a6c272be --- /dev/null +++ b/src/stylesheets/Paper/Dark/Toolbar/update.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/backup.svg b/src/stylesheets/Paper/Dark/backup.svg new file mode 100644 index 00000000..f0010ea9 --- /dev/null +++ b/src/stylesheets/Paper/Dark/backup.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/check-alt.svg b/src/stylesheets/Paper/Dark/check-alt.svg new file mode 100644 index 00000000..90b924f0 --- /dev/null +++ b/src/stylesheets/Paper/Dark/check-alt.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/check.svg b/src/stylesheets/Paper/Dark/check.svg new file mode 100644 index 00000000..101ee45e --- /dev/null +++ b/src/stylesheets/Paper/Dark/check.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/cross.svg b/src/stylesheets/Paper/Dark/cross.svg new file mode 100644 index 00000000..ac286c08 --- /dev/null +++ b/src/stylesheets/Paper/Dark/cross.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/dots.svg b/src/stylesheets/Paper/Dark/dots.svg new file mode 100644 index 00000000..a746ec83 --- /dev/null +++ b/src/stylesheets/Paper/Dark/dots.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/folder.svg b/src/stylesheets/Paper/Dark/folder.svg new file mode 100644 index 00000000..84cebc66 --- /dev/null +++ b/src/stylesheets/Paper/Dark/folder.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/heart.svg b/src/stylesheets/Paper/Dark/heart.svg new file mode 100644 index 00000000..5a4cc1f1 --- /dev/null +++ b/src/stylesheets/Paper/Dark/heart.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/refresh.svg b/src/stylesheets/Paper/Dark/refresh.svg new file mode 100644 index 00000000..a81507d5 --- /dev/null +++ b/src/stylesheets/Paper/Dark/refresh.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/restore-alt.svg b/src/stylesheets/Paper/Dark/restore-alt.svg new file mode 100644 index 00000000..8f8c2a43 --- /dev/null +++ b/src/stylesheets/Paper/Dark/restore-alt.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/restore.svg b/src/stylesheets/Paper/Dark/restore.svg new file mode 100644 index 00000000..0511e182 --- /dev/null +++ b/src/stylesheets/Paper/Dark/restore.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/run.svg b/src/stylesheets/Paper/Dark/run.svg new file mode 100644 index 00000000..008b2ccc --- /dev/null +++ b/src/stylesheets/Paper/Dark/run.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/shortcut.svg b/src/stylesheets/Paper/Dark/shortcut.svg new file mode 100644 index 00000000..27a3497a --- /dev/null +++ b/src/stylesheets/Paper/Dark/shortcut.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/sort.svg b/src/stylesheets/Paper/Dark/sort.svg new file mode 100644 index 00000000..372bc1cd --- /dev/null +++ b/src/stylesheets/Paper/Dark/sort.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/unchecked-alt.svg b/src/stylesheets/Paper/Dark/unchecked-alt.svg new file mode 100644 index 00000000..4f5bbd04 --- /dev/null +++ b/src/stylesheets/Paper/Dark/unchecked-alt.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/unchecked-disabled.svg b/src/stylesheets/Paper/Dark/unchecked-disabled.svg new file mode 100644 index 00000000..befdeba1 --- /dev/null +++ b/src/stylesheets/Paper/Dark/unchecked-disabled.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Dark/unchecked.svg b/src/stylesheets/Paper/Dark/unchecked.svg new file mode 100644 index 00000000..41c91aa6 --- /dev/null +++ b/src/stylesheets/Paper/Dark/unchecked.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Arrows/down.svg b/src/stylesheets/Paper/Light/Arrows/down.svg new file mode 100644 index 00000000..106b64a5 --- /dev/null +++ b/src/stylesheets/Paper/Light/Arrows/down.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Arrows/left.svg b/src/stylesheets/Paper/Light/Arrows/left.svg new file mode 100644 index 00000000..063012ef --- /dev/null +++ b/src/stylesheets/Paper/Light/Arrows/left.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Arrows/right.svg b/src/stylesheets/Paper/Light/Arrows/right.svg new file mode 100644 index 00000000..21d222e2 --- /dev/null +++ b/src/stylesheets/Paper/Light/Arrows/right.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Arrows/up.svg b/src/stylesheets/Paper/Light/Arrows/up.svg new file mode 100644 index 00000000..967f3185 --- /dev/null +++ b/src/stylesheets/Paper/Light/Arrows/up.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/archives.svg b/src/stylesheets/Paper/Light/Toolbar/archives.svg new file mode 100644 index 00000000..cdc3d5a8 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/archives.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/executables.svg b/src/stylesheets/Paper/Light/Toolbar/executables.svg new file mode 100644 index 00000000..64985f45 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/executables.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/help.svg b/src/stylesheets/Paper/Light/Toolbar/help.svg new file mode 100644 index 00000000..929cd6cd --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/help.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/instances.svg b/src/stylesheets/Paper/Light/Toolbar/instances.svg new file mode 100644 index 00000000..78361fe9 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/instances.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/nexus.svg b/src/stylesheets/Paper/Light/Toolbar/nexus.svg new file mode 100644 index 00000000..1715b626 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/nexus.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/problems.svg b/src/stylesheets/Paper/Light/Toolbar/problems.svg new file mode 100644 index 00000000..9d398ee2 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/problems.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/profiles.svg b/src/stylesheets/Paper/Light/Toolbar/profiles.svg new file mode 100644 index 00000000..5c074237 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/profiles.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/settings.svg b/src/stylesheets/Paper/Light/Toolbar/settings.svg new file mode 100644 index 00000000..c0d8ed7e --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/settings.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/tools.svg b/src/stylesheets/Paper/Light/Toolbar/tools.svg new file mode 100644 index 00000000..aae91d30 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/tools.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/Toolbar/update.svg b/src/stylesheets/Paper/Light/Toolbar/update.svg new file mode 100644 index 00000000..0d017fa3 --- /dev/null +++ b/src/stylesheets/Paper/Light/Toolbar/update.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/backup.svg b/src/stylesheets/Paper/Light/backup.svg new file mode 100644 index 00000000..37240d7e --- /dev/null +++ b/src/stylesheets/Paper/Light/backup.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/check-alt.svg b/src/stylesheets/Paper/Light/check-alt.svg new file mode 100644 index 00000000..c566a383 --- /dev/null +++ b/src/stylesheets/Paper/Light/check-alt.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/check-white.svg b/src/stylesheets/Paper/Light/check-white.svg new file mode 100644 index 00000000..d3f7893d --- /dev/null +++ b/src/stylesheets/Paper/Light/check-white.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/check.svg b/src/stylesheets/Paper/Light/check.svg new file mode 100644 index 00000000..70701759 --- /dev/null +++ b/src/stylesheets/Paper/Light/check.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/cross.svg b/src/stylesheets/Paper/Light/cross.svg new file mode 100644 index 00000000..399525b0 --- /dev/null +++ b/src/stylesheets/Paper/Light/cross.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/dots.svg b/src/stylesheets/Paper/Light/dots.svg new file mode 100644 index 00000000..02e61276 --- /dev/null +++ b/src/stylesheets/Paper/Light/dots.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/folder.svg b/src/stylesheets/Paper/Light/folder.svg new file mode 100644 index 00000000..888464f7 --- /dev/null +++ b/src/stylesheets/Paper/Light/folder.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/heart.svg b/src/stylesheets/Paper/Light/heart.svg new file mode 100644 index 00000000..ffff0a5b --- /dev/null +++ b/src/stylesheets/Paper/Light/heart.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/refresh.svg b/src/stylesheets/Paper/Light/refresh.svg new file mode 100644 index 00000000..5a1ee108 --- /dev/null +++ b/src/stylesheets/Paper/Light/refresh.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/restore-alt.svg b/src/stylesheets/Paper/Light/restore-alt.svg new file mode 100644 index 00000000..9f53e511 --- /dev/null +++ b/src/stylesheets/Paper/Light/restore-alt.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/restore.svg b/src/stylesheets/Paper/Light/restore.svg new file mode 100644 index 00000000..33aea044 --- /dev/null +++ b/src/stylesheets/Paper/Light/restore.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/run.svg b/src/stylesheets/Paper/Light/run.svg new file mode 100644 index 00000000..008b2ccc --- /dev/null +++ b/src/stylesheets/Paper/Light/run.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/shortcut.svg b/src/stylesheets/Paper/Light/shortcut.svg new file mode 100644 index 00000000..45c9a748 --- /dev/null +++ b/src/stylesheets/Paper/Light/shortcut.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/sort.svg b/src/stylesheets/Paper/Light/sort.svg new file mode 100644 index 00000000..94b5a4f1 --- /dev/null +++ b/src/stylesheets/Paper/Light/sort.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/unchecked-alt.svg b/src/stylesheets/Paper/Light/unchecked-alt.svg new file mode 100644 index 00000000..ae3c96b4 --- /dev/null +++ b/src/stylesheets/Paper/Light/unchecked-alt.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/unchecked-disabled.svg b/src/stylesheets/Paper/Light/unchecked-disabled.svg new file mode 100644 index 00000000..1c9fd840 --- /dev/null +++ b/src/stylesheets/Paper/Light/unchecked-disabled.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/unchecked-hover.svg b/src/stylesheets/Paper/Light/unchecked-hover.svg new file mode 100644 index 00000000..7e3683dc --- /dev/null +++ b/src/stylesheets/Paper/Light/unchecked-hover.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Light/unchecked.svg b/src/stylesheets/Paper/Light/unchecked.svg new file mode 100644 index 00000000..9e1f8b08 --- /dev/null +++ b/src/stylesheets/Paper/Light/unchecked.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + -- cgit v1.3.1 From 9b9a1f435e33074e6573317ea947c617be484190 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 20:37:59 -0600 Subject: Add v1.1 Paper Automata theme by 6788 --- src/stylesheets/Paper Automata.qss | 939 +++++++++++++++++++++ src/stylesheets/Paper/Automata/Arrows/down.svg | 97 +++ src/stylesheets/Paper/Automata/Arrows/left.svg | 97 +++ src/stylesheets/Paper/Automata/Arrows/right.svg | 97 +++ src/stylesheets/Paper/Automata/Arrows/up.svg | 97 +++ .../Paper/Automata/Toolbar/archives.svg | 99 +++ .../Paper/Automata/Toolbar/executables.svg | 99 +++ src/stylesheets/Paper/Automata/Toolbar/help.svg | 128 +++ .../Paper/Automata/Toolbar/instances.svg | 98 +++ src/stylesheets/Paper/Automata/Toolbar/nexus.svg | 122 +++ .../Paper/Automata/Toolbar/problems.svg | 132 +++ .../Paper/Automata/Toolbar/profiles.svg | 112 +++ .../Paper/Automata/Toolbar/settings.svg | 95 +++ src/stylesheets/Paper/Automata/Toolbar/tools.svg | 117 +++ src/stylesheets/Paper/Automata/Toolbar/update.svg | 141 ++++ src/stylesheets/Paper/Automata/background.svg | 99 +++ src/stylesheets/Paper/Automata/backup.svg | 126 +++ src/stylesheets/Paper/Automata/branch.svg | 99 +++ src/stylesheets/Paper/Automata/collapsed.svg | 97 +++ src/stylesheets/Paper/Automata/cross.svg | 94 +++ src/stylesheets/Paper/Automata/dots.svg | 111 +++ src/stylesheets/Paper/Automata/expanded.svg | 104 +++ src/stylesheets/Paper/Automata/folder.svg | 94 +++ src/stylesheets/Paper/Automata/heart.svg | 111 +++ src/stylesheets/Paper/Automata/refresh.svg | 103 +++ src/stylesheets/Paper/Automata/restore-alt.svg | 126 +++ src/stylesheets/Paper/Automata/restore.svg | 94 +++ src/stylesheets/Paper/Automata/run.svg | 109 +++ src/stylesheets/Paper/Automata/shortcut.svg | 94 +++ src/stylesheets/Paper/Automata/sort.svg | 125 +++ 30 files changed, 4056 insertions(+) create mode 100644 src/stylesheets/Paper Automata.qss create mode 100644 src/stylesheets/Paper/Automata/Arrows/down.svg create mode 100644 src/stylesheets/Paper/Automata/Arrows/left.svg create mode 100644 src/stylesheets/Paper/Automata/Arrows/right.svg create mode 100644 src/stylesheets/Paper/Automata/Arrows/up.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/archives.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/executables.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/help.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/instances.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/nexus.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/problems.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/profiles.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/settings.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/tools.svg create mode 100644 src/stylesheets/Paper/Automata/Toolbar/update.svg create mode 100644 src/stylesheets/Paper/Automata/background.svg create mode 100644 src/stylesheets/Paper/Automata/backup.svg create mode 100644 src/stylesheets/Paper/Automata/branch.svg create mode 100644 src/stylesheets/Paper/Automata/collapsed.svg create mode 100644 src/stylesheets/Paper/Automata/cross.svg create mode 100644 src/stylesheets/Paper/Automata/dots.svg create mode 100644 src/stylesheets/Paper/Automata/expanded.svg create mode 100644 src/stylesheets/Paper/Automata/folder.svg create mode 100644 src/stylesheets/Paper/Automata/heart.svg create mode 100644 src/stylesheets/Paper/Automata/refresh.svg create mode 100644 src/stylesheets/Paper/Automata/restore-alt.svg create mode 100644 src/stylesheets/Paper/Automata/restore.svg create mode 100644 src/stylesheets/Paper/Automata/run.svg create mode 100644 src/stylesheets/Paper/Automata/shortcut.svg create mode 100644 src/stylesheets/Paper/Automata/sort.svg (limited to 'src') diff --git a/src/stylesheets/Paper Automata.qss b/src/stylesheets/Paper Automata.qss new file mode 100644 index 00000000..748e589e --- /dev/null +++ b/src/stylesheets/Paper Automata.qss @@ -0,0 +1,939 @@ +/* v1.1 Paper Automata by 6788-00 */ +/* https://6788-00.tumblr.com/ */ + +/* Color Palette */ +/* Background - Main | #CDC8B0 */ +/* Background - Content | #DAD4BB */ +/* Hover | #B4AF9A */ +/* Selected | #4E4B42 */ +/* Accent | #CD664D */ + +/* All */ + +* { + color: #4E4B42; + font-size: 13px; +} + +/* Main Window */ + +QMainWindow, +QDialog { + /* most windows */ + background: url(./Paper/Automata/background.svg); +} + +QWidget:disabled { + /* disabled parts of the window like the update button when there are no updates */ + background: url(./Paper/Automata/background.svg); + color: #B4AF9A; +} + +QSplitter { + /* for resizing the left pane, right pane, or log console */ + height: 2px; + width: 8px; +} + +QSplitter::handle:horizontal { + /* horizontal handle */ + background: transparent; +} + +QSplitter::handle { + /* actual visible handle */ + background: #4E4B42; + margin-top: 6px; +} + +QAbstractItemView { + /* left and right pane container */ + background: #DAD4BB; + alternate-background-color: transparent; + show-decoration-selected: 1; + selection-background-color: #B4AF9A; + selection-color: #4E4B42; +} + +QAbstractItemView::item:hover { + /* rows on left and right pane when moused-over */ + background: #B4AF9A; +} + +QAbstractItemView::item:selected { + /* rows on left and right pane when clicked */ + background: #4E4B42; + color: #CDC8B0; +} + +QAbstractScrollArea::corner { + /* corner between where a vertical scrollbar and a horizontal scrollbar meet */ + background: #4E4B42; + border: 2px solid #4E4B42; + margin: 0px -2px -2px 0px; +} + +/* Toolbar */ + +QToolBar { + /* top toolbar; */ + border-bottom: 2px solid #4E4B42; + margin-left: 12px; + margin-right: 12px; +} + +QToolBar QWidget { + background: transparent; + margin: 0px; +} + +QToolButton { + /* toolbar buttons */ + padding: 4px 6px; + border: 2px solid transparent; + margin: 4px 4px 0px 4px; +} + +QToolButton:hover, +QToolButton:pressed { + background: #B4AF9A; + border-bottom: 2px solid #4E4B42; +} + +QToolButton:menu-indicator { + /* expandable indicator on toolbar buttons */ + image: url(./Paper/Automata/Arrows/down.svg); + margin: 4px; +} + +QToolButton QMenu { + /* toolbar button dropdown menus */ + margin: 0px; +} + +/* Toolbar Button Icons */ + +#actionChange_Game { + qproperty-icon: url(./Paper/Automata/Toolbar/instances.svg); +} + +#actionInstallMod { + qproperty-icon: url(./Paper/Automata/Toolbar/archives.svg); +} + +#actionNexus { + qproperty-icon: url(./Paper/Automata/Toolbar/nexus.svg); +} + +#actionAdd_Profile { + qproperty-icon: url(./Paper/Automata/Toolbar/profiles.svg); +} + +#actionModify_Executables { + qproperty-icon: url(./Paper/Automata/Toolbar/executables.svg); +} + +#actionTool { + qproperty-icon: url(./Paper/Automata/Toolbar/tools.svg); +} + +#actionSettings { + qproperty-icon: url(./Paper/Automata/Toolbar/settings.svg); +} + +#actionProblems { + qproperty-icon: url(./Paper/Automata/Toolbar/problems.svg); +} + +#actionUpdate { + qproperty-icon: url(./Paper/Automata/Toolbar/update.svg); +} + +#actionHelp { + qproperty-icon: url(./Paper/Automata/Toolbar/help.svg); +} + +/* Left Pane & File Trees */ + +QTreeView { + /* left pane and right pane under QAbstractItemView*/ + border: none; +} + +QTreeView::branch:has-siblings:!adjoins-item{ + background: none; +} + +QTreeView::branch:closed:has-children:has-siblings, +QTreeView::branch:closed:has-children:!has-siblings { + /* a branch that is closed */ + image: url(./Paper/Automata/collapsed.svg) center no-repeat; +} + +QTreeView::branch:open:has-children:has-siblings, +QTreeView::branch:open:has-children:!has-siblings { + /* a branch that is open */ + image: url(./Paper/Automata/expanded.svg) center no-repeat; +} + +QTreeView::branch:hover { + background: #B4AF9A; +} + +QTreeView::branch:selected { + /* rows on the left pane when clicked (below QAbstractItemView, i.e. to the left of the checkbox) */ + background: #4E4B42; + color: #CDC8B0; +} + +QTreeView::item:selected { + /* entry on left pane when clicked */ + background: #4E4B42; + color: #CDC8B0; +} + +QListView { + /* saves window */ + border: none; +} + +QListView::item:hover { + /* uncertain, assumed: rows on the saves window when moused-over */ + background: #B4AF9A; +} + +QListView::item:selected { + /*uncertain, assumed: rows on the saves window when clicked */ + background: #4E4B42; + color: #FFFFFF; +} + +QTextEdit { + /* large text fields */ + background: #DAD4BB; + border: none; +} + +QWebView { + /* Nexus Info window */ + background: #DAD4BB; + border-radius: 0px; +} + +/* Group Boxes */ + +QGroupBox { + /* boxes that group multiple elements together (e.g. on Settings) */ + padding: 24px 4px; + border: none; +} + +QGroupBox::title { + /* title of group boxes */ + background: transparent; + subcontrol-origin: padding; + subcontrol-position: top left; + padding: 8px; +} + +/* Text Fields */ + +QLineEdit { + /* text fields like NameFilter and directory fields */ + background: #DAD4BB; + min-height: 14px; + padding: 2px; + border: 2px solid #DAD4BB; + border-radius: 0px; +} + +QLineEdit:hover { + /* text fields when moused-over */ + background: 2px solid #B4AF9A; + border: 2px solid #B4AF9A; +} + +/* Most Dropdown Menus */ + +QComboBox { + /* dropdown menus */ + background: #DAD4BB; + min-height: 20px; + padding-left: 5px; + border: 2px solid #DAD4BB; + border-radius: 0px; + margin: 4px 0px; +} + +QComboBox:hover { + /* dropdown menus when moused-over */ + background: 2px solid #B4AF9A; + border: 2px solid #B4AF9A; +} + +QComboBox:on { + /* dropdown menus when expanded */ + background: #4E4B42; + color: #DAD4BB; + border: 2px solid #4E4B42; +} + +QComboBox::drop-down { + /* area for expandable indicator */ + width: 20px; + subcontrol-origin: padding; + subcontrol-position: top right; + border: none; +} + +QComboBox QAbstractItemView { + /* actual menu that expands */ + background: #DAD4BB; + border: 2px solid #CDC8B0; + border-radius: 0px; +} + +QComboBox::down-arrow { + /* expandable indicator */ + image: url(./Paper/Automata/Arrows/down.svg); +} + +/* Most Buttons */ + +QPushButton { + /* most buttons */ + background: #B4AF9A; + min-height: 20px; + padding: 2px 12px; + border-radius: 0px; +} + +QPushButton:disabled { + /* most buttons when disabled */ + background: transparent; + border: 2px solid #DAD4BB; +} + +QPushButton:hover { + /* most buttons when hovered */ + background: #DAD4BB; +} + +QPushButton:pressed { + /* most buttons when clicked */ + background: #4E4B42; + color: #DAD4BB; +} + +QPushButton::menu-indicator { + /* expandable indicator for most buttons */ + subcontrol-position: right center; + image: url(./Paper/Automata/Arrows/down.svg); + padding: 2px; + margin: 4px 4px; +} + +/* Icons */ + +QPushButton#listOptionsBtn { + /* Options button */ + qproperty-icon: url(./Paper/Automata/dots.svg); + qproperty-iconSize: 16px; + padding-left: 2px; +} + +QPushButton#openFolderMenu { + /* Open Folder button */ + qproperty-icon: url(./Paper/Automata/folder.svg); + qproperty-iconSize: 14px; + padding-left: 4px; +} + +QPushButton#restoreModsButton, +QPushButton#restoreButton { + /* Restore Backup buttons */ + qproperty-icon: url(./Paper/Automata/restore.svg); + qproperty-iconSize: 14px; +} + +QPushButton#saveModsButton, +QPushButton#saveButton { + /* Backup buttons */ + qproperty-icon: url(./Paper/Automata/backup.svg); + qproperty-iconSize: 14px; +} + +QPushButton#bossButton { + /* Sort button */ + qproperty-icon: url(./Paper/Automata/sort.svg); + qproperty-iconSize: 14px; +} + +QPushButton#linkButton { + /* Shortcuts button */ + qproperty-icon: url(./Paper/Automata/shortcut.svg); + qproperty-iconSize: 14px; +} + +QPushButton#btnRefreshData, +QPushButton#refreshButton { + /* Refresh buttons */ + qproperty-icon: url(./Paper/Automata/refresh.svg); + qproperty-iconSize: 14px; +} + +QPushButton#endorseBtn { + /* Endorse button on the Nexus Info tab of the Information window */ + qproperty-icon: url(./Paper/Automata/heart.svg); + qproperty-iconSize: 14px; +} + +QPushButton#clearCacheButton { + /* Clear Cache button on the Nexus tab of the Settings window */ + qproperty-icon: url(./Paper/Automata/cross.svg); + qproperty-iconSize: 14px; +} + +QToolButton#deactivateESP, +QToolButton#activateESP { + /* activate and deactivate ESP buttons */ + background: #DAD4BB; +} + +QToolButton:hover#deactivateESP, +QToolButton:hover#activateESP { + /* activate and deactivate ESP buttons when moused-over */ + background: #B4AF9A; +} + +QToolButton#deactivateESP { + /* icon for the deactivate ESP button */ + qproperty-icon: url(./Paper/Automata/backup.svg); +} + +QToolButton#activateESP { + /* icon for the activate ESP button */ + qproperty-icon: url(./Paper/Automata/restore-alt.svg); +} + +/* Run button */ + +QPushButton#startButton { + /* Run button */ + background: #4E4B42; + color: #DAD4BB; + qproperty-icon: url(./Paper/Automata/run.svg); + qproperty-iconSize: 30px; + padding: 6px; +} + +QPushButton:hover#startButton { + /* Run button when moused-over*/ + background: #B4AF9A; + color: #4E4B42; +} + +/* Scroll Bars */ + +/* Horizontal */ + +QScrollBar:horizontal { + /* horizontal scroll bar */ + background: #DAD4BB; + height: 18px; + border: 2px solid #DAD4BB; + margin: 0px 23px -2px 23px; +} + +QScrollBar::handle:horizontal { + /* handle for horizontal scroll bars */ + background: #4E4B42; + min-width: 32px; + margin: 2px; +} + +QScrollBar::add-line:horizontal { + /* scroll right button */ + background: #DAD4BB; + image: url(./Paper/Automata/Arrows/right.svg); + width: 23px; + subcontrol-position: right; + subcontrol-origin: margin; + border: 2px solid #CDC8B0; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:horizontal { + /* scroll left button */ + background: #DAD4BB; + image: url(./Paper/Automata/Arrows/left.svg); + width: 23px; + subcontrol-position: left; + subcontrol-origin: margin; + border: 2px solid #CDC8B0; + margin: 0px 0px -2px -2px; +} + +/* Vertical */ + +QScrollBar:vertical { + /* vertical scroll bar */ + background: #DAD4BB; + width: 18px; + border: 2px solid #CDC8B0; + margin: 23px -2px 23px 0px; +} + +QScrollBar::handle:vertical { + /* handle for vertical scroll bars */ + background: #4E4B42; + min-height: 32px; + margin: 2px; +} + +QScrollBar::add-line:vertical { + /* scroll down button */ + background: #DAD4BB; + image: url(./Paper/Automata/Arrows/down.svg); + height: 23px; + subcontrol-position: bottom; + subcontrol-origin: margin; + border: 2px solid #CDC8B0; + border-bottom-right-radius: 0px; + margin: 0px -2px -2px 0px; +} + +QScrollBar::sub-line:vertical { + /* scroll up button */ + background: #B4AF9A; + image: url(./Paper/Automata/Arrows/up.svg); + height: 23px; + subcontrol-position: top; + subcontrol-origin: margin; + border: 2px solid #CDC8B0; + border-top-right-radius: 0px; + margin: -2px -2px 0px 0px; +} + +/* Combined */ + +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:vertical:hover, +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, +QScrollBar::sub-line:vertical:hover { + /* buttons and handles when moused-over */ + background: #B4AF9A; +} + +QScrollBar::handle:horizontal:pressed, +QScrollBar::handle:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, +QScrollBar::sub-line:vertical:pressed { + /* buttons and handles when clicked */ + background: #4E4B42; +} + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + /* area on scroll bars where clicking it scrolls to where you clicked */ + background: transparent; +} + +/* Header Rows */ + +QHeaderView { + /* header row (i.e. Mod Name, Flags, Category, etc.) */ + background: #B4AF9A; +} + +QHeaderView::section { + /* each section on the header row (i.e. Mod name is one section and Flags another) */ + background: #B4AF9A; + height: 22px; + padding: 0px 5px; + border: 0px; + border-bottom: 2px solid #CDC8B0; + border-right: 2px solid #CDC8B0; +} + +QHeaderView::section:hover { + /* a section on a header row when hovered */ + background: #B4AF9A; +} + +QHeaderView::up-arrow { + /* ascending sort indicator */ + image: url(./Paper/Automata/Arrows/up.svg); + padding-right: 4px; + height: 10px; + width: 10px; +} + +QHeaderView::down-arrow { + /* descending sort indicator */ + image: url(./Paper/Automata/Arrows/down.svg); + padding-right: 4px; + height: 10px; + width: 10px; +} + +QHeaderView::section:last { + margin-right: -2px; +} + +/* Right Click Menus, Toolbar Dropdown Menus, & Tooltips */ + +QMenu { + /* right click menu */ + background: #DAD4BB; + border: 2px solid #CDC8B0; +} + +QMenu::item { + /* rows on right click menus */ + background: #DAD4BB; + padding: 5px 20px 5px 24px; +} + +QMenu::item:selected { + /* rows on right click menus when moused-over (i dunno) */ + background: #B4AF9A; + border: none; +} + +QMenu::item:disabled { + /* unavailable rows on right click menus */ + background: #CDC8B0; + color: #B4AF9A; +} + +QMenu::separator { + /* seperators on right click menus */ + height: 2px; + background: #CDC8B0; +} + +QMenu::icon { + /* area for icons on right click menus */ + padding: 4px; +} + +QMenu::right-arrow { + /* submenu indicator */ + image: url(./Paper/Automata/Arrows/right.svg); + padding-right: 5px; +} + +QMenu QPushButton { + /* Change Categories and Primary Categories buttons */ + background: #DAD4BB; + padding: 2px 24px; + text-align: left; + border: none; +} + +QMenu QPushButton:hover { + /* Change Categories and Primary Categories buttons when moused-over */ + background: #B4AF9A; + border: none; +} + +QMenu QCheckBox { + /* checkboxes on right click menus (change categories)*/ + background: #DAD4BB; + padding: 2px 6px; +} + +QMenu QCheckBox:hover { + /* checkboxes on right click menus when moused-over (change categories) */ + background: #B4AF9A; +} + +QMenu QRadioButton { + /* radio buttons on right click menus (primary categories) */ + background: #DAD4BB; + padding: 2px 6px; +} + +QToolTip { + /* all tooltips */ + background: #DAD4BB; + border: 2px solid #CDC8B0; +} + +/* Progress Bars (Downloads) */ + +QProgressBar { + /* progress bars when downloading */ + background: #DAD4BB; + text-align: center; + border: 0px; + margin: 0px 10px; +} + +QProgressBar::chunk { + /* the loading part that moves on progress bars */ + background: #CD664D; +} + +/* Right Pane and Tab Bars */ + +QTabWidget::pane { + /* right pane */ + top: 1px; + padding: 2px 2px 3px 2px; + border-top: 2px solid #4E4B42; +} + +QTabWidget::tab-bar { + /* tabs */ + alignment: center; +} + +QTabBar::tab { + /* a tab */ + background: #B4AF9A; + padding: 4px 1em; + border: 2px solid #DAD4BB; + margin: 3px 1px; +} + +QTabBar::tab:!selected { + /* an unselected tab */ + background: #B4AF9A; + border: 2px solid #B4AF9A; +} + +QTabBar::tab:disabled { + /* An unavailable tab */ + background: transparent; + color: #B4AF9A; + border: transparent; +} + +QTabBar::tab:selected { + /* a clicked tab */ + color: #CDC8B0; + background: #4E4B42; + border: 2px solid #4E4B42; +} + +QTabBar::tab:hover { + /* a tab when hovered */ + background: #DAD4BB; + color: #4E4B42; + border: 2px solid #DAD4BB; +} + +QTabBar QToolButton { + /* buttons to scroll between more tabs on a tab bar */ + background: #CD664D; + padding: 0px; + margin: 3px; +} + +QTabBar QToolButton:disabled { + /* buttons to scroll on a tab bar when it's unavailable */ + background: transparent; + border: 2px solid transparent; +} + +QLCDNumber { + /* LCD number on the Conflicts tab */ + background: #DAD4BB; + color: #CD664D; + border: none; +} + +/* Tables (Configure Mod Categories) */ + +QTableView { + /* tables */ + gridline-color: #CDC8B0; + border: 0px; +} + +/* Checkboxes */ + +QCheckBox::indicator { + /* a checkbox */ + width: 12px; + height: 12px; +} + +QCheckBox::indicator:disabled, +QRadioButton::indicator:disabled { + /* a checkbox that is disabled */ + background: none; + border: 2px solid #B4AF9A; +} + +QTreeView::indicator:unchecked, +QCheckBox::indicator:unchecked, +QGroupBox::indicator:unchecked, +QRadioButton::indicator:unchecked { + /* a checkbox when unchecked */ + border: 2px solid #4E4B42; +} + +QCheckBox::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:hover { + /* a checkbox that is unchecked when moused-over */ + background: #B4AF9A; +} + +QTreeView::indicator:unchecked:selected, +QRadioButton::indicator:unchecked:selected { + /* a checkbox that is unchecked when clicked */ + image: url(./Paper/Automata/unchecked-alt.svg); +} + +QTreeView::indicator:checked, +QCheckBox::indicator:checked, +QGroupBox::indicator:checked, +QRadioButton::indicator:checked { + /* a checkbox when checked */ + background: #CD664D; + border: 2px solid #CD664D; +} + +QCheckBox::indicator:checked:hover, +QRadioButton::indicator:checked:hover { + /* a checkbox that is checked when moused-over */ + border: 2px solid #4E4B42; +} + +/* Spinboxes */ + +QSpinBox, +QDoubleSpinBox { + /* usually boxes for selecting numbers */ + min-height: 24px; + min-width: 60px; + background: #DAD4BB; + padding: 0px 2px; + border: 2px solid #CDC8B0; + margin: 0px -4px; +} + +QSpinBox::up-button, +QDoubleSpinBox::up-button { + /* up button on spinboxes */ + min-height: 28px; + min-width: 18px; + subcontrol-position: center right; + border: 2px solid #CDC8B0; +} + +QSpinBox::up-arrow, +QDoubleSpinBox::up-arrow { + /* arrow for the up button */ + image: url(./Paper/Automata/Arrows/up.svg); +} + +QSpinBox::up-button:hover, +QDoubleSpinBox::up-button:hover { + /* up button on spinboxes when moused-over */ + background: #B4AF9A; +} + +QSpinBox::down-button, +QDoubleSpinBox::down-button { + /* down button on spinboxes */ + min-height: 28px; + min-width: 18px; + subcontrol-position: center left; + border: 2px solid #CDC8B0; +} + +QSpinBox::down-arrow, +QDoubleSpinBox::down-arrow { + /* arrow for the up button */ + image: url(./Paper/Automata/Arrows/down.svg); +} + +QSpinBox::down-button:hover, +QDoubleSpinBox::down-button:hover { + /* down button on spinboxes when moused-over */ + background: #B4AF9A; +} + +/* Sliders */ + +QSlider::groove { + /* sliders */ + height: 0px; + border: 1px solid #B4AF9A; +} + +QSlider::handle { + /* slider handles */ + background: #DAD4BB; + border: 2px solid #4E4B42; + border-radius: 0px; + margin: -10px; +} + +QSlider::handle:hover { + /* Slider handles when moused-over */ + background: #4E4B42; +} + +/* Downloads Tab */ + +QWidget#downloadTab QAbstractScrollArea, +DownloadListWidget { + /* background of the entire downloads tab */ + background: transparent; +} + +DownloadListWidget QFrame, +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel { + /* an entry on the Downloads tab */ + background: #DAD4BB; +} + +DownloadListWidget QFrame#frame { + /* outer box of an entry on the Downloads tab */ + border: 2px solid #DAD4BB; +} + +DownloadListWidget QLabel#installLabel { + /* installed/done label */ + color: none; +} + +/* Compact Downloads View */ + +DownloadListWidgetCompact, +DownloadListWidgetCompact QLabel { + /* an entry on the Downloads tab */ + background: #DAD4BB; +} + +/* Categories Filter */ + +QPushButton#displayCategoriesBtn { + /* Filter button */ + min-width: 12px; +} + +QTreeWidget#categoriesList { + /* Categories panel */ + min-width: 200px; + margin-bottom: 4px; +} + +QGroupBox#categoriesGroup { + /* Categories group box */ + padding-bottom: 0px; +} + +/* For the Glory of Mankind */ \ No newline at end of file diff --git a/src/stylesheets/Paper/Automata/Arrows/down.svg b/src/stylesheets/Paper/Automata/Arrows/down.svg new file mode 100644 index 00000000..30f13836 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Arrows/down.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Arrows/left.svg b/src/stylesheets/Paper/Automata/Arrows/left.svg new file mode 100644 index 00000000..97094916 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Arrows/left.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Arrows/right.svg b/src/stylesheets/Paper/Automata/Arrows/right.svg new file mode 100644 index 00000000..5eaa99cf --- /dev/null +++ b/src/stylesheets/Paper/Automata/Arrows/right.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Arrows/up.svg b/src/stylesheets/Paper/Automata/Arrows/up.svg new file mode 100644 index 00000000..5fa569f4 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Arrows/up.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/archives.svg b/src/stylesheets/Paper/Automata/Toolbar/archives.svg new file mode 100644 index 00000000..c13182c9 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/archives.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/executables.svg b/src/stylesheets/Paper/Automata/Toolbar/executables.svg new file mode 100644 index 00000000..6c442f76 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/executables.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/help.svg b/src/stylesheets/Paper/Automata/Toolbar/help.svg new file mode 100644 index 00000000..2cab3931 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/help.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/instances.svg b/src/stylesheets/Paper/Automata/Toolbar/instances.svg new file mode 100644 index 00000000..4b0cd707 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/instances.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/nexus.svg b/src/stylesheets/Paper/Automata/Toolbar/nexus.svg new file mode 100644 index 00000000..852f0034 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/nexus.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/problems.svg b/src/stylesheets/Paper/Automata/Toolbar/problems.svg new file mode 100644 index 00000000..f3fed97c --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/problems.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/profiles.svg b/src/stylesheets/Paper/Automata/Toolbar/profiles.svg new file mode 100644 index 00000000..306c94f5 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/profiles.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/settings.svg b/src/stylesheets/Paper/Automata/Toolbar/settings.svg new file mode 100644 index 00000000..adc4ca7a --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/settings.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/tools.svg b/src/stylesheets/Paper/Automata/Toolbar/tools.svg new file mode 100644 index 00000000..555472e8 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/tools.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/Toolbar/update.svg b/src/stylesheets/Paper/Automata/Toolbar/update.svg new file mode 100644 index 00000000..28bef275 --- /dev/null +++ b/src/stylesheets/Paper/Automata/Toolbar/update.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/background.svg b/src/stylesheets/Paper/Automata/background.svg new file mode 100644 index 00000000..76468b68 --- /dev/null +++ b/src/stylesheets/Paper/Automata/background.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/backup.svg b/src/stylesheets/Paper/Automata/backup.svg new file mode 100644 index 00000000..1c55c45f --- /dev/null +++ b/src/stylesheets/Paper/Automata/backup.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/branch.svg b/src/stylesheets/Paper/Automata/branch.svg new file mode 100644 index 00000000..edabfeab --- /dev/null +++ b/src/stylesheets/Paper/Automata/branch.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/collapsed.svg b/src/stylesheets/Paper/Automata/collapsed.svg new file mode 100644 index 00000000..614cca6b --- /dev/null +++ b/src/stylesheets/Paper/Automata/collapsed.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/cross.svg b/src/stylesheets/Paper/Automata/cross.svg new file mode 100644 index 00000000..450623c3 --- /dev/null +++ b/src/stylesheets/Paper/Automata/cross.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/dots.svg b/src/stylesheets/Paper/Automata/dots.svg new file mode 100644 index 00000000..08d5139f --- /dev/null +++ b/src/stylesheets/Paper/Automata/dots.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/expanded.svg b/src/stylesheets/Paper/Automata/expanded.svg new file mode 100644 index 00000000..19f776d3 --- /dev/null +++ b/src/stylesheets/Paper/Automata/expanded.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/folder.svg b/src/stylesheets/Paper/Automata/folder.svg new file mode 100644 index 00000000..4ac83f47 --- /dev/null +++ b/src/stylesheets/Paper/Automata/folder.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/heart.svg b/src/stylesheets/Paper/Automata/heart.svg new file mode 100644 index 00000000..396fab55 --- /dev/null +++ b/src/stylesheets/Paper/Automata/heart.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/refresh.svg b/src/stylesheets/Paper/Automata/refresh.svg new file mode 100644 index 00000000..a148aa1d --- /dev/null +++ b/src/stylesheets/Paper/Automata/refresh.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/restore-alt.svg b/src/stylesheets/Paper/Automata/restore-alt.svg new file mode 100644 index 00000000..79f96c1a --- /dev/null +++ b/src/stylesheets/Paper/Automata/restore-alt.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/restore.svg b/src/stylesheets/Paper/Automata/restore.svg new file mode 100644 index 00000000..b5fbbee1 --- /dev/null +++ b/src/stylesheets/Paper/Automata/restore.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/run.svg b/src/stylesheets/Paper/Automata/run.svg new file mode 100644 index 00000000..e969e49f --- /dev/null +++ b/src/stylesheets/Paper/Automata/run.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/shortcut.svg b/src/stylesheets/Paper/Automata/shortcut.svg new file mode 100644 index 00000000..72b918ec --- /dev/null +++ b/src/stylesheets/Paper/Automata/shortcut.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/stylesheets/Paper/Automata/sort.svg b/src/stylesheets/Paper/Automata/sort.svg new file mode 100644 index 00000000..32c08366 --- /dev/null +++ b/src/stylesheets/Paper/Automata/sort.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + -- cgit v1.3.1 From 789e95ca58f19198375af7756a10a9d69fc70a13 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 20:47:29 -0600 Subject: Update VS2015 Themes by chintsu_kun to v2.0.2 --- src/stylesheets/vs15 Dark-Green.qss | 37 +++++++++++++++++----------------- src/stylesheets/vs15 Dark-Orange.qss | 39 ++++++++++++++++++------------------ src/stylesheets/vs15 Dark-Purple.qss | 39 ++++++++++++++++++------------------ src/stylesheets/vs15 Dark-Red.qss | 39 ++++++++++++++++++------------------ src/stylesheets/vs15 Dark-Yellow.qss | 39 ++++++++++++++++++------------------ src/stylesheets/vs15 Dark.qss | 38 +++++++++++++++++------------------ 6 files changed, 118 insertions(+), 113 deletions(-) (limited to 'src') diff --git a/src/stylesheets/vs15 Dark-Green.qss b/src/stylesheets/vs15 Dark-Green.qss index f1e3b4a9..5427b38a 100644 --- a/src/stylesheets/vs15 Dark-Green.qss +++ b/src/stylesheets/vs15 Dark-Green.qss @@ -2,11 +2,24 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 2.0.1 + Version: 2.0.2 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ +/* For some reason applying background-color or border fixes paddings properties */ +QListWidget::item { + border-width: 0; } + +/* Don't override install label on download widget. + MO2 assigns color depending on download state */ +#installLabel { + color: none; } + +/* Make `background-color` work for :hover, :focus and :pressed states */ +QToolButton { + border: none; } + /* Main Window */ QWidget { background-color: #2D2D30; @@ -15,11 +28,6 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings - properties. Otherwise padding is only applied when item is hovered */ -QListWidget::item { - border-width: 0; } - /* remove outline */ * { outline: 0; } @@ -97,7 +105,6 @@ QListView::item { color: #F1F1F1; } /* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ -/* Common */ QTextEdit, QWebView, QLineEdit, @@ -197,13 +204,9 @@ QToolButton { margin: 0 4px 0 4px; padding: 5px; } QToolButton:hover, QToolButton:focus { - background-color: #3E3E40; - /* need this to make background-color works*/ - border: none; } + background-color: #3E3E40; } QToolButton:pressed { - background-color: #009933; - /* need this to make background-color works*/ - border: none; } + background-color: #009933; } /* Group Boxes #QGroupBox */ QGroupBox { @@ -259,8 +262,7 @@ QPushButton::menu-indicator { subcontrol-position: center right; padding-right: 5%; } -/* dialog buttons */ -/* Common */ +/* Dialog buttons */ QDialog QPushButton, QSlider::handle:horizontal, QSlider::handle:vertical { @@ -297,7 +299,6 @@ QDialog QPushButton { padding-right: .5em; } /* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ -/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -580,7 +581,7 @@ QMenu QRadioButton { background-color: transparent; padding: 5px 2px; } -/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* Tool tips #QToolTip, #SaveGameInfoWidget */ QToolTip, SaveGameInfoWidget { background-color: #424245; @@ -634,7 +635,7 @@ QTabBar::tab:disabled { QTabBar::tab:selected:disabled { background-color: #3F3F46; } -/* scrollers */ +/* Scrollers */ QTabBar QToolButton { background-color: #333337; border-color: #3F3F46; diff --git a/src/stylesheets/vs15 Dark-Orange.qss b/src/stylesheets/vs15 Dark-Orange.qss index 0b3808e7..fe65ece0 100644 --- a/src/stylesheets/vs15 Dark-Orange.qss +++ b/src/stylesheets/vs15 Dark-Orange.qss @@ -1,13 +1,26 @@ +/*base*/ /*!************************************* VS15 Dark **************************************** Author: chintsu_kun - Version: 2.0.1 + Version: 2.0.2 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/*base*/ +/* For some reason applying background-color or border fixes paddings properties */ +QListWidget::item { + border-width: 0; } + +/* Don't override install label on download widget. + MO2 assigns color depending on download state */ +#installLabel { + color: none; } + +/* Make `background-color` work for :hover, :focus and :pressed states */ +QToolButton { + border: none; } + /* Main Window */ QWidget { background-color: #2D2D30; @@ -16,11 +29,6 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings - properties. Otherwise padding is only applied when item is hovered */ -QListWidget::item { - border-width: 0; } - /* remove outline */ * { outline: 0; } @@ -98,7 +106,6 @@ QListView::item { color: #F1F1F1; } /* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ -/* Common */ QTextEdit, QWebView, QLineEdit, @@ -198,13 +205,9 @@ QToolButton { margin: 0 4px 0 4px; padding: 5px; } QToolButton:hover, QToolButton:focus { - background-color: #3E3E40; - /* need this to make background-color works*/ - border: none; } + background-color: #3E3E40; } QToolButton:pressed { - background-color: #CC6600; - /* need this to make background-color works*/ - border: none; } + background-color: #CC6600; } /* Group Boxes #QGroupBox */ QGroupBox { @@ -260,8 +263,7 @@ QPushButton::menu-indicator { subcontrol-position: center right; padding-right: 5%; } -/* dialog buttons */ -/* Common */ +/* Dialog buttons */ QDialog QPushButton, QSlider::handle:horizontal, QSlider::handle:vertical { @@ -298,7 +300,6 @@ QDialog QPushButton { padding-right: .5em; } /* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ -/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -581,7 +582,7 @@ QMenu QRadioButton { background-color: transparent; padding: 5px 2px; } -/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* Tool tips #QToolTip, #SaveGameInfoWidget */ QToolTip, SaveGameInfoWidget { background-color: #424245; @@ -635,7 +636,7 @@ QTabBar::tab:disabled { QTabBar::tab:selected:disabled { background-color: #3F3F46; } -/* scrollers */ +/* Scrollers */ QTabBar QToolButton { background-color: #333337; border-color: #3F3F46; diff --git a/src/stylesheets/vs15 Dark-Purple.qss b/src/stylesheets/vs15 Dark-Purple.qss index 33212038..eb2e8b82 100644 --- a/src/stylesheets/vs15 Dark-Purple.qss +++ b/src/stylesheets/vs15 Dark-Purple.qss @@ -1,13 +1,26 @@ +/*base*/ /*!************************************* VS15 Dark **************************************** Author: chintsu_kun - Version: 2.0.1 + Version: 2.0.2 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/*base*/ +/* For some reason applying background-color or border fixes paddings properties */ +QListWidget::item { + border-width: 0; } + +/* Don't override install label on download widget. + MO2 assigns color depending on download state */ +#installLabel { + color: none; } + +/* Make `background-color` work for :hover, :focus and :pressed states */ +QToolButton { + border: none; } + /* Main Window */ QWidget { background-color: #2D2D30; @@ -16,11 +29,6 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings - properties. Otherwise padding is only applied when item is hovered */ -QListWidget::item { - border-width: 0; } - /* remove outline */ * { outline: 0; } @@ -98,7 +106,6 @@ QListView::item { color: #F1F1F1; } /* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ -/* Common */ QTextEdit, QWebView, QLineEdit, @@ -198,13 +205,9 @@ QToolButton { margin: 0 4px 0 4px; padding: 5px; } QToolButton:hover, QToolButton:focus { - background-color: #3E3E40; - /* need this to make background-color works*/ - border: none; } + background-color: #3E3E40; } QToolButton:pressed { - background-color: #7E2AD2; - /* need this to make background-color works*/ - border: none; } + background-color: #7E2AD2; } /* Group Boxes #QGroupBox */ QGroupBox { @@ -260,8 +263,7 @@ QPushButton::menu-indicator { subcontrol-position: center right; padding-right: 5%; } -/* dialog buttons */ -/* Common */ +/* Dialog buttons */ QDialog QPushButton, QSlider::handle:horizontal, QSlider::handle:vertical { @@ -298,7 +300,6 @@ QDialog QPushButton { padding-right: .5em; } /* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ -/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -581,7 +582,7 @@ QMenu QRadioButton { background-color: transparent; padding: 5px 2px; } -/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* Tool tips #QToolTip, #SaveGameInfoWidget */ QToolTip, SaveGameInfoWidget { background-color: #424245; @@ -635,7 +636,7 @@ QTabBar::tab:disabled { QTabBar::tab:selected:disabled { background-color: #3F3F46; } -/* scrollers */ +/* Scrollers */ QTabBar QToolButton { background-color: #333337; border-color: #3F3F46; diff --git a/src/stylesheets/vs15 Dark-Red.qss b/src/stylesheets/vs15 Dark-Red.qss index bc264fa0..ee363e0b 100644 --- a/src/stylesheets/vs15 Dark-Red.qss +++ b/src/stylesheets/vs15 Dark-Red.qss @@ -1,13 +1,26 @@ +/*base*/ /*!************************************* VS15 Dark **************************************** Author: chintsu_kun - Version: 2.0.1 + Version: 2.0.2 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/*base*/ +/* For some reason applying background-color or border fixes paddings properties */ +QListWidget::item { + border-width: 0; } + +/* Don't override install label on download widget. + MO2 assigns color depending on download state */ +#installLabel { + color: none; } + +/* Make `background-color` work for :hover, :focus and :pressed states */ +QToolButton { + border: none; } + /* Main Window */ QWidget { background-color: #2D2D30; @@ -16,11 +29,6 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings - properties. Otherwise padding is only applied when item is hovered */ -QListWidget::item { - border-width: 0; } - /* remove outline */ * { outline: 0; } @@ -98,7 +106,6 @@ QListView::item { color: #F1F1F1; } /* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ -/* Common */ QTextEdit, QWebView, QLineEdit, @@ -198,13 +205,9 @@ QToolButton { margin: 0 4px 0 4px; padding: 5px; } QToolButton:hover, QToolButton:focus { - background-color: #3E3E40; - /* need this to make background-color works*/ - border: none; } + background-color: #3E3E40; } QToolButton:pressed { - background-color: #990000; - /* need this to make background-color works*/ - border: none; } + background-color: #990000; } /* Group Boxes #QGroupBox */ QGroupBox { @@ -260,8 +263,7 @@ QPushButton::menu-indicator { subcontrol-position: center right; padding-right: 5%; } -/* dialog buttons */ -/* Common */ +/* Dialog buttons */ QDialog QPushButton, QSlider::handle:horizontal, QSlider::handle:vertical { @@ -298,7 +300,6 @@ QDialog QPushButton { padding-right: .5em; } /* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ -/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -581,7 +582,7 @@ QMenu QRadioButton { background-color: transparent; padding: 5px 2px; } -/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* Tool tips #QToolTip, #SaveGameInfoWidget */ QToolTip, SaveGameInfoWidget { background-color: #424245; @@ -635,7 +636,7 @@ QTabBar::tab:disabled { QTabBar::tab:selected:disabled { background-color: #3F3F46; } -/* scrollers */ +/* Scrollers */ QTabBar QToolButton { background-color: #333337; border-color: #3F3F46; diff --git a/src/stylesheets/vs15 Dark-Yellow.qss b/src/stylesheets/vs15 Dark-Yellow.qss index 6a67a327..08dbe758 100644 --- a/src/stylesheets/vs15 Dark-Yellow.qss +++ b/src/stylesheets/vs15 Dark-Yellow.qss @@ -1,13 +1,26 @@ +/*base*/ /*!************************************* VS15 Dark **************************************** Author: chintsu_kun - Version: 2.0.1 + Version: 2.0.2 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/*base*/ +/* For some reason applying background-color or border fixes paddings properties */ +QListWidget::item { + border-width: 0; } + +/* Don't override install label on download widget. + MO2 assigns color depending on download state */ +#installLabel { + color: none; } + +/* Make `background-color` work for :hover, :focus and :pressed states */ +QToolButton { + border: none; } + /* Main Window */ QWidget { background-color: #2D2D30; @@ -16,11 +29,6 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings - properties. Otherwise padding is only applied when item is hovered */ -QListWidget::item { - border-width: 0; } - /* remove outline */ * { outline: 0; } @@ -98,7 +106,6 @@ QListView::item { color: #F1F1F1; } /* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ -/* Common */ QTextEdit, QWebView, QLineEdit, @@ -198,13 +205,9 @@ QToolButton { margin: 0 4px 0 4px; padding: 5px; } QToolButton:hover, QToolButton:focus { - background-color: #3E3E40; - /* need this to make background-color works*/ - border: none; } + background-color: #3E3E40; } QToolButton:pressed { - background-color: #9A9A00; - /* need this to make background-color works*/ - border: none; } + background-color: #9A9A00; } /* Group Boxes #QGroupBox */ QGroupBox { @@ -260,8 +263,7 @@ QPushButton::menu-indicator { subcontrol-position: center right; padding-right: 5%; } -/* dialog buttons */ -/* Common */ +/* Dialog buttons */ QDialog QPushButton, QSlider::handle:horizontal, QSlider::handle:vertical { @@ -298,7 +300,6 @@ QDialog QPushButton { padding-right: .5em; } /* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ -/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -581,7 +582,7 @@ QMenu QRadioButton { background-color: transparent; padding: 5px 2px; } -/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* Tool tips #QToolTip, #SaveGameInfoWidget */ QToolTip, SaveGameInfoWidget { background-color: #424245; @@ -635,7 +636,7 @@ QTabBar::tab:disabled { QTabBar::tab:selected:disabled { background-color: #3F3F46; } -/* scrollers */ +/* Scrollers */ QTabBar QToolButton { background-color: #333337; border-color: #3F3F46; diff --git a/src/stylesheets/vs15 Dark.qss b/src/stylesheets/vs15 Dark.qss index f43e3631..8c4d354e 100644 --- a/src/stylesheets/vs15 Dark.qss +++ b/src/stylesheets/vs15 Dark.qss @@ -2,12 +2,24 @@ VS15 Dark **************************************** Author: chintsu_kun - Version: 2.0.1 + Version: 2.0.2 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ -/*base*/ +/* For some reason applying background-color or border fixes paddings properties */ +QListWidget::item { + border-width: 0; } + +/* Don't override install label on download widget. + MO2 assigns color depending on download state */ +#installLabel { + color: none; } + +/* Make `background-color` work for :hover, :focus and :pressed states */ +QToolButton { + border: none; } + /* Main Window */ QWidget { background-color: #2D2D30; @@ -16,11 +28,6 @@ QWidget { color: #656565; } /* Common */ -/* FIX: For some reason applying background-color or border fixes paddings - properties. Otherwise padding is only applied when item is hovered */ -QListWidget::item { - border-width: 0; } - /* remove outline */ * { outline: 0; } @@ -98,7 +105,6 @@ QListView::item { color: #F1F1F1; } /* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ -/* Common */ QTextEdit, QWebView, QLineEdit, @@ -198,13 +204,9 @@ QToolButton { margin: 0 4px 0 4px; padding: 5px; } QToolButton:hover, QToolButton:focus { - background-color: #3E3E40; - /* need this to make background-color works*/ - border: none; } + background-color: #3E3E40; } QToolButton:pressed { - background-color: #3399FF; - /* need this to make background-color works*/ - border: none; } + background-color: #3399FF; } /* Group Boxes #QGroupBox */ QGroupBox { @@ -260,8 +262,7 @@ QPushButton::menu-indicator { subcontrol-position: center right; padding-right: 5%; } -/* dialog buttons */ -/* Common */ +/* Dialog buttons */ QDialog QPushButton, QSlider::handle:horizontal, QSlider::handle:vertical { @@ -298,7 +299,6 @@ QDialog QPushButton { padding-right: .5em; } /* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ -/* common */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator, @@ -581,7 +581,7 @@ QMenu QRadioButton { background-color: transparent; padding: 5px 2px; } -/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* Tool tips #QToolTip, #SaveGameInfoWidget */ QToolTip, SaveGameInfoWidget { background-color: #424245; @@ -635,7 +635,7 @@ QTabBar::tab:disabled { QTabBar::tab:selected:disabled { background-color: #3F3F46; } -/* scrollers */ +/* Scrollers */ QTabBar QToolButton { background-color: #333337; border-color: #3F3F46; -- cgit v1.3.1 From 92cdf4124362478a60869b071d728a96a6a14566 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 20:48:16 -0600 Subject: Update Skyrim theme by chintsu_kun to v2.1.0 --- src/stylesheets/skyrim.qss | 234 +++++++++++++++++++++++---------------------- 1 file changed, 119 insertions(+), 115 deletions(-) (limited to 'src') diff --git a/src/stylesheets/skyrim.qss b/src/stylesheets/skyrim.qss index 4091bbe0..e4d87499 100644 --- a/src/stylesheets/skyrim.qss +++ b/src/stylesheets/skyrim.qss @@ -2,54 +2,77 @@ Skyrim **************************************** Author: chintsu_kun - Version: 2.0.1 + Version: 2.1.0 Licence: GNU General Public License v3.0 (https://www.gnu.org/licenses/gpl-3.0.en.html) Url: https://github.com/nikolay-borzov/modorganizer-themes **************************************** */ +/* For some reason applying background-color or border fixes paddings properties */ +QListWidget::item { + border-width: 0; } + +/* Don't override install label on download widget. + MO2 assigns color depending on download state */ +#installLabel { + color: none; } + +/* Make `background-color` work for :hover, :focus and :pressed states */ +QToolButton { + border: none; } + QWidget { background-color: #000; color: #F1F1F1; } -/* Common */ -/* FIX: For some reason applying background-color or border fixes paddings - properties */ -QListWidget::item { - border-width: 0; } - * { - /* remove outline */ + /* Remove outline */ outline: 0; - /* text highlight */ + /* Text highlight */ selection-background-color: #000; selection-color: white; } -/* disabled text */ +/* Disabled text */ *:disabled, QListView::item:disabled, *::item:selected:disabled { color: #656565; } -/* line heights */ +/* Line heights */ QListView::item, QTreeWidget::item, QTreeView::item { - padding: .3em 0; } + padding: 0.3em 0; } + +/* Increase row height to fit inputs */ +#modList::item, +#settingsTree::item, +#pluginSettingsList::item, +#espList::item { + min-height: 34px; + padding: 0; } + #modList::item QComboBox, + #modList::item QLineEdit, + #modList::item QComboBox:editable, + #modList::item QAbstractSpinBox, + #settingsTree::item QComboBox, + #settingsTree::item QLineEdit, + #settingsTree::item QComboBox:editable, + #settingsTree::item QAbstractSpinBox, + #pluginSettingsList::item QComboBox, + #pluginSettingsList::item QLineEdit, + #pluginSettingsList::item QComboBox:editable, + #pluginSettingsList::item QAbstractSpinBox, + #espList::item QComboBox, + #espList::item QLineEdit, + #espList::item QComboBox:editable, + #espList::item QAbstractSpinBox { + margin: 2px; } -/* -QTreeView#modList::item, -QTreeWidget#categoriesTree::item, -#tabConflicts QTreeWidget::item, -QListView::item, -QTreeView#espList::item, -QTreeView#treeContent::item { - padding: .3em 0; -}*/ QAbstractItemView { color: #C0C0C0; background-color: #000; alternate-background-color: #000; - border-color: #A6A8AB; } + border-color: #999; } QAbstractItemView, QListView, @@ -63,12 +86,6 @@ QTreeWidget::item:hover { color: #fff; background-color: #121212; } -QAbstractItemView::item:disabled:hover, -QListView::item:disabled:hover, -QTreeView::branch:disabled:hover, -QTreeWidget::item:disabled:hover { - background-color: red; } - QAbstractItemView::item:selected:disabled, QListView::item:selected:disabled, QTreeView::branch:selected:disabled, @@ -89,17 +106,12 @@ QTreeView::branch:closed:has-children { QTreeView::branch:open:has-children { image: url(./skyrim/branch-opened.png); } -/*QListView::item:hover { } -QListView::item:selected { }*/ QListView::item { color: #C0C0C0; } /* Text areas and text fields #QTextEdit, #QLineEdit, #QWebView */ -/* Common */ QLabel { background-color: transparent; } - QLabel#installLabel { - font-weight: bold; } /* Font size */ QLabel, @@ -114,14 +126,17 @@ QCheckBox, QRadioButton { font-size: 14px; } +/* Inputs */ QTextEdit, QLineEdit, QWebView, QComboBox, QComboBox:editable, QAbstractSpinBox { + min-height: 24px; border: none; - background-color: #141414; } + background-color: #141414; + padding: 3px 5px; } QTextEdit:hover, QTextEdit:focus, QLineEdit:hover, QLineEdit:focus, @@ -135,17 +150,11 @@ QAbstractSpinBox { QAbstractSpinBox:focus { background-color: #212121; } -QLineEdit, -QAbstractSpinBox { - min-height: 24px; - padding: 2px; - border: none; } - QLineEdit { margin-top: 0; - /* clear button */ - /* increase version textfield width */ - /* fix margins on tabs pane */ } + /* Clear button */ + /* Increase version text field width */ + /* Fix margins on tabs pane */ } QLineEdit QToolButton, QLineEdit QToolButton:hover { background: none; @@ -168,14 +177,8 @@ QLineEdit { /* Drop-downs #QComboBox*/ QComboBox { - min-height: 20px; padding-left: 5px; - margin: 3px 0 1px 0; - border-style: solid; } - QComboBox, QComboBox:editable { - border-width: 5px; - border-color: transparent; - border-image: url(./skyrim/border-image1.png) 6 repeat repeat; } + margin: 3px 0 1px 0; } QComboBox:on { background-color: #212121; } QComboBox:editable { @@ -200,9 +203,7 @@ QToolBar { QToolButton { margin: 0 4px 0 4px; padding: 5px; - /* need this to make background-color works*/ - border: none; - /* scrollers */ } + /* Scrollers */ } QToolButton:hover, QToolButton:focus { background-color: #121212; } QToolButton:pressed { @@ -225,9 +226,7 @@ QToolButton { QGroupBox { padding: 1em .3em .3em .3em; margin-top: .65em; - border-width: 5px; - border-color: transparent; - border-image: url(./skyrim/border-image2.png) 5 repeat repeat; } + border: 1px solid #999; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; @@ -236,7 +235,7 @@ QGroupBox { /* LCD Count */ QLCDNumber { - border-color: #A6A8AB; + border-color: #999; border-style: solid; border-width: 1px; } @@ -248,15 +247,12 @@ QPushButton { background-color: transparent; border-width: 0 15px 0 15px; border-color: transparent; - /*&:focus { }*/ - /* dialog buttons */ - /* show categories */ - /* run */ - /* unlock */ - /* mod info dialog images tab */ - /* add some space between buttons */ } + /* Dialog buttons */ + /* Show categories */ + /* Run */ + /* Mod info dialog images tab */ } QPushButton:hover, QPushButton:checked:hover { - border-image: url(./skyrim/button-border.png) 0 15 repeat; } + border-image: url(./skyrim/button-border.png) 0 15 no-repeat; } QPushButton:checked { border-image: url(./skyrim/button-checked-border.png) 0 15 repeat; } QPushButton:disabled { @@ -282,26 +278,17 @@ QPushButton { margin: 10px 20px; } QPushButton + QPushButton { margin: 10px 0 0 0; } - QWidget#tabImages QPushButton { + #tabImages QPushButton { background-color: transparent; border: none; margin: 0 .3em; padding: 0; } - QWidget#tabImages QPushButton:hover { + #tabImages QPushButton:hover { background-color: #121212; } - QDialog#QueryOverwriteDialog QPushButton { - margin-left: 0.5em; } - #ProfilesDialog QPushButton { - margin-bottom: 0.5em; } - #ProfilesDialog QPushButton#closeButton { - margin-bottom: 0; } - #EditExecutablesDialog QPushButton#addButton, - #EditExecutablesDialog QPushButton#removeButton { - margin-bottom: 0.5em; - margin-top: 1em; } - -/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ -/*common*/ + #settingsTree::item QPushButton { + border-image: none; } + +/* Check boxes and Radio buttons common #QCheckBox, #QRadioButton */ QGroupBox::indicator, QTreeView::indicator, QCheckBox::indicator { @@ -340,7 +327,7 @@ QCheckBox::indicator { QCheckBox::indicator:unchecked:disabled { image: url(./skyrim/checkbox-disabled.png); } -/* Checkboxes special */ +/* Check boxes special */ QTreeWidget#bsaList::indicator { width: 10px; height: 15px; } @@ -381,13 +368,14 @@ QAbstractSpinBox { image: url(./skyrim/arrow-down.png); } /* Scroll Bars #QAbstractScrollArea, #QScrollBar*/ -/* assigning background still leaves not filled area*/ +/* Assigning background still leaves not filled area */ QAbstractScrollArea::corner { background-color: transparent; } QScrollBar { background-color: transparent; - border: none; } + border: none; + /* Since QTextEdit:hover doesn't work set focus input background */ } QScrollBar:horizontal { height: 12px; border: none; @@ -433,6 +421,11 @@ QScrollBar { image: url(./skyrim/scrollbar-right.png); } QScrollBar::left-arrow:horizontal { image: url(./skyrim/scrollbar-left.png); } + QTextEdit QScrollBar::up-arrow:vertical, + QTextEdit QScrollBar::down-arrow:vertical, + QTextEdit QScrollBar::right-arrow:horizontal, + QTextEdit QScrollBar::left-arrow:horizontal { + background-color: #212121; } /* Scroll Area #QScrollArea*/ QScrollArea { @@ -464,7 +457,7 @@ QTableView { selection-color: #C0C0C0; } QTableView QTableCornerButton::section { background-color: transparent; - border-color: #A6A8AB; + border-color: #999; border-style: solid; border-width: 0 1px 1px 0; } @@ -472,7 +465,7 @@ QHeaderView { border: none; } QHeaderView::section { background-color: transparent; - border-color: #A6A8AB; + border-color: #999; /* 17px to have some place for sort indicator */ padding: 3px 17px 3px 5px; border-style: solid; } @@ -494,13 +487,9 @@ QHeaderView { QHeaderView::down-arrow { image: url(./skyrim/arrow-down.png); } -/* Context menus, toolbar dropdowns #QMenu */ +/* Context menus, toolbar drop-downs #QMenu */ QMenu { - background-color: transparent; - border-width: 17px; - border-style: solid; - border-color: transparent; - border-image: url(./skyrim/border-image.png) 27 repeat repeat; } + background-color: transparent; } QMenu::item, QMenu QPushButton { padding: 6px 20px; } @@ -520,7 +509,7 @@ QMenu { subcontrol-position: center right; padding-right: .5em; } QMenu QPushButton { - /* cancel styles */ + /* Cancel styles */ border: none; text-align: left; } QMenu QPushButton:hover { @@ -530,15 +519,11 @@ QMenu { background-color: transparent; padding: 5px 2px; } -/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* Tool tips #QToolTip, #SaveGameInfoWidget */ QToolTip { background-color: transparent; color: #C0C0C0; - padding: 0; - border-width: 17px; - border-style: solid; - border-color: transparent; - border-image: url(./skyrim/border-image.png) 27 repeat repeat; } + padding: 0; } SaveGameInfoWidget { background-color: #121212; @@ -554,22 +539,13 @@ QProgressBar { border-style: solid; border-color: transparent; border-image: url(./skyrim/progress-bar-border.png) 4 21 repeat repeat; } - -QProgressBar::chunk { - /* - background: url(./skyrim/progress-bar-chunk.png) center center repear-x qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #95BED9, stop:0.124153 #6EB9CE, stop:0.78781 #474E86); - */ - background: url(./skyrim/progress-bar-chunk.png) center center repear-x qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #95BED9, stop:0.78781 #6EB9CE); } + QProgressBar::chunk { + background: url(./skyrim/progress-bar-chunk.png) center center repeat-x qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #95BED9, stop:0.78781 #6EB9CE); } /* Right Pane and Tab Bars #QTabWidget, #QTabBar */ QTabWidget::pane { - border-color: #A6A8AB; - top: 0; - border-width: 5px; - border-color: transparent; - /*AL12: Changed the "5 repeat repeat" to "4 repeat repeat" as 5 seems to kill - performance for some reason.*/ - border-image: url(./skyrim/border-image2.png) 4 repeat repeat; } + border: none; + top: 0; } QTabBar { text-transform: uppercase; @@ -601,12 +577,17 @@ QListView, QTableView, QDialog#LockedDialog { border-width: 20px; - border-style: solid; + border-color: transparent; + border-image: url(./skyrim/border-image.png) 27 repeat repeat; } + +QMenu, +QToolTip { + border-width: 17px; border-color: transparent; border-image: url(./skyrim/border-image.png) 27 repeat repeat; } /* Special styles */ -/* increase categories tab width */ +/* Increase categories tab width */ QTreeWidget#categoriesList { min-width: 200px; } QTreeWidget#categoriesList::item { @@ -618,8 +599,25 @@ QTreeWidget#categoriesList { QTreeWidget#categoriesList::item:has-children:open { background-image: url(./skyrim/branch-opened.png); } -/* Dialogs width changes */ -/* increase width to prevent buttons cutting */ +/* Add some space around buttons */ +#QueryOverwriteDialog QPushButton { + margin-left: 0.5em; } + +#SimpleInstallDialog QPushButton { + margin-top: 0.5em; } + +#ProfilesDialog QPushButton { + margin-bottom: 0.5em; } + +#ProfilesDialog QPushButton#closeButton { + margin-bottom: 0; } + +#EditExecutablesDialog QPushButton#addButton, +#EditExecutablesDialog QPushButton#removeButton { + margin-bottom: 0.5em; + margin-top: 1em; } + +/* Increase dialogs width to prevent buttons cutting */ QDialog#QueryOverwriteDialog { min-width: 565px; } @@ -634,3 +632,9 @@ QDialog#EditExecutablesDialog { QDialog#SettingsDialog { min-width: 670px; } + +QDialog#CredentialsDialog { + min-width: 400px; } + +#pluginsList { + min-width: 260px; } -- cgit v1.3.1 From 3559364473dda5a0d37eb31431bd1b82c5b18c75 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 12 Dec 2018 02:46:51 -0600 Subject: Update translation file --- src/organizer_en.ts | 835 ++++++++++++++++++++++++++-------------------------- 1 file changed, 421 insertions(+), 414 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index e3d6729c..6700dea8 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -1980,7 +1980,7 @@ p, li { white-space: pre-wrap; } - + No Problems @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2050,773 +2050,773 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,22 +2837,22 @@ You can also use online editors and converters instead. - + failed to remove %1 - + failed to create %1 - + Restarting MO - + Changing the managed game directory requires restarting MO. Any pending downloads will be paused. @@ -2860,335 +2860,335 @@ Click OK to restart MO now. - + 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Open Origin in Explorer - + Open Origin Info... - + 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 - + Set the priority of the selected mods @@ -4071,148 +4071,148 @@ 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 - + Notes - - + + 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><tr><td><img src=":/MO/gui/content/modgroup" width=32/></td><td>ModGroup files</td></tr></table> - + Time this mod was installed - + User notes about the mod @@ -5471,7 +5471,8 @@ If the folder was still in use, restart MO and try again. - No game identified in "%1". The directory is required to contain the game binary and its launcher. + No game identified in "%1". The directory is required to contain the game binary. + No game identified in "%1". The directory is required to contain the game binary and its launcher. @@ -5491,7 +5492,7 @@ If the folder was still in use, restart MO and try again. - + Mod Organizer @@ -5506,18 +5507,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 @@ -5568,12 +5569,12 @@ If the folder was still in use, restart MO and try again. - + Script Extender - + Proxy DLL @@ -5787,28 +5788,28 @@ Select Show Details option to see the full change-log. - - + + attempt to store setting for unknown plugin "%1" - + Error - + Failed to create "%1", you may not have the necessary permission. path remains unchanged. - + Restart Mod Organizer? - + In order to reset the window geometries, MO must be restarted. Restart it now? @@ -5890,22 +5891,22 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - + Mod Contains selected Plugin - + Plugin is Contained in selected Mod - + Reset Colors - + Is overwritten (loose files) @@ -5915,138 +5916,144 @@ If you use pre-releases, never contact me directly by e-mail or via private mess + - + When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section. + + + + + Modify the categories available to arrange your mods. - + Configure Mod Categories - + Reset stored information from dialogs. - + This will make all dialogs show up again where you checked the "Remember selection"-box. - + Reset Dialogs - + If checked, the download interface will be more compact. - + Compact Download Interface - + If checked, the download list will display meta information instead of file names. - + Download Meta Information - + Paths - - - - + + + + ... - + Caches - + Overwrite - - + + Directory where downloads are stored. - + Downloads - + Profiles - + Directory where mods are stored. - + Directory where mods are stored. Please note that changing this will break all associations of profiles with mods that don't exist in the new location (with the same name). - + Mods - + Managed Game - + Base Directory - + Use %BASE_DIR% to refer to the Base Directory. - + Important: All directories have to be writeable! - + Nexus - + Allows automatic log-in when the Nexus-Page for the game is clicked. - + <!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; } @@ -6055,144 +6062,144 @@ p, li { white-space: pre-wrap; } - + If checked and if correct credentials are entered below, log-in to Nexus (for browsing and downloading) is automatic. - + Automatically Log-In to Nexus - - + + Username - - + + Password - + Remove cache and cookies. Forces a new login. - + Clear Cache - + Disable automatic internet features - + Disable automatic internet features. This does not affect features that are explicitly invoked by the user (like checking mods for updates, endorsing, opening the web browser) - + Offline Mode - + Use a proxy for network connections. - + Use a proxy for network connections. This uses the system-wide settings which can be configured in Internet Explorer. Please note that MO will start up a few seconds slower on some systems when using a proxy. - + Use HTTP Proxy (Uses System Settings) - + Associate with "Download with manager" links - + Known Servers (updated on download) - + Preferred Servers (Drag & Drop) - + Steam - + If you save your steam user ID and password here, they will be used when logging into steam. Note, however, your password will be stored unencrypted, so make sure your computer is secure. - + Plugins - + Author: - + Version: - + Description: - + Key - + Value - + Blacklisted Plugins (use <del> to remove): - + Workarounds - + Steam App ID - + The Steam AppID for your game - + <!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; } @@ -6208,17 +6215,17 @@ p, li { white-space: pre-wrap; } - + Load Mechanism - + Select loading mechanism. See help for details. - + Mod Organizer needs a dll to be injected into the game so all mods are visible to it. There are several means to do this: *Mod Organizer* (default) In this mode the Mod Organizer itself injects the dll. The disadvantage is that you always have to start the game through MO or a link created by it. @@ -6229,17 +6236,17 @@ If you use the Steam version of Oblivion the default will NOT work. In this case - + NMM Version - + The Version of Nexus Mod Manager to impersonate. - + Mod Organizer uses an API provided by the Nexus to provide features like checking for updates and downloading files. Unfortunately this API has not been made available officially to third party tools like MO so we have to impersonate the Nexus Mod Manager to be allowed in. On top of this Nexus has used the client identification to lock out outdated versions of NMM to force users to update. This means that MO also needs to impersonate the new version of NMM even if MO doesn't need an update. Therefore you can configure the version to identify as here. Please note that MO does identify itself as MO to the webserver, it's not lying about what it is. It is merely adding a "compatible" NMM version to the user agent. @@ -6248,44 +6255,44 @@ tl;dr-version: If Nexus-features don't work, insert the current version num - + Enforces that inactive ESPs and ESMs are never loaded. - + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - + Hide inactive ESPs/ESMs - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) - + If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) Uncheck this if you want to use Mod Organizer with total conversions (like Nehrim) but be aware that the game will crash if required files are not enabled. - + Force-enable game files - + Disable this to no longer display mods installed outside MO in the mod list (left pane). Assets from those mods will then be treated as having lowest mod priority together with the original game content. - + By default Mod Organizer will display esp+bsa bundles installed with foreign tools as mods (left pane). This allows you to control their priority in relation to other mods. This is particularly useful if you also use Steam Workshop to install mods. However, if you installed loose file mods outside MO which conflict with BSAs also installed outside MO those conflicts can't be resolved correctly. @@ -6293,35 +6300,35 @@ If you disable this feature, MO will only display official DLCs this way. Please - + Display mods installed outside MO - - + + Disable this to prevent the GUI from being locked when running an executable. This may result in abnormal behavior. - + Lock GUI when running executable - - + + For Skyrim, this can be used instead of Archive Invalidation. It should make AI redundant for all Profiles. For the other games this is not a sufficient replacement for AI! - + Back-date BSAs - + Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended @@ -6330,48 +6337,48 @@ programs you are intentionally running. - + Add executables to the blacklist to prevent them from accessing the virtual file system. This is useful to prevent unintended programs from being hooked. Hooking unintended programs may affect the execution of these programs or the programs you are intentionally running. - + Configure Executables Blacklist - - + + Resets the window geometries for all windows. This can be useful if a window becomes too small or too large, if a column becomes too thin or too wide, and in similar situations. - + Reset Window Geometries - + These are workarounds for problems with Mod Organizer. Please make sure you read the help text before changing anything here. - + Diagnostics - + Log Level - + Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log". "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6379,37 +6386,37 @@ programs you are intentionally running. - + Debug - + Info (recommended) - + Warning - + Error - + Crash Dumps - + Decides which type of crash dumps are collected when injected processes crash. - + Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6420,37 +6427,37 @@ programs you are intentionally running. - + None - + Mini (recommended) - + Data - + Full - + Max Dumps To Keep - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6458,12 +6465,12 @@ programs you are intentionally running. - + Hint: right click link and copy link location - + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. -- cgit v1.3.1 From 013890f644c264d7da0d7da1adcd3f289ebee377 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 12 Dec 2018 03:02:29 -0600 Subject: Remember the last separator color used --- src/mainwindow.cpp | 19 ++- src/organizer_en.ts | 435 ++++++++++++++++++++++++++-------------------------- 2 files changed, 234 insertions(+), 220 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 61a745b2..18ac60bf 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3049,10 +3049,21 @@ void MainWindow::createSeparator_clicked() void MainWindow::setColor_clicked() { + QSettings &settings = m_OrganizerCore.settings().directInterface(); ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); - QColor color = QColorDialog::getColor(modInfo->getColor(), this); - if (!color.isValid()) + QColorDialog dialog(this); + QColor currentColor = modInfo->getColor(); + QColor previousColor = settings.value("previousSeparatorColor", QColor()).value(); + if (currentColor.isValid()) + dialog.setCurrentColor(currentColor); + else + dialog.setCurrentColor(previousColor); + if (!dialog.exec()) + return; + currentColor = dialog.currentColor(); + if (!currentColor.isValid()) return; + settings.setValue("previousSeparatorColor", currentColor); QItemSelectionModel *selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { for (QModelIndex idx : selection->selectedRows()) { @@ -3060,12 +3071,12 @@ void MainWindow::setColor_clicked() auto flags = info->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) { - info->setColor(color); + info->setColor(currentColor); } } } else { - modInfo->setColor(color); + modInfo->setColor(currentColor); } } diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 6700dea8..44a386d6 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2281,16 +2281,16 @@ Right now this has very limited functionality - - + + failed to rename "%1" to "%2" - - - + + + Confirm @@ -2354,8 +2354,8 @@ Right now this has very limited functionality - - + + Create Mod... @@ -2367,7 +2367,7 @@ Please enter a name: - + A mod with this name already exists @@ -2388,435 +2388,435 @@ Please enter a name: - + 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,22 +2837,22 @@ You can also use online editors and converters instead. - + failed to remove %1 - + failed to create %1 - + Restarting MO - + Changing the managed game directory requires restarting MO. Any pending downloads will be paused. @@ -2860,335 +2860,335 @@ Click OK to restart MO now. - + 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Open Origin in Explorer - + Open Origin Info... - + 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 - + Set the priority of the selected mods @@ -5298,7 +5298,6 @@ If the folder was still in use, restart MO and try again. Enter a new name or select one from the suggested list: (This is just the name of the Instance, not the game selection) - Enter a new name or select one from the suggested list: @@ -5472,7 +5471,6 @@ If the folder was still in use, restart MO and try again. No game identified in "%1". The directory is required to contain the game binary. - No game identified in "%1". The directory is required to contain the game binary and its launcher. @@ -5513,7 +5511,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> @@ -5891,23 +5889,23 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - - Mod Contains selected Plugin + + Reset Colors - - Plugin is Contained in selected Mod + + Is overwritten (loose files) - - Reset Colors + + Mod Contains selected Plugin - - Is overwritten (loose files) + + Plugin is Contained in selected Mod @@ -5921,6 +5919,11 @@ If you use pre-releases, never contact me directly by e-mail or via private mess When this is enabled, the color defined for a separator will be shown on the mod list scrollbar at the location of the separator. This can be useful for quick navigation between separator sections or to a specific separator section. + + + Show mod list separator colors on the scrollbar + + @@ -6254,22 +6257,6 @@ Please note that MO does identify itself as MO to the webserver, it's not l tl;dr-version: If Nexus-features don't work, insert the current version number of NMM here and try again. - - - Enforces that inactive ESPs and ESMs are never loaded. - - - - - It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. -I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. - - - - - Hide inactive ESPs/ESMs - - If checked, files (i.e. esps, esms and bsas) belonging to the core game can not be disabled in the UI. (default: on) @@ -6304,6 +6291,22 @@ If you disable this feature, MO will only display official DLCs this way. Please Display mods installed outside MO + + + Enforces that inactive ESPs and ESMs are never loaded. + + + + + It seems that the Games occasionally load ESP or ESM files even if they haven't been activated as plugins. +I don't yet know what the circumstances are, but user reports imply it is in some cases unwanted. If this is checked, ESPs and ESMs not checked in the List are invisible to the game and can not be loaded. + + + + + Hide inactive ESPs/ESMs + + -- cgit v1.3.1 From 346bc630f8986e52101d51ac93e70154915c450a Mon Sep 17 00:00:00 2001 From: Al12rs Date: Wed, 12 Dec 2018 10:37:10 +0100 Subject: Create new Separators in last used color. --- src/mainwindow.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 18ac60bf..795f82cf 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3045,6 +3045,12 @@ void MainWindow::createSeparator_clicked() { m_OrganizerCore.modList()->changeModPriority(ModInfo::getIndex(name), newPriority); } + QSettings &settings = m_OrganizerCore.settings().directInterface(); + QColor previousColor = settings.value("previousSeparatorColor", QColor()).value(); + if (previousColor.isValid()) { + ModInfo::getByIndex(ModInfo::getIndex(name))->setColor(previousColor); + } + } void MainWindow::setColor_clicked() -- cgit v1.3.1 From 571347d2de03e25f35bb5d6010313ce9710da58b Mon Sep 17 00:00:00 2001 From: LePresidente Date: Wed, 12 Dec 2018 16:01:50 +0200 Subject: Pass DIR parameter to install exe, so installation directory matches current directory. --- src/selfupdater.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 2b051b09..7c0682bf 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -327,8 +327,10 @@ void SelfUpdater::installUpdate() const QString mopath = QDir::fromNativeSeparators(qApp->property("dataPath").toString()); + const std::wstring params = L"/DIR=" + qApp->applicationDirPath().toStdWString(); + HINSTANCE res = ::ShellExecuteW( - nullptr, L"open", m_UpdateFile.fileName().toStdWString().c_str(), nullptr, + nullptr, L"open", m_UpdateFile.fileName().toStdWString().c_str(), params.c_str(), nullptr, SW_SHOW); if (res > (HINSTANCE)32) { -- cgit v1.3.1 From efe657c23efa2913c0bd10cb2544881ebfb5a934 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Wed, 12 Dec 2018 16:28:01 +0100 Subject: Removed old styles --- src/stylesheets/Paper Dark by 6788-00.qss | 550 ----------------------------- src/stylesheets/Paper Light by 6788-00.qss | 541 ---------------------------- 2 files changed, 1091 deletions(-) delete mode 100644 src/stylesheets/Paper Dark by 6788-00.qss delete mode 100644 src/stylesheets/Paper Light by 6788-00.qss (limited to 'src') diff --git a/src/stylesheets/Paper Dark by 6788-00.qss b/src/stylesheets/Paper Dark by 6788-00.qss deleted file mode 100644 index 11f5b922..00000000 --- a/src/stylesheets/Paper Dark by 6788-00.qss +++ /dev/null @@ -1,550 +0,0 @@ -/* v3.0.1 Paper Dark by 6788-00 */ -/* https://6788-00.tumblr.com/ */ - -/* Main Window */ - -QWidget { - background: #222222; - color: #D3D3D3; -} - -QWidget:disabled { - background: #222222; - color: #808080; -} - -QMainWindow::separator { - border: 0px; -} - -QAbstractItemView { - background: #141414; - alternate-background-color: #1A1A1A; - show-decoration-selected: 1; - selection-background-color: #007272; - selection-color: #FFFFFF; -} - -QAbstractItemView::item:hover { - background: #007E7E; - color: #FFFFFF; -} - -QAbstractItemView::item:selected { - background: #007272; - color: #FFFFFF; -} - -QAbstractScrollArea::corner { - background: #141414; - border: 2px solid #222222; - border-bottom-right-radius: 6px; - margin: 0px -2px -2px 0px; -} - -/* Toolbar */ - -QToolBar { - background: #222222; - border: 1px solid #222222; -} - -QToolBar::separator { - background: #222222; -} - -QToolButton { - padding: 4px 6px; - border-radius: 6px; - margin: 4px 4px 0px 4px; -} - -QToolButton:hover { - background: #007E7E; -} - -QToolButton:pressed { - background: #007272; -} - -/* Left Pane & File Trees */ - -QTreeView { - border-radius: 6px; -} - -QTreeView::branch:hover { - background: #007E7E; - color: #FFFFFF; -} - -QTreeView::branch:selected { - background: #007272; - color: #FFFFFF; -} - -QTreeView::item:selected { - background: #007272; - color: #FFFFFF; -} - -QTreeView::branch:has-children:!has-siblings:closed, -QTreeView::branch:closed:has-children:has-siblings { - image: url(:/stylesheet/branch-closed.png); - border: 0px; -} - -QTreeView::branch:open:has-children:!has-siblings, -QTreeView::branch:open:has-children:has-siblings { - image: url(:/stylesheet/branch-open.png); - border: 0px; -} - -QListView { - border-radius: 6px; -} - -QListView::item:hover { - background: #007E7E; - color: #FFFFFF; -} - -QListView::item:selected { - background: #007272; - color: #FFFFFF; -} - -QTextEdit { - background: #141414; - border-radius: 6px; -} - -QWebView { - background: #141414; - border-radius: 6px; -} - -/* Group Boxes */ - -QGroupBox { - padding: 24px 4px; - border: 2px solid #141414; - border-radius: 10px; -} - -QGroupBox::title { - subcontrol-origin: padding; - subcontrol-position: top left; - padding: 8px; -} - -/* Search Boxes */ - -QLineEdit { - background: #141414; - min-height: 14px; - padding: 2px; - border: 2px solid #141414; - border-radius: 6px; - margin-top: 3px; -} - -QLineEdit:hover { - border: 2px solid #007E7E; -} - -/* Most Dropdowns */ - -QComboBox { - background: #141414; - min-height: 20px; - padding-left: 5px; - border: 2px solid #141414; - border-radius: 6px; - margin: 3px 0px 1px 0px; -} - -QComboBox:hover { - border: 2px solid #007E7E; -} - -QComboBox:on { - background: #007272; - color: #FFFFFF; - border: 2px solid #007272; -} - -QComboBox::drop-down { - width: 20px; - subcontrol-origin: padding; - subcontrol-position: top right; - border: none; -} - -QComboBox QAbstractItemView { - border: 0px; -} - -QComboBox::down-arrow { - image: url(:/stylesheet/combobox-down.png); -} - -/* Most Buttons */ - -QPushButton { - background: #141414; - color: #FFFFFF; - min-height: 18px; - padding: 2px 12px; - border-radius: 6px; -} - -QPushButton:hover { - background: #007E7E; - color: #FFFFFF; -} - -QPushButton:pressed { - background: #007272; - color: #FFFFFF; -} - -QPushButton:checked { - background: #007272; - color: #FFFFFF; - margin: 4px; -} - -/* Scroll Bars */ - -/* Horizontal */ - -QScrollBar:horizontal { - background: #141414; - height: 20px; - border: 2px solid #222222; - margin: 0px 23px -2px 23px; -} - -QScrollBar::handle:horizontal { - background: #222222; - min-width: 32px; - border-radius: 6px; - margin: 2px; -} - -QScrollBar::add-line:horizontal { - background: #141414; - width: 23px; - subcontrol-position: right; - subcontrol-origin: margin; - border: 2px solid #222222; - margin: 0px -2px -2px 0px; -} - -QScrollBar::sub-line:horizontal { - background: #141414; - width: 23px; - subcontrol-position: left; - subcontrol-origin: margin; - border: 2px solid #222222; - border-bottom-left-radius: 6px; - margin: 0px 0px -2px -2px; -} - -/* Vertical */ - -QScrollBar:vertical { - background: #141414; - width: 20px; - border: 2px solid #222222; - margin: 23px -2px 23px 0px; -} - -QScrollBar::handle:vertical { - background: #222222; - min-height: 32px; - border-radius: 6px; - margin: 2px; -} - -QScrollBar::add-line:vertical { - background: #141414; - height: 23px; - subcontrol-position: bottom; - subcontrol-origin: margin; - border: 2px solid #222222; - border-bottom-right-radius: 6px; - margin: 0px -2px -2px 0px; -} - -QScrollBar::sub-line:vertical { - background: #141414; - height: 23px; - subcontrol-position: top; - subcontrol-origin: margin; - border: 2px solid #222222; - border-top-right-radius: 6px; - margin: -2px -2px 0px 0px; -} - -/* Combined */ - -QScrollBar::handle:horizontal:hover, -QScrollBar::handle:vertical:hover, -QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, -QScrollBar::sub-line:vertical:hover { - background: #007E7E; -} - -QScrollBar::handle:horizontal:pressed, -QScrollBar::handle:vertical:pressed, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, -QScrollBar::sub-line:vertical:pressed { - background: #007272; -} - -QScrollBar::add-page:horizontal, -QScrollBar::sub-page:horizontal, -QScrollBar::add-page:vertical, -QScrollBar::sub-page:vertical { - background: transparent; -} - -QScrollBar::up-arrow:vertical, -QScrollBar::right-arrow:horizontal, -QScrollBar::down-arrow:vertical, -QScrollBar::left-arrow:horizontal { - height: 1px; - width: 1px; - border: 1px solid #222222; -} - -/* Header Rows */ - -QHeaderView { - background: #222222; -} - -QHeaderView::section { - background: #141414; - color: #D3D3D3; - height: 22px; - padding: 0px 5px; - border: 0px; - border-bottom: 2px solid #222222; - border-right: 2px solid #222222; -} - -QHeaderView::section:first { - border-top-left-radius: 6px; -} - -QHeaderView::section:last { - border-right: 0px; - border-top-right-radius: 6px; -} - -QHeaderView::section:hover { - background: #007E7E; - color: #FFFFFF; -} - -QHeaderView::down-arrow { - padding-right: 4px; - height: 10px; - width: 10px; -} - -/* Context Menus, Toolbar Dropdowns, & Tooltips */ - -QMenu { - background: #141414; - selection-color: #FFFFFF; - border: 0px; -} - -QMenu::item { - background: #141414; - selection-background-color: #007E7E; - padding: 4px 20px; -} - -QMenu::item:selected { - background: #007E7E; - color: #FFFFFF; -} - -QMenu::item:disabled { - background: #242424; - color: #808080; -} - -QMenu::separator { - background: #222222; - height: 2px; -} - -QMenu::icon { - margin: 1px; -} - -QToolTip { - background: #222222; - color: #FFFFFF; - padding: 1px; - border: 0px; -} - -/* Progress Bars (Downloads) */ - -QProgressBar { - background: #141414; - text-align: center; - border: 0px; - border-radius: 6px; - margin: 0px 10px; -} - -QProgressBar::chunk { - background: #007E7E; - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} - -/* Right Pane and Tab Bars */ - -QTabWidget::pane { - top: 1px; - padding: 2px 2px 10px 2px; - border: 2px solid #141414; - border-radius: 10px; -} - -QTabWidget::tab-bar { - alignment: center; -} - -QTabBar::tab { - background: #141414; - color: #141414; - padding: 4px 1em; - border: 1px solid #222222; - border-top: 0px; - border-bottom: 0px; -} - -QTabBar::tab:!selected { - background: #141414; - color: #D3D3D3; -} - -QTabBar::tab:disabled { - background: #222222; - color: #808080; -} - -QTabBar::tab:selected { - background: #007272; - color: #FFFFFF; - -} - -QTabBar::tab:!selected:hover { - background: #007E7E; - color: #FFFFFF; -} - -QTabBar::tab:first { - border-top-left-radius: 10px; - border-bottom-left-radius: 10px; -} - -QTabBar::tab:last { - border-top-right-radius: 10px; - border-bottom-right-radius: 10px; -} - -QTabBar QToolButton { - background: #007E7E; - padding: 1px; - border-radius: 6px; - margin: 1px; -} - -QTabBar QToolButton:disabled { - background: transparent; -} - -/* Sliders (Configurator) */ - -/* QSlider::groove:horizontal { - background: #FFFFFF; - height: 1px; - border: 1px solid #FFFFFF; -} - -QSlider::handle:horizontal { - background: #007E7E; - width: 10px; - border: 2px solid #007E7E; - border-radius: 6px; - margin: -10px 0px; -} - -QSlider::handle:horizontal:hover { - background: #007272; - border: 2px solid #007272; -} */ - -/* Tables (Configure Mod Categories) */ - -QTableView { - gridline-color: #222222; - border: 0px; -} - -QListWidget::item#executablesListBox { - /* fixes the black text problem on the Modify Executables window */ - color: #D3D3D3; -} - -/* downloads tab */ - -QWidget#downloadTab QAbstractScrollArea { - /* background of the entire downloads tab */ - background: #242424; -} - -DownloadListWidget QFrame, -DownloadListWidgetCompact, -DownloadListWidgetCompact QLabel { - /* an entry on the Downloads tab */ - background: #141414; -} - -DownloadListWidget QFrame#frame { - /* outer box of an entry on the Downloads tab */ - border: 2px solid #141414; -} - -DownloadListWidget QLabel#installLabel { - color: none; -} - -DownloadListWidget QFrame:clicked { - background: #007E7E; -} - -/* compact downloads view */ - -DownloadListWidgetCompact, -DownloadListWidgetCompact QLabel { - /* an entry on the Downloads tab */ - background: #141414; - padding: 4px; -} \ No newline at end of file diff --git a/src/stylesheets/Paper Light by 6788-00.qss b/src/stylesheets/Paper Light by 6788-00.qss deleted file mode 100644 index 5f6e2867..00000000 --- a/src/stylesheets/Paper Light by 6788-00.qss +++ /dev/null @@ -1,541 +0,0 @@ -/* v3.0.1 Paper Light by 6788-00 */ -/* https://6788-00.tumblr.com/ */ - -/* Main Window */ - -QWidget { - background: #EFEFEF; - color: #000000; -} - -QWidget:disabled { - background: #EFEFEF; - color: #6C6C6C; -} - -QMainWindow::separator { - border: 0px; -} - -QAbstractItemView { - background: #FFFFFF; - alternate-background-color: #F6F6F6; - show-decoration-selected: 1; - selection-background-color: #008484; - selection-color: #FFFFFF; -} - -QAbstractItemView::item:hover { - background: #008F8F; - color: #FFFFFF; -} - -QAbstractItemView::item:selected { - background: #008484; - color: #FFFFFF; -} - -QAbstractScrollArea::corner { - background: #FFFFFF; - border: 2px solid #EFEFEF; - border-bottom-right-radius: 6px; - margin: 0px -2px -2px 0px; -} - -/* Toolbar */ - -QToolBar { - background: #EFEFEF; - border: 1px solid #EFEFEF; -} - -QToolBar::separator { - background: #EFEFEF; -} - -QToolButton { - padding: 4px 6px; - border-radius: 6px; - margin: 4px 4px 0px 4px; -} - -QToolButton:hover { - background: #008F8F; -} - -QToolButton:pressed { - background: #008484; -} - -/* Left Pane & File Trees */ - -QTreeView { - border-radius: 6px; -} - -QTreeView::branch:hover { - background: #008F8F; - color: #FFFFFF; -} - -QTreeView::branch:selected { - background: #008484; - color: #FFFFFF; -} - -QTreeView::item:selected { - background: #008484; - color: #FFFFFF; -} - -QTreeView::branch:has-children:!has-siblings:closed, -QTreeView::branch:closed:has-children:has-siblings { - image: url(:/stylesheet/branch-closed.png); - border: 0px; -} - -QTreeView::branch:open:has-children:!has-siblings, -QTreeView::branch:open:has-children:has-siblings { - image: url(:/stylesheet/branch-open.png); - border: 0px; -} - -QListView { - border-radius: 6px; -} - -QListView::item:hover { - background: #008F8F; - color: #FFFFFF; -} - -QListView::item:selected { - background: #008484; - color: #FFFFFF; -} - -QTextEdit { - background: #FFFFFF; - border-radius: 6px; -} - -QWebView { - background: #FFFFFF; - border-radius: 6px; -} - -/* Group Boxes */ - -QGroupBox { - padding: 24px 4px; - border: 2px solid #FFFFFF; - border-radius: 10px; -} - -QGroupBox::title { - subcontrol-origin: padding; - subcontrol-position: top left; - padding: 8px; -} - -/* Search Boxes */ - -QLineEdit { - background: #FFFFFF; - min-height: 14px; - padding: 2px; - border: 2px solid #FFFFFF; - border-radius: 6px; - margin-top: 3px; -} - -QLineEdit:hover { - border: 2px solid #008F8F; -} - -/* Most Dropdowns */ - -QComboBox { - background: #FFFFFF; - min-height: 20px; - padding-left: 5px; - border: 2px solid #FFFFFF; - border-radius: 6px; - margin: 3px 0px 1px 0px; -} - -QComboBox:hover { - border: 2px solid #008F8F; -} - -QComboBox:on { - background: #008484; - color: #FFFFFF; - border: 2px solid #008484; -} - -QComboBox::drop-down { - width: 20px; - subcontrol-origin: padding; - subcontrol-position: top right; - border: none; -} - -QComboBox QAbstractItemView { - border: 0px; -} - -QComboBox::down-arrow { - image: url(:/stylesheet/combobox-down.png); -} - -/* Most Buttons */ - -QPushButton { - background: #FFFFFF; - color: #000000; - min-height: 18px; - padding: 2px 12px; - border-radius: 6px; -} - -QPushButton:hover { - background: #008F8F; - color: #FFFFFF; -} - -QPushButton:pressed { - background: #008484; - color: #FFFFFF; -} - -QPushButton:checked { - background: #008484; - color: #FFFFFF; - margin: 4px; -} - -/* Scroll Bars */ - -/* Horizontal */ - -QScrollBar:horizontal { - background: #FFFFFF; - height: 20px; - border: 2px solid #EFEFEF; - margin: 0px 23px -2px 23px; -} - -QScrollBar::handle:horizontal { - background: #EFEFEF; - min-width: 32px; - border-radius: 6px; - margin: 2px; -} - -QScrollBar::add-line:horizontal { - background: #FFFFFF; - width: 23px; - subcontrol-position: right; - subcontrol-origin: margin; - border: 2px solid #EFEFEF; - margin: 0px -2px -2px 0px; -} - -QScrollBar::sub-line:horizontal { - background: #FFFFFF; - width: 23px; - subcontrol-position: left; - subcontrol-origin: margin; - border: 2px solid #EFEFEF; - border-bottom-left-radius: 6px; - margin: 0px 0px -2px -2px; -} - -/* Vertical */ - -QScrollBar:vertical { - background: #FFFFFF; - width: 20px; - border: 2px solid #EFEFEF; - margin: 23px -2px 23px 0px; -} - -QScrollBar::handle:vertical { - background: #EFEFEF; - min-height: 32px; - border-radius: 6px; - margin: 2px; -} - -QScrollBar::add-line:vertical { - background: #FFFFFF; - height: 23px; - subcontrol-position: bottom; - subcontrol-origin: margin; - border: 2px solid #EFEFEF; - border-bottom-right-radius: 6px; - margin: 0px -2px -2px 0px; -} - -QScrollBar::sub-line:vertical { - background: #FFFFFF; - height: 23px; - subcontrol-position: top; - subcontrol-origin: margin; - border: 2px solid #EFEFEF; - border-top-right-radius: 6px; - margin: -2px -2px 0px 0px; -} - -/* Combined */ - -QScrollBar::handle:horizontal:hover, -QScrollBar::handle:vertical:hover, -QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, -QScrollBar::sub-line:vertical:hover { - background: #008F8F; -} - -QScrollBar::handle:horizontal:pressed, -QScrollBar::handle:vertical:pressed, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, -QScrollBar::sub-line:vertical:pressed { - background: #008484; -} - -QScrollBar::add-page:horizontal, -QScrollBar::sub-page:horizontal, -QScrollBar::add-page:vertical, -QScrollBar::sub-page:vertical { - background: transparent; -} - -QScrollBar::up-arrow:vertical, -QScrollBar::right-arrow:horizontal, -QScrollBar::down-arrow:vertical, -QScrollBar::left-arrow:horizontal { - height: 1px; - width: 1px; - border: 1px solid #EFEFEF; -} - -/* Header Rows */ - -QHeaderView { - background: #EFEFEF; -} - -QHeaderView::section { - background: #FFFFFF; - color: #000000; - height: 22px; - padding: 0px 5px; - border: 0px; - border-bottom: 2px solid #EFEFEF; - border-right: 2px solid #EFEFEF; -} - -QHeaderView::section:first { - border-top-left-radius: 6px; -} - -QHeaderView::section:last { - border-right: 0px; - border-top-right-radius: 6px; -} - -QHeaderView::section:hover { - background: #008F8F; - color: #FFFFFF; -} - -QHeaderView::down-arrow { - padding-right: 4px; - height: 10px; - width: 10px; -} - -/* Context Menus, Toolbar Dropdowns, & Tooltips */ - -QMenu { - background: #FFFFFF; - selection-color: #FFFFFF; - border: 0px; -} - -QMenu::item { - background: #FFFFFF; - selection-background-color: #008F8F; - padding: 4px 20px; -} - -QMenu::item:selected { - background: #008F8F; - color: #FFFFFF; -} - -QMenu::item:disabled { - background: #FFFFFF; - color: #6C6C6C; -} - -QMenu::separator { - background: #EFEFEF; - height: 2px; -} - -QMenu::icon { - margin: 1px; -} - -QToolTip { - background: #FFFFFF; - color: #000000; - padding: 1px; - border: 0px; -} - -/* Progress Bars (Downloads) */ - -QProgressBar { - background: #FFFFFF; - text-align: center; - border: 0px; - border-radius: 6px; - margin: 0px 10px; -} - -QProgressBar::chunk { - background: #008F8F; - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} - -/* Right Pane and Tab Bars */ - -QTabWidget::pane { - top: 1px; - padding: 2px 2px 10px 2px; - border: 2px solid #FFFFFF; - border-radius: 10px; -} - -QTabWidget::tab-bar { - alignment: center; -} - -QTabBar::tab { - background: #FFFFFF; - color: #000000; - padding: 4px 1em; - border: 1px solid #EFEFEF; - border-top: 0px; - border-bottom: 0px; -} - -QTabBar::tab:!selected { - background: #FFFFFF; - color: #000000; -} - -QTabBar::tab:disabled { - background: #EFEFEF; - color: #6C6C6C; -} - -QTabBar::tab:selected { - background: #008484; - color: #FFFFFF; - -} - -QTabBar::tab:!selected:hover { - background: #008484; - color: #FFFFFF; -} - -QTabBar::tab:first { - border-top-left-radius: 10px; - border-bottom-left-radius: 10px; -} - -QTabBar::tab:last { - border-top-right-radius: 10px; - border-bottom-right-radius: 10px; -} - -QTabBar QToolButton { - background: #008F8F; - padding: 1px; - border-radius: 6px; - margin: 1px; -} - -QTabBar QToolButton:disabled { - background: transparent; -} - -/* Sliders (Configurator) */ - -/* QSlider::groove:horizontal { - background: #FFFFFF; - height: 1px; - border: 1px solid #FFFFFF; -} - -QSlider::handle:horizontal { - background: #008F8F; - width: 10px; - border: 2px solid #008F8F; - border-radius: 6px; - margin: -10px 0px; -} - -QSlider::handle:horizontal:hover { - background: #008484; - border: 2px solid #008484; -} */ - -/* Tables (Configure Mod Categories) */ - -QTableView { - gridline-color: #EFEFEF; - border: 0px; -} - -/* downloads tab */ - -QWidget#downloadTab QAbstractScrollArea { - /* background of the entire downloads tab */ - background: #EFEFEF; -} - -DownloadListWidget QFrame, -DownloadListWidgetCompact, -DownloadListWidgetCompact QLabel { - /* an entry on the Downloads tab */ - background: #FFFFFF; -} - -DownloadListWidget QFrame#frame { - /* outer box of an entry on the Downloads tab */ - border: 2px solid #FFFFFF; -} - -DownloadListWidget QLabel#installLabel { - color: none; -} - -/* compact downloads view */ - -DownloadListWidgetCompact, -DownloadListWidgetCompact QLabel { - /* an entry on the Downloads tab */ - background: #FFFFFF; - padding: 4px; -} \ No newline at end of file -- cgit v1.3.1 From 25a9290cd57839a151d27ed7e454963a2ed833d9 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 12 Dec 2018 09:39:55 -0600 Subject: Reset previousSeparatorColor when a separator color is reset --- src/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 795f82cf..931fa2af 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3104,6 +3104,7 @@ void MainWindow::resetColor_clicked() else { modInfo->setColor(color); } + Settings::instance().directInterface().remove("previousSeparatorColor"); } void MainWindow::createModFromOverwrite() -- cgit v1.3.1 From c24200bc042d963794f8b6e05f07ad23b67c01c8 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 12 Dec 2018 13:22:17 -0600 Subject: Remove a weird vertical spacer from the diagnostics settings tab --- src/settingsdialog.ui | 175 +++++++++++++++++++++++--------------------------- 1 file changed, 81 insertions(+), 94 deletions(-) (limited to 'src') diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 6557bbcc..0412fc10 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -1146,64 +1146,62 @@ programs you are intentionally running. Diagnostics - - + + - + - Log Level + Max Dumps To Keep - + + + Qt::Horizontal + + + + 60 + 20 + + + + + + - Decides the amount of data printed to "ModOrganizer.log" + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - Decides the amount of data printed to "ModOrganizer.log". - "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. + Set "Crash Dumps" above to None to disable crash dump collection. - - - Debug - - - - - Info (recommended) - - - - - Warning - - - - - Error - - - - - - Qt::Vertical + + + + Hint: right click link and copy link location - - - 20 - 40 - + + + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> + and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. + Sending logs and/or crash dumps to the developers can help investigate issues. + It is recommended to compress large log and dmp files before sending. + - + + true + + - + @@ -1250,62 +1248,7 @@ programs you are intentionally running. - - - - - - Max Dumps To Keep - - - - - - - Qt::Horizontal - - - - 60 - 20 - - - - - - - - Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - - - - Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - Set "Crash Dumps" above to None to disable crash dump collection. - - - - - - - - - Hint: right click link and copy link location - - - - Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> - and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. - Sending logs and/or crash dumps to the developers can help investigate issues. - It is recommended to compress large log and dmp files before sending. - - - - true - - - - Qt::Vertical @@ -1321,6 +1264,50 @@ programs you are intentionally running. + + + + + + Log Level + + + + + + + Decides the amount of data printed to "ModOrganizer.log" + + + + Decides the amount of data printed to "ModOrganizer.log". + "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. + + + + + Debug + + + + + Info (recommended) + + + + + Warning + + + + + Error + + + + + + -- cgit v1.3.1 From 20008e17b71f3b23f94893554b3623b2d4f732d6 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 12 Dec 2018 17:43:43 -0600 Subject: Fix highlighting plugins when selecting mods with no visible priority --- src/pluginlist.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 480cb014..b0f59e1e 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -126,7 +126,10 @@ void PluginList::highlightPlugins(const QItemSelectionModel *selection, const MO esp.m_ModSelected = false; } for (QModelIndex idx : selection->selectedRows(ModList::COL_PRIORITY)) { - int modPriority = idx.data().toInt(); + int modPriority = idx.data(Qt::UserRole).toInt(); + if (modPriority < 0 || modPriority == INT_MAX) + continue; + int modIndex = profile.modIndexByPriority(modPriority); ModInfo::Ptr selectedMod = ModInfo::getByIndex(modIndex); if (!selectedMod.isNull() && profile.modEnabled(modIndex)) { -- cgit v1.3.1 From e63eba2ca1c0ac0d862275168157e9382f05a945 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 13 Dec 2018 13:30:04 -0600 Subject: Improve cleanup of temporary files when installing --- src/installationmanager.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 64e58358..76b1e086 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -677,7 +677,14 @@ void InstallationManager::postInstallCleanup() // TODO: this doesn't yet remove directories. Also, the files may be left there if this point isn't reached for (const QString &tempFile : m_TempFilesToDelete) { QFileInfo fileInfo(QDir::tempPath() + "/" + tempFile); - QFile::remove(fileInfo.absoluteFilePath()); + if (fileInfo.exists()) { + if (!fileInfo.isReadable() || !fileInfo.isWritable()) { + QFile::setPermissions(fileInfo.absoluteFilePath(), QFile::ReadOther | QFile::WriteOther); + } + if (!QFile::remove(fileInfo.absoluteFilePath())) { + qWarning() << "Unable to delete " << fileInfo.absoluteFilePath(); + } + } directoriesToRemove.insert(fileInfo.absolutePath()); } -- cgit v1.3.1 From e15f768a1538e558f95914d7786635eaf58847ad Mon Sep 17 00:00:00 2001 From: Al12rs Date: Thu, 13 Dec 2018 21:18:35 +0100 Subject: Fixed opening multiple modinfodialog from Open Origin info. --- src/mainwindow.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 931fa2af..9f9dc0fb 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3227,7 +3227,9 @@ void MainWindow::openOriginInformation_clicked() { try { QItemSelectionModel *selection = ui->espList->selectionModel(); - if (selection->hasSelection() && selection->selectedRows().count() > 0) { + //we don't want to open multiple modinfodialogs. + /*if (selection->hasSelection() && selection->selectedRows().count() > 0) { + for (QModelIndex idx : selection->selectedRows()) { QString fileName = idx.data().toString(); ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); @@ -3238,16 +3240,15 @@ void MainWindow::openOriginInformation_clicked() } } } - else { - QModelIndex idx = selection->currentIndex(); - QString fileName = idx.data().toString(); + else {}*/ + QModelIndex idx = selection->currentIndex(); + QString fileName = idx.data().toString(); - ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); - std::vector flags = modInfo->getFlags(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); - if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { - displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); - } + if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { + displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); } } catch (const std::exception &e) { -- cgit v1.3.1 From cbc9d00584d0c0b7f8cc6ade00b9ca8dafb6fd03 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 15 Dec 2018 16:23:20 -0600 Subject: Update translation file --- src/organizer_en.ts | 486 ++++++++++++++++++++++++++-------------------------- 1 file changed, 243 insertions(+), 243 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 44a386d6..e5308549 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1386,58 +1386,58 @@ p, li { white-space: pre-wrap; } - + File format "%1" not supported - + None of the available installer plugins were able to handle that archive. This is likely due to a corrupted or incompatible download or unrecognized archive format. - + no error - + 7z.dll not found - + 7z.dll isn't valid - + archive not found - + failed to open archive - + unsupported archive type - + internal library error - + archive invalid - + unknown archive error @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2281,16 +2281,16 @@ Right now this has very limited functionality - - + + failed to rename "%1" to "%2" - - + + Confirm @@ -2354,8 +2354,8 @@ Right now this has very limited functionality - - + + Create Mod... @@ -2367,7 +2367,7 @@ Please enter a name: - + A mod with this name already exists @@ -2388,435 +2388,435 @@ Please enter a name: - + 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,22 +2837,22 @@ You can also use online editors and converters instead. - + failed to remove %1 - + failed to create %1 - + Restarting MO - + Changing the managed game directory requires restarting MO. Any pending downloads will be paused. @@ -2860,335 +2860,335 @@ Click OK to restart MO now. - + 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Open Origin in Explorer - + Open Origin Info... - + 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 - + Set the priority of the selected mods @@ -4661,94 +4661,94 @@ Continue? - + failed to update esp info for file %1 (source id: %2), error: %3 - + esp not found: %1 - - + + 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 @@ -5511,7 +5511,7 @@ If the folder was still in use, restart MO and try again. - + <Manage...> @@ -5552,12 +5552,12 @@ If the folder was still in use, restart MO and try again. - + failed to access %1 - + failed to set file time %1 @@ -5763,12 +5763,12 @@ Select Show Details option to see the full change-log. - + Failed to start %1: %2 - + Error @@ -6371,17 +6371,17 @@ programs you are intentionally running. - + Log Level - + Decides the amount of data printed to "ModOrganizer.log" - + Decides the amount of data printed to "ModOrganizer.log". "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. @@ -6389,37 +6389,37 @@ programs you are intentionally running. - + Debug - + Info (recommended) - + Warning - + Error - + Crash Dumps - + Decides which type of crash dumps are collected when injected processes crash. - + Decides which type of crash dumps are collected when injected processes crash. "None" Disables the generation of crash dumps by MO. @@ -6430,37 +6430,37 @@ programs you are intentionally running. - + None - + Mini (recommended) - + Data - + Full - + Max Dumps To Keep - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. Set "Crash Dumps" above to None to disable crash dump collection. @@ -6468,12 +6468,12 @@ programs you are intentionally running. - + Hint: right click link and copy link location - + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. -- cgit v1.3.1 From ff51aa10c27ce09ddacccc84e09105f333a36abc Mon Sep 17 00:00:00 2001 From: Al12rs Date: Tue, 18 Dec 2018 00:10:37 +0100 Subject: Fixed performance issue of Data tab. --- src/mainwindow.cpp | 26 +++++++++++++++++--------- src/mainwindow.h | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9f9dc0fb..3e35ebec 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1198,9 +1198,11 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) } } -void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly) +void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon) { bool isDirectory = true; + //QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + //QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); std::wostringstream temp; temp << directorySoFar << "\\" << directoryEntry.getName(); @@ -1213,11 +1215,11 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director columns.append(""); if (!(*current)->isEmpty()) { QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::DecorationRole, *folderIcon); directoryChild->setData(0, Qt::UserRole + 3, isDirectory); if (conflictsOnly) { - updateTo(directoryChild, temp.str(), **current, conflictsOnly); + updateTo(directoryChild, temp.str(), **current, conflictsOnly, fileIcon, folderIcon); if (directoryChild->childCount() != 0) { subTree->addChild(directoryChild); } @@ -1236,7 +1238,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director } else { QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::DecorationRole, *folderIcon); directoryChild->setData(0, Qt::UserRole + 3, isDirectory); subTree->addChild(directoryChild); } @@ -1281,7 +1283,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director fileChild->setFont(1, font); } fileChild->setData(0, Qt::UserRole, ToQString(current->getFullPath())); - fileChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::File)); + fileChild->setData(0, Qt::DecorationRole, *fileIcon); fileChild->setData(0, Qt::UserRole + 3, isDirectory); fileChild->setData(0, Qt::UserRole + 1, isArchive); fileChild->setData(1, Qt::UserRole, source); @@ -1322,6 +1324,7 @@ void MainWindow::delayedRemove() void MainWindow::expandDataTreeItem(QTreeWidgetItem *item) { + if ((item->childCount() == 1) && (item->child(0)->data(0, Qt::UserRole).toString() == "__loaded_on_demand__")) { // read the data we need from the sub-item, then dispose of it QTreeWidgetItem *onDemandDataItem = item->child(0); @@ -1331,7 +1334,9 @@ void MainWindow::expandDataTreeItem(QTreeWidgetItem *item) std::wstring virtualPath = (path + L"\\").substr(6) + ToWString(item->text(0)); DirectoryEntry *dir = m_OrganizerCore.directoryStructure()->findSubDirectoryRecursive(virtualPath); if (dir != nullptr) { - updateTo(item, path, *dir, conflictsOnly); + QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); + updateTo(item, path, *dir, conflictsOnly, &fileIcon, &folderIcon); } else { qWarning("failed to update view of %ls", path.c_str()); } @@ -1406,12 +1411,14 @@ void MainWindow::refreshDataTree() { QCheckBox *conflictsBox = findChild("conflictsCheckBox"); QTreeWidget *tree = findChild("dataTree"); + QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); tree->clear(); QStringList columns("data"); columns.append(""); QTreeWidgetItem *subTree = new QTreeWidgetItem(columns); subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); - updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked()); + updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked(), &fileIcon, &folderIcon); tree->insertTopLevelItem(0, subTree); subTree->setExpanded(true); } @@ -1420,7 +1427,8 @@ void MainWindow::refreshDataTreeKeepExpandedNodes() { QCheckBox *conflictsBox = findChild("conflictsCheckBox"); QTreeWidget *tree = findChild("dataTree"); - + QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); QStringList expandedNodes; QTreeWidgetItemIterator it1(tree, QTreeWidgetItemIterator::NotHidden | QTreeWidgetItemIterator::HasChildren); while (*it1) { @@ -1436,7 +1444,7 @@ void MainWindow::refreshDataTreeKeepExpandedNodes() columns.append(""); QTreeWidgetItem *subTree = new QTreeWidgetItem(columns); subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); - updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked()); + updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked(), &fileIcon, &folderIcon); tree->insertTopLevelItem(0, subTree); subTree->setExpanded(true); QTreeWidgetItemIterator it2(tree, QTreeWidgetItemIterator::HasChildren); diff --git a/src/mainwindow.h b/src/mainwindow.h index 69d08337..cd7e6f43 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -211,7 +211,7 @@ private: void startSteam(); - void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly); + void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon); bool refreshProfiles(bool selectProfile = true); void refreshExecutablesList(); void installMod(QString fileName = ""); -- cgit v1.3.1 From 027edcf688131642229cf3c97e5eae2594c328c0 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 10:59:53 -0600 Subject: Enable per-profile game INI files by default again --- src/profile.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src') diff --git a/src/profile.cpp b/src/profile.cpp index 821be4b4..e2274346 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -171,10 +171,8 @@ void Profile::findProfileSettings() if (m_Directory.exists(backupFile)) { storeSetting("LocalSettings", false); m_Directory.rename(backupFile, getIniFileName()); - } else if (m_Directory.exists(getIniFileName())) { - storeSetting("LocalSettings", true); } else { - storeSetting("LocalSettings", false); + storeSetting("LocalSettings", true); } } -- cgit v1.3.1 From 662772c2fc8ec598a64cc4cabe13a86f1e83fb2e Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 11:19:03 -0600 Subject: Optionally delete and restore profile-specific game INI files when changing the setting --- src/profile.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src') diff --git a/src/profile.cpp b/src/profile.cpp index e2274346..536dfd98 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -773,6 +773,27 @@ bool Profile::localSettingsEnabled() const bool Profile::enableLocalSettings(bool enable) { + if (enable) { + m_GamePlugin->initializeProfile(m_Directory.absolutePath(), IPluginGame::CONFIGURATION); + } else { + QMessageBox::StandardButton res = QMessageBox::question( + QApplication::activeModalWidget(), tr("Delete profile-specific game INI files?"), + tr("Do you want to delete profile-specific game INI files? (If you select \"No\", the " + "save games will be used again if you re-enable profile-specific game INI files.)"), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, + QMessageBox::Cancel); + if (res == QMessageBox::Yes) { + QStringList filesToDelete; + for (QString file : m_GamePlugin->iniFiles()) { + filesToDelete << m_Directory.absoluteFilePath(file); + } + shellDelete(filesToDelete, true); + } else if (res == QMessageBox::No) { + // No action + } else { + return false; + } + } storeSetting("LocalSettings", enable); return true; } -- cgit v1.3.1 From 830b63c4e20ffe3fee1ebffc9b88c45305f6737d Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 11:29:30 -0600 Subject: Re-initialize the profile configuration if INI files are missing --- src/profile.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/profile.cpp b/src/profile.cpp index 536dfd98..f1bec4dd 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -768,7 +768,25 @@ bool Profile::enableLocalSaves(bool enable) bool Profile::localSettingsEnabled() const { - return setting("LocalSettings", false).toBool(); + bool enabled = setting("LocalSettings", false).toBool(); + if (enabled) { + bool reinitConfig = false; + for (QString file : m_GamePlugin->iniFiles()) { + if (!QFile::exists(m_Directory.filePath(file))) { + qWarning("missing %s in %s", qPrintable(file), qPrintable(m_Directory.path())); + reinitConfig = true; + } + } + if (reinitConfig) { + QMessageBox::StandardButton res = QMessageBox::warning( + QApplication::activeModalWidget(), tr("Missing profile-specific game INI files!"), + tr("Some of your profile-specific game INI files were missing. They will now be copied " + "from the vanilla game folder. You might want double-check your settings.") + ); + m_GamePlugin->initializeProfile(m_Directory, IPluginGame::CONFIGURATION); + } + } + return enabled; } bool Profile::enableLocalSettings(bool enable) -- cgit v1.3.1 From 37a6989ba831aa077d63234a8e8b64eb9e8f3eb1 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 11:53:29 -0600 Subject: Make language about profile-specific settings and save games consistent --- src/mainwindow.ui | 2 +- src/profile.cpp | 8 ++++---- src/profilesdialog.cpp | 2 +- src/profilesdialog.ui | 6 +++--- src/transfersavesdialog.ui | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 41365768..e42bed27 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1197,7 +1197,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all save games for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html> diff --git a/src/profile.cpp b/src/profile.cpp index f1bec4dd..9b93539d 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -748,9 +748,9 @@ bool Profile::enableLocalSaves(bool enable) } } else { QMessageBox::StandardButton res = QMessageBox::question( - QApplication::activeModalWidget(), tr("Delete savegames?"), - tr("Do you want to delete local savegames? (If you select \"No\", the " - "save games will show up again if you re-enable local savegames)"), + QApplication::activeModalWidget(), tr("Delete profile-specific save games?"), + tr("Do you want to delete the profile-specific save games? (If you select \"No\", the " + "save games will show up again if you re-enable profile-specific save games)"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel); if (res == QMessageBox::Yes) { @@ -796,7 +796,7 @@ bool Profile::enableLocalSettings(bool enable) } else { QMessageBox::StandardButton res = QMessageBox::question( QApplication::activeModalWidget(), tr("Delete profile-specific game INI files?"), - tr("Do you want to delete profile-specific game INI files? (If you select \"No\", the " + tr("Do you want to delete the profile-specific game INI files? (If you select \"No\", the " "save games will be used again if you re-enable profile-specific game INI files.)"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel); diff --git a/src/profilesdialog.cpp b/src/profilesdialog.cpp index ed54f33c..17844357 100644 --- a/src/profilesdialog.cpp +++ b/src/profilesdialog.cpp @@ -191,7 +191,7 @@ void ProfilesDialog::on_removeProfileButton_clicked() return; } - QMessageBox confirmBox(QMessageBox::Question, tr("Confirm"), tr("Are you sure you want to remove this profile (including local savegames if any)?"), + QMessageBox confirmBox(QMessageBox::Question, tr("Confirm"), tr("Are you sure you want to remove this profile (including profile-specific save games, if any)?"), QMessageBox::Yes | QMessageBox::No, this); if (confirmBox.exec() == QMessageBox::Yes) { diff --git a/src/profilesdialog.ui b/src/profilesdialog.ui index d33e2283..f040faed 100644 --- a/src/profilesdialog.ui +++ b/src/profilesdialog.ui @@ -35,13 +35,13 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> + <html><head/><body><p>If checked, save games are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> - If checked, savegames are local to this profile and will not appear when starting with a different profile. + If checked, save games are local to this profile and will not appear when starting with a different profile. - Use profile-specific Savegames + Use profile-specific Save Games diff --git a/src/transfersavesdialog.ui b/src/transfersavesdialog.ui index 1fcad54d..8bc23088 100644 --- a/src/transfersavesdialog.ui +++ b/src/transfersavesdialog.ui @@ -11,7 +11,7 @@ - Transfer Savegames + Transfer Save Games -- cgit v1.3.1 From 18ea79c2d0f8c1b037dfdd2d8d0df106583604f9 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 11:53:53 -0600 Subject: Update translation file --- src/organizer_en.ts | 480 ++++++++++++++++++++++++++-------------------------- 1 file changed, 240 insertions(+), 240 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index e5308549..ab443eef 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1620,7 +1620,7 @@ p, li { white-space: pre-wrap; } - + Create Backup @@ -1784,8 +1784,8 @@ p, li { white-space: pre-wrap; } - - + + Refresh @@ -1969,7 +1969,7 @@ p, li { white-space: pre-wrap; } - + Update @@ -2010,7 +2010,7 @@ Right now this has very limited functionality - + Endorse Mod Organizer @@ -2145,678 +2145,678 @@ Right now this has very limited functionality - + 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> - + <Mod Backup> - + <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. - + Failed to create backup. - + 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 - + Create Separator... - + This will create a new separator. Please enter a name: - + A separator 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 - + Create Separator - + Enable all visible - + Disable all visible - + Check all for update - + Export to csv... - - + + Send to - - + + Top - - + + Bottom - - + + Priority... - + Separator... - + All Mods - + Sync to Mods... - + Clear Overwrite... - - + + Open in Explorer - + Restore Backup - + Remove Backup... - - + + Change Categories - - + + Primary Category - + Rename Separator... - + Remove Separator... - + Select Color... - + Reset Color - + Change versioning scheme - + Un-ignore update - + Ignore update - - + + 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 - + 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. @@ -2824,12 +2824,12 @@ You can also use online editors and converters instead. - + Enable Mods... - + Delete %n save(s) @@ -2837,22 +2837,22 @@ You can also use online editors and converters instead. - + failed to remove %1 - + failed to create %1 - + Restarting MO - + Changing the managed game directory requires restarting MO. Any pending downloads will be paused. @@ -2860,335 +2860,335 @@ Click OK to restart MO now. - + 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? - - + + Set Priority - + Set the priority of the selected plugins - + 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 - + Open Origin in Explorer - + Open Origin Info... - + 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 - + Set the priority of the selected mods @@ -5510,13 +5510,13 @@ If the folder was still in use, restart MO and try again. - - + + <Manage...> - + failed to parse profile %1: %2 -- cgit v1.3.1 From d9835cc4aeb4302f81b224a8060c5256a31172d3 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 12:47:33 -0600 Subject: Update translation file --- src/organizer_en.ts | 75 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index ab443eef..2032c5f7 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1826,9 +1826,16 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all save games for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html> + <!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; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html> @@ -4820,57 +4827,77 @@ p, li { white-space: pre-wrap; } - + failed to write mod list: %1 - + failed to update tweaked ini file, wrong settings may be used: %1 - + failed to create tweaked ini: %1 - + failed to open %1 - + "%1" is missing or inaccessible - - - - - + + + + + invalid index %1 - + Overwrite directory couldn't be parsed - + invalid priority %1 - - Delete savegames? + + Delete profile-specific save games? + + + + + Do you want to delete the profile-specific save games? (If you select "No", the save games will show up again if you re-enable profile-specific save games) + + + + + Missing profile-specific game INI files! + + + + + Some of your profile-specific game INI files were missing. They will now be copied from the vanilla game folder. You might want double-check your settings. + + + + + Delete profile-specific game INI files? - - Do you want to delete local savegames? (If you select "No", the save games will show up again if you re-enable local savegames) + + Do you want to delete the profile-specific game INI files? (If you select "No", the save games will be used again if you re-enable profile-specific game INI files.)
    @@ -4927,17 +4954,20 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> + <html><head/><body><p>If checked, save games are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> + <html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> - If checked, savegames are local to this profile and will not appear when starting with a different profile. + If checked, save games are local to this profile and will not appear when starting with a different profile. + If checked, savegames are local to this profile and will not appear when starting with a different profile. - Use profile-specific Savegames + Use profile-specific Save Games + Use profile-specific Savegames @@ -5088,7 +5118,7 @@ p, li { white-space: pre-wrap; } - Are you sure you want to remove this profile (including local savegames if any)? + Are you sure you want to remove this profile (including profile-specific save games, if any)? @@ -6661,7 +6691,8 @@ Example: TransferSavesDialog - Transfer Savegames + Transfer Save Games + Transfer Savegames -- cgit v1.3.1 From 5e530becc2724731653e4e94473fe674f13da129 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 12:56:11 -0600 Subject: Don't mention save games when dealing with INI files --- src/profile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/profile.cpp b/src/profile.cpp index 9b93539d..8eb1c49a 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -797,7 +797,7 @@ bool Profile::enableLocalSettings(bool enable) QMessageBox::StandardButton res = QMessageBox::question( QApplication::activeModalWidget(), tr("Delete profile-specific game INI files?"), tr("Do you want to delete the profile-specific game INI files? (If you select \"No\", the " - "save games will be used again if you re-enable profile-specific game INI files.)"), + "INI files will be used again if you re-enable profile-specific game INI files.)"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel); if (res == QMessageBox::Yes) { -- cgit v1.3.1 From 1b0c43778872beb2a84bad39da89dfb93dbd4609 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 19 Dec 2018 14:33:04 -0600 Subject: Update translation file --- src/organizer_en.ts | 87 +++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 49 deletions(-) (limited to 'src') diff --git a/src/organizer_en.ts b/src/organizer_en.ts index 2032c5f7..68fd3b65 100644 --- a/src/organizer_en.ts +++ b/src/organizer_en.ts @@ -1829,13 +1829,6 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all save games for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html> - <!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; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This is a list of all savegames for this game. Hover over a list entry to get detailed information about the save including a list of esps/esms that were used at the time this save was created but aren't active now.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">If you click &quot;Fix Mods...&quot; in the context menu, MO will try to activate all mods and esps to fix those missing esps. It will not disable anything!</span></p></body></html> @@ -4897,7 +4890,7 @@ p, li { white-space: pre-wrap; } - Do you want to delete the profile-specific game INI files? (If you select "No", the save games will be used again if you re-enable profile-specific game INI files.) + Do you want to delete the profile-specific game INI files? (If you select "No", the INI files will be used again if you re-enable profile-specific game INI files.) @@ -4955,19 +4948,16 @@ p, li { white-space: pre-wrap; } <html><head/><body><p>If checked, save games are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> - <html><head/><body><p>If checked, savegames are stored locally to this profile and will not appear when starting with a different profile.</p></body></html> If checked, save games are local to this profile and will not appear when starting with a different profile. - If checked, savegames are local to this profile and will not appear when starting with a different profile. Use profile-specific Save Games - Use profile-specific Savegames @@ -6401,41 +6391,36 @@ programs you are intentionally running. - - Log Level + + Max Dumps To Keep - - Decides the amount of data printed to "ModOrganizer.log" + + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - + - Decides the amount of data printed to "ModOrganizer.log". - "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. + Maximum number of crash dumps to keep on disk. Use 0 for unlimited. + Set "Crash Dumps" above to None to disable crash dump collection. - - Debug - - - - - Info (recommended) - - - - - Warning + + Hint: right click link and copy link location - - Error + + + Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> + and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. + Sending logs and/or crash dumps to the developers can help investigate issues. + It is recommended to compress large log and dmp files before sending. + @@ -6480,36 +6465,41 @@ programs you are intentionally running. - - Max Dumps To Keep + + Log Level - - Maximum number of crash dumps to keep on disk. Use 0 for unlimited. + + Decides the amount of data printed to "ModOrganizer.log" - + - Maximum number of crash dumps to keep on disk. Use 0 for unlimited. - Set "Crash Dumps" above to None to disable crash dump collection. + Decides the amount of data printed to "ModOrganizer.log". + "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. - - Hint: right click link and copy link location + + Debug - - - Logs and crash dumps are stored under your current instance in the <a href="LOGS_FULL_PATH">LOGS_DIR</a> - and <a href="DUMPS_FULL_PATH">DUMPS_DIR</a> folders. - Sending logs and/or crash dumps to the developers can help investigate issues. - It is recommended to compress large log and dmp files before sending. - + + Info (recommended) + + + + + Warning + + + + + Error @@ -6692,7 +6682,6 @@ Example: Transfer Save Games - Transfer Savegames -- cgit v1.3.1 From 9a33dc148054443cb0efd5916ff758fca5bc09e3 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Thu, 20 Dec 2018 19:12:11 +0100 Subject: *Added "Open INIs Folder" option. *Changed "Open Instance Folder" to open the Appdata or MO2 install instead of the baseDirectory. --- src/mainwindow.cpp | 19 ++++++++++++++++++- src/mainwindow.h | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3e35ebec..954c88c6 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3639,7 +3639,11 @@ void MainWindow::disableVisibleMods() void MainWindow::openInstanceFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getBaseDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + 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); } void MainWindow::openLogsFolder() @@ -3665,6 +3669,17 @@ void MainWindow::openProfileFolder() ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } +void MainWindow::openIniFolder() +{ + if (m_OrganizerCore.currentProfile()->localSettingsEnabled()) + { + ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } + else { + ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.managedGame()->documentsDirectory().absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } +} + void MainWindow::openDownloadsFolder() { ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getDownloadDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); @@ -3864,6 +3879,8 @@ QMenu *MainWindow::openFolderMenu() FolderMenu->addAction(tr("Open MyGames folder"), this, SLOT(openMyGamesFolder())); + FolderMenu->addAction(tr("Open INIs folder"), this, SLOT(openIniFolder())); + FolderMenu->addSeparator(); FolderMenu->addAction(tr("Open Instance folder"), this, SLOT(openInstanceFolder())); diff --git a/src/mainwindow.h b/src/mainwindow.h index cd7e6f43..e799a64a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -529,6 +529,7 @@ private slots: void openDownloadsFolder(); void openModsFolder(); void openProfileFolder(); + void openIniFolder(); void openGameFolder(); void openMyGamesFolder(); void startExeAction(); -- cgit v1.3.1