Compare commits

...
157 Commits
Author SHA1 Message Date
Brian Munro bc75009169 Merge pull request #294 from Modorganizer2/Develop
Release 2.1.2
2018-04-13 11:56:36 +02:00
Jeremy Rimpo 8be73d2e3b Remove extraneous search code 2018-04-13 00:38:23 -05:00
Silarn 358e2c4e74 Merge branch 'Develop' of https://github.com/Modorganizer2/modorganizer into Develop 2018-04-11 15:13:33 -05:00
Silarn be2d39b035 Add flag and description text to ESL-flagged ESPs 2018-04-11 15:12:31 -05:00
Jeremy Rimpo 8f0b42d466 Merge branch 'master' into Develop 2018-04-11 13:14:41 -05:00
Silarn 37b1bdd9e6 Bump version to 2.1.2 and update meta info 2018-04-11 12:58:46 -05:00
Silarn e037caf58e Fix both remove and reinstall updating hidden downloads 2018-04-11 10:58:22 -05:00
Silarn e33da8402c Allow multi-extract via archive origin entry in the BSA tab 2018-04-11 00:55:52 -05:00
Silarn c4bfee0089 Prep for Qt 5.11 (backward-compatible) 2018-04-10 23:28:33 -05:00
Silarn 5a24d2b60c Minor improvements to download hiding 2018-04-10 01:53:59 -05:00
Silarn 9465966b2c Created threaded process for writing mod meta files to prevent hangs 2018-04-09 12:18:22 -05:00
Silarn 47dc5cded7 Add DXTex header licenses for new BSATK handling of FO4 texture BA2s 2018-04-09 12:17:15 -05:00
Silarn bf9d187036 Merge branch 'Develop' of https://github.com/Modorganizer2/modorganizer into Develop 2018-04-08 14:58:23 -05:00
Silarn 208eaccbf7 Updates to allow a full plugin data refresh in certain circumstances 2018-04-08 14:56:46 -05:00
Al12rs fb1c376533 Added "Open/Execute" context menu entry to the conflicts tab in the modinfodialog. 2018-04-08 14:41:03 +02:00
Silarn 0f8852f487 Also mark hidden downloads as uninstalled; refresh plugins after files 2018-04-08 03:58:08 -05:00
Silarn 7eba6837dd Prevent redownloading a mod if the download is still in progress 2018-04-07 23:54:22 -05:00
Silarn cc2bd15256 Fix for re-downloading a mod already downloading 2018-04-07 22:18:45 -05:00
Silarn b409a0bef9 Install the translation file (we need at least one) 2018-04-07 20:09:41 -05:00
Silarn d62669e1b4 Fix overwritten file preview 2018-04-07 18:58:12 -05:00
Silarn a1d92fb673 Fix up CMAKE to use /MP and allow building through umbrella 2018-04-07 17:12:22 -05:00
Al12rs fd9eb032b6 Added file preview in conflicts tab in the mod information dialog. The preview is not working for the lower file list for some reason but I left the setup of the context menu and all in case somebody else can figure out what I'm missing. 2018-04-07 19:53:41 +02:00
Al12rs 5c39a762e6 Allow MO2 shortcuts that open the indicated MO2 instance in the argument if the executable name is omitted.
This should be added after the MO2 exe path: '  "moshortcut://myInstanceName:" '. If there are caracters after the ":" then MO2 will assume that is an execuatble and will try to run it.
2018-04-07 14:10:16 +02:00
Silarn a905ce130d Update About dialog with new contributors (and don't translate names) 2018-04-06 18:25:11 -05:00
Silarn fed89352d1 Changes to allow plugin loading in the mod info dialog (and rename SE) 2018-04-06 00:56:58 -05:00
Silarn 74dd2bb914 Return extraction context menu to archive list 2018-04-05 23:57:24 -05:00
Silarn dcbcb29ec7 Update to allow linking to updated bsatk 2018-04-03 14:59:04 -05:00
Jeremy Rimpo 92e3fa2fdd Merge branch 'Develop' of https://github.com/Modorganizer2/modorganizer into Develop 2018-03-23 11:56:23 -05:00
Jeremy Rimpo 5a98d69dcd Fix tab index now that the archive tab is back 2018-03-23 11:35:27 -05:00
Al 5dd0e3b77e Merge pull request #287 from SuperSandro2000/imgbot
[ImgBot] optimizes images
2018-03-23 15:30:39 +01:00
Al 4baba035dd Merge pull request #286 from SuperSandro2000/fix-ocd
Proper variable naming
2018-03-23 15:12:49 +01:00
ImgBotApp 5eb03a687c [ImgBot] optimizes images
*Total -- 173.23kb -> 19.45kb (88.77%)

/src/resources/multiply-red.png -- 15.64kb -> 0.65kb (95.84%)
/src/resources/archive-conflict-neutral.png -- 17.63kb -> 0.83kb (95.31%)
/src/resources/archive-conflict-loser.png -- 17.63kb -> 0.87kb (95.09%)
/src/resources/archive-conflict-winner.png -- 17.63kb -> 0.92kb (94.8%)
/src/resources/archive-conflict-mixed.png -- 17.63kb -> 0.95kb (94.63%)
/src/resources/switch-instance-icon.png -- 56.17kb -> 4.23kb (92.47%)
/src/resources/open-Folder-Icon.png -- 16.53kb -> 1.40kb (91.53%)
/src/resources/contents/conversation.png -- 1.47kb -> 0.81kb (44.75%)
/src/resources/contents/breastplate.png -- 1.39kb -> 0.77kb (44.47%)
/src/resources/contents/locked-chest.png -- 1.41kb -> 0.78kb (44.38%)
/src/resources/contents/lyre.png -- 1.36kb -> 0.76kb (43.59%)
/src/resources/contents/usable.png -- 1.31kb -> 0.81kb (37.99%)
/src/resources/contents/hand-of-god.png -- 1.08kb -> 0.67kb (37.6%)
/src/resources/contents/double-quaver.png -- 0.99kb -> 0.63kb (36.57%)
/src/resources/contents/jigsaw-piece.png -- 0.93kb -> 0.66kb (28.78%)
/src/resources/contents/tinker.png -- 1.01kb -> 0.72kb (28.52%)
/src/resources/contents/empty-chessboard.png -- 0.69kb -> 0.52kb (23.94%)
/src/resources/contents/checkbox-tree.png -- 0.64kb -> 0.52kb (19.15%)
/src/resources/check.png -- 0.44kb -> 0.39kb (13.19%)
/src/resources/contents/config.png -- 0.54kb -> 0.47kb (13.04%)
/src/resources/document-save.png -- 1.12kb -> 1.09kb (2.87%)
2018-03-23 14:09:58 +00:00
Brian Munro dd288fe152 Merge pull request #284 from LePresidente/Develop
Updater and Issue reports now point to Modorganizer2/modorganizer
2018-03-22 09:46:09 +02:00
LePresidente ba0a1bd501 Updater and Issue reports now point to Modorganizer2/modorganizer 2018-03-22 09:41:35 +02:00
Jeremy Rimpo 2d2a2b8b74 Merge pull request #281 from SuperSandro2000/patch-1
Added new repos
2018-03-21 10:17:54 -05:00
Sandro Jäckel 0e0c72422c Added new repos 2018-03-21 10:05:37 +01:00
Sandro Jäckel 82d4742e28 Proper variable naming
and fixed Sandros OCD
2018-03-21 08:23:03 +01:00
Jeremy Rimpo 3cceb6502c Merge pull request #280 from Al12rs/Develop
Fixed preview "file not found" error if the mod folder containing the…
2018-03-20 21:41:37 -05:00
Al12rs 92a8a3dce8 Fixed preview "file not found" error if the mod folder containing the file was on a different drive. 2018-03-21 00:12:39 +01:00
Jeremy Rimpo bcc4c8d6aa Update BY SA v3 license file to match others 2018-03-20 17:18:57 -05:00
Jeremy Rimpo 149ce846b5 Installer license not needed for application 2018-03-20 17:12:25 -05:00
Jeremy Rimpo 192b0bafa5 Update about dialogue and licenses 2018-03-20 17:11:00 -05:00
Jeremy Rimpo 0c792d548f Fix lootcli destroying loadorder on newer games 2018-03-20 17:10:35 -05:00
Jeremy Rimpo 336216ba9a Various save game improvements related to script extender files
* Improve handling of SE save transfers and deletes with main save
* Add indicator in save popup dialog if SE save file is present
2018-03-20 01:29:31 -05:00
Al b71d472e08 Merge pull request #276 from Al12rs/Develop
Disabled iniTweaks, added resources, a few ui fixes and text changes.
2018-03-18 10:06:04 +01:00
Al12rs bbce6506cd Fixed another typo in the same resource 2018-03-17 14:41:43 +01:00
Al12rs 2def87a143 Fixed a typo of the added resource. 2018-03-17 12:42:15 +01:00
Al12rs 90165b02ab Disabled iniTweaks part of modinfodialog until it is not fixed. 2018-03-17 01:08:02 +01:00
Al12rs 8095be550f Added archive-conflict icons to resources. 2018-03-17 00:58:55 +01:00
Al12rs 2fa1b04cd4 Various text and ui changes:
Added description to CSV export.
Added line to delete instance error message.
Changed delete instance icon for the list of instances.
Added red X in the resources, thanks to twizz0r.
2018-03-16 18:02:57 +01:00
Al a4b0524c70 Merge pull request #274 from Al12rs/Develop
Fixed default size and positioning of some ui elements to accomodate …
2018-03-15 19:28:27 +01:00
Al12rs 8dee1d108b Fixed default size and positioning of some ui elements to accomodate the new ones.
Fixed incorrect settings for the layout stretching.
2018-03-15 15:21:37 +01:00
Jeremy Rimpo e0f003a9a6 Merge pull request #273 from Al12rs/Develop
Fixed file preview bug, wrong nexus urls in csv export and reverted some ui changes from Creator
2018-03-12 17:36:01 -05:00
Al12rs ccb5ad53e2 Fixed wrong Nexus page url in CSV export. 2018-03-12 23:18:03 +01:00
Jeremy Rimpo 9c596ceb79 Merge pull request #271 from AnyOldName3/qtdds-dll-deployment
Deploy the qtdds.dll as part of the MO install
2018-03-12 14:58:04 -05:00
Al12rs 8305d92157 Reverted some changes added by Qt configurator that caused some wird stretching of the mainwindow. I suspect this is caused by the fact that the archive tab was not disabled in a way that Configurator liked and it is messing with it. 2018-03-12 20:54:30 +01:00
Al12rs 9f61ef5c9e Added a check to the preview function to handle tha case of the file beeing from the actual data folder instead of a mod. 2018-03-12 20:53:33 +01:00
Brian Munro 887d464f2c Merge pull request #272 from SuperSandro2000/patch-1
Updated Repository links
2018-03-12 18:28:45 +02:00
Sandro Jäckel 0d4a59fd91 Missed one 2018-03-12 17:10:49 +01:00
Sandro Jäckel 8f8beea427 Updated Repository links 2018-03-12 16:30:45 +01:00
AnyOldName3 0983c88c17 Deploy the qtdds.dll as part of the MO install 2018-03-11 23:15:07 +00:00
LePresidente 9ee2831c59 Fix library include for zlibstatic 2018-03-11 16:24:12 +02:00
LePresidente d6aab781ee Fix library include for zlibstatic 2018-03-11 16:21:06 +02:00
Sandro Jäckel a7f17c6429 Don't set zlib_root 2018-03-11 14:23:52 +02:00
Jeremy Rimpo 12161d68fb Merge pull request #270 from Modorganizer2/master
Pull master changes into develop
2018-03-10 18:35:05 -06:00
Jeremy Rimpo 090d660831 Merge pull request #268 from AnyOldName3/qt-deploy-fix
Improve Qt deployment so all DLLs are staged properly
2018-03-10 17:50:24 -06:00
AnyOldName3 b7b12bb789 Separate windeployqt calls into their own EXECUTE_PROCESS calls so that they run sequentially 2018-03-10 15:35:22 +00:00
Jeremy Rimpo 30a9f61d6d Merge pull request #266 from SuperSandro2000/Develop
Don't set zlib_root
2018-03-09 18:12:58 -06:00
Sandro Jäckel f7ab05767c Update readme.md 2018-03-09 18:32:07 +01:00
Sandro Jäckel d7e6adb3de Don't set zlib_root 2018-03-09 18:25:48 +01:00
Jeremy Rimpo 00d8c517ec Merge pull request #263 from SuperSandro2000/master
Added qdds.dll as Qt no longer contains it
2018-03-08 16:46:38 -06:00
Jeremy Rimpo c7f660e061 Remove outdated namespacing and correct the PATH setting to appends dlls 2018-03-08 15:55:24 -06:00
Sandro Jäckel d59b28847c Added qdds.dll as Qt no longer contains it 2018-03-08 22:33:23 +01:00
Al 5b565b5634 Merge pull request #259 from Al12rs/Dev
Added check for mod rename and a number of small ui changes.
2018-03-08 22:27:20 +01:00
Al12rs 673a5034f0 Added check for mod rename to ensure the new name is not already used by another mod. 2018-03-07 14:41:48 +01:00
Al12rs 7c87e9a645 Edited "Add/Remove category" menu entry text to "Change Category". 2018-03-07 14:41:26 +01:00
Al12rs 52501e73c9 Updated Open Folder icon as it was not very distinguishable. 2018-03-07 14:40:53 +01:00
Al12rs 513c062932 Inverted position of reinstall and remove mod, as per user request. 2018-03-07 14:39:25 +01:00
Al12rs 7cf0c1a29b Changed tooltip of Open Folder menu. 2018-03-07 14:38:59 +01:00
Al12rs a873f7cfe2 Removed "Repace category" menu option from the modlist as it was redundant and cluttering the menu. 2018-03-07 14:38:30 +01:00
Al12rs 1b85cda626 Added open logs folder to open folder toolbar dropdown. 2018-03-07 14:37:12 +01:00
Brian Munro c7e1d9738f Merge pull request #252 from LePresidente/new_vfs_library
Update master to latest stable code.
2018-03-05 11:35:58 +02:00
Brian Munro a540a542a4 Merge branch 'master' into new_vfs_library 2018-03-05 11:35:47 +02:00
Jeremy Rimpo 3eee61c67b Merge branch 'new_vfs_library' of github.com:LePresidente/modorganizer into new_vfs_library 2018-03-05 00:14:16 -06:00
Jeremy Rimpo 3556d4f58f Light flagged master support and other minor changes 2018-03-05 00:13:09 -06:00
Al 8e97f3f84c Merge pull request #251 from SuperSandro2000/readme
Added GPLv3 license to repo
2018-03-03 21:30:16 +01:00
Sandro Jäckel e6f999ffbb Added license 2018-03-03 14:23:12 +01:00
Al 5fcd51aad8 Merge pull request #247 from Al12rs/new_vfs_library
- Added "Open Folders" drop-down menu over modlist.
2018-02-28 21:00:11 +01:00
Al12rs c1421d0734 - Added Open Folders drop-down menu over the modlist (using new custom icon) and moved there all previuolsy added "open <> folder" menu options.
- Added "Open MO install folder" option.
2018-02-28 20:57:08 +01:00
Al 4a45e1a2a7 Merge pull request #239 from SuperSandro2000/readme
Update readme.md
2018-02-26 21:45:38 +01:00
Al 50c244d7e1 Merge pull request #244 from Al12rs/new_vfs_library
Added new stylesheets and changed border of clear filter button.
2018-02-26 21:44:09 +01:00
Al12rs b82f9f1006 Added two custom stylesheets created by AlcoholSwabs on nexus that he very kindly gave permissions to include in MO2 releases. 2018-02-26 21:35:37 +01:00
Al12rs 8ebd79ee71 Reduced Clear filter red border to one pixel instead of two. 2018-02-26 21:34:14 +01:00
Sandro Jäckel e70ee1e895 Update readme.md 2018-02-23 12:40:49 +01:00
Brian Munro 0a4fa10ca4 Merge pull request #237 from SuperSandro2000/new_vfs_library
Revert "Applied clang-format on source"
2018-02-23 06:38:12 +02:00
Sandro Jäckel ea6292168a Revert "Applied clang-format on source"
This reverts commit 5e5c9c0729.
2018-02-23 01:45:58 +01:00
Brian Munro 28714f0eb8 Merge pull request #236 from SuperSandro2000/new_vfs_library
Update reame.md
2018-02-22 18:02:02 +02:00
Sandro Jäckel 5e5c9c0729 Applied clang-format on source 2018-02-22 16:54:34 +01:00
Sandro 5ad912e193 Update CMakeLists.txt
project name was different than I thought
2018-02-22 16:46:43 +01:00
Sandro Jäckel 0fa6f7feff Merge remote-tracking branch 'upstream/new_vfs_library' into new_vfs_library 2018-02-22 16:38:30 +01:00
Sandro Jäckel (SuperSandro2000) ee7d801b86 Added truly all Repos to readme.md and changed a few bits 2018-02-22 16:31:11 +01:00
Sandro 1cdfb7105d Update CMakeLists.txt
project name was different than I thought
2018-02-22 16:27:53 +01:00
Brian Munro 0bcd752b27 Merge pull request #235 from SuperSandro2000/patch-2
Make sure that we get all files for sure
2018-02-22 15:05:49 +02:00
Sandro 1f34f7d8c1 Make sure that we get all files for sure 2018-02-22 13:28:02 +01:00
Brian Munro c2cc2a82c8 Merge pull request #234 from SuperSandro2000/patch-2
Update CMakeLists.txt
2018-02-22 12:32:56 +02:00
Sandro 7e2b83c922 Update CMakeLists.txt
project name was different than I thought
2018-02-22 11:32:15 +01:00
Brian Munro 9624d86b46 Merge pull request #233 from SuperSandro2000/patch-1
set MO as StartUp Project
2018-02-21 10:58:06 +02:00
Sandro 9fd3f6c4e4 set MO as StartUp Project
Sets MordOrganizer as StartUp Project in VisualStudio.
Reference: https://stackoverflow.com/a/37994396/4446318
2018-02-20 12:14:24 +01:00
Al 4804903f3a Merge pull request #231 from Al12rs/new_vfs_library
Changed switch instance icon and tooltip
2018-02-18 18:47:51 +01:00
Al12rs 61898074fe Changed switch instance icon and tooltip 2018-02-18 16:43:16 +01:00
Al ea7c391c33 Updated description and links 2018-02-16 10:29:20 +01:00
Al 7dfe0c9a8f Merge pull request #229 from SuperSandro2000/patch-1
Updated repo links in Readme to LePresidente ones
2018-02-16 10:10:53 +01:00
Sandro 0241d71da3 Updated repo links in Readme to LePresidente ones
Info: https://github.com/TanninOne/modorganizer-tool_nmmimport has not been forked by LePresidente
2018-02-16 09:11:00 +01:00
Al 5be7c9a0b5 Merge pull request #228 from Al12rs/new_vfs_library
Export to csv feature changes and added clear filter button.
2018-02-15 12:23:33 +01:00
Al12rs f7374a8525 - Added "Clear all Filters" button with red outline that only shows up if one or more filters are selected.
- Fixed a bug that would not allow the already present "Clear" button under the filters tab to clear "contains" type of filters.
- Fixed a bug that enabled the "Clear" button at the start even if there were no filters selected.
2018-02-15 01:56:40 +01:00
Al12rs dd8f73178c Small changes to make the modlist context menu more organized. 2018-02-14 20:08:31 +01:00
Al12rs 3f5f56397b - Complete overhaul of export to csv feature with custom column selection and added entries.
Basically I added a new dialog to ask the user if he wants all/enabled/visible mods and what columns to include via checkboxes.
Also added Mod_Status column.
2018-02-14 20:07:53 +01:00
Al12rs e85285934e - Added mod priority, primary category, install date and nexus url columns to Export to csv feature.
- Changed priority and install date format to be sortable in csv columns.
2018-02-13 23:49:18 +01:00
Al12rs e1fc0d22b6 - Fixed a bug that would keep re-activating the "Create files in mod instead of Overwrite" setting in the executable dialog after the user activated it for the first time.
Basically it looked in the stored settings to see if there was an entry for that executable to decide if the checkbox was to be enebled but never deleted that entry if the checkbox was then deselected.
2018-02-13 21:02:56 +01:00
Al12rs 9ddbf25809 Added support for High DPI Scaling for higher resolution monitors. 2018-02-12 17:19:07 +01:00
Al12rs ed08faa4a8 - Changed "Remove Installed" and "Delete Installed" Downloads menu options to not consider the Downloads of Mods that were uninstalled.
- Changed Downloads menu options to say "Hide all..." instead of "Remove all...".
2018-02-12 17:18:18 +01:00
Al12rs 0c4cdb89ad Changed the data tab to remember the current expanded folders when hiding or un-hiding a file. Using the refresh button will close alll the expanded nodes an return to the initial state as it did before. 2018-02-08 22:59:35 +01:00
Jeremy Rimpo 28b0411cca Merge pull request #219 from Al12rs/new_vfs_library
Fixed customOverwrite, reverted nxm handler commit, added a few menu options.
2018-02-07 14:08:17 -06:00
Al12rs d6b645413c Revert "Fixed nexus link handling to use gameNexusName() instead of gameShortName()."
This reverts commit ca54760c13.
2018-01-27 12:28:56 +01:00
Al12rs 3a17614bed Added "open downloads folder", "open profile folder", "open game fodler" and "open MyGames fodler" to the menu entries options of the mainwindow.
Changed the menu entry "open in explorer" of overwrite to show even if overwrite is empty.
2018-01-26 18:24:36 +01:00
Al12rs ba0cd0e10d Fixed customOverwrite setting for executables.
The setting was not being passed to spawnBinary() and was left empty. Just added a couple lines to pass that too. If the setting is disabled cutomOverwrite should be empty and the normal overwrite folder will be used instead.
2018-01-24 13:43:53 +01:00
Jeremy Rimpo 8c34131bb8 Merge pull request #209 from Al12rs/new_vfs_library
Added a delete Instances dialog and various other things.
2018-01-22 14:06:36 -06:00
Al12rs 3fdb00e0c9 Added "Open instance folder" entry to the small options list menĂą. 2018-01-19 12:46:07 +01:00
Al12rs 95b258c0df Updated InstanceSelection dialog to be slighly more clear. 2018-01-19 11:53:47 +01:00
Al12rs 45b3614fbc fixed a typo in the label text 2018-01-19 01:13:45 +01:00
Al12rs 7dbb4cedda Added message when creating a new instance with an already existing name,
Aldded manageInstances dialog to allow users to delete local instances,
Added a number of confirmation messageboxes.
2018-01-18 19:57:52 +01:00
Brian Munro 5d5a7b8511 Merge pull request #203 from erasmux/dev
Add warning when MO1 hook.dll is left in game folder
2018-01-13 11:27:09 +02:00
Brian Munro 0413bf27a5 Merge pull request #199 from matzman666/new_vfs_library
Fixed handling of nexus links for FO4VR.
2018-01-13 11:27:01 +02:00
Eran Mizrahi d267b8aaf3 Add warning when MO1 hook.dll is left in game folder 2018-01-13 00:34:07 +02:00
matzman666 ca54760c13 Fixed nexus link handling to use gameNexusName() instead of gameShortName(). 2018-01-06 21:36:21 +01:00
Jeremy Rimpo d2c5ed352d Merge pull request #195 from erasmux/dev
Cleaner openssl deployment and add diagnostics for openssl loading
2018-01-05 23:15:07 -06:00
Eran Mizrahi 71995f0343 preload openssl dlls (probably unnecessary but can help troubleshooting openssl issues) 2018-01-06 06:43:00 +02:00
Eran Mizrahi 5579db7f90 remove opensll dll from manifest 2018-01-06 06:43:00 +02:00
Jeremy Rimpo d2f90e6a76 Merge pull request #193 from erasmux/dev
Log MO version + remove downloads auto scrolling
2018-01-05 10:16:34 -06:00
Eran Mizrahi 785852cf21 Don't auto scroll down the downloads list (even when a file was downloaded) 2018-01-04 23:41:44 +02:00
Eran Mizrahi 14b06dd2e8 Don't auto scroll down the downloads list 2018-01-04 21:01:30 +02:00
Eran Mizrahi 58ec83f8c8 Log the MO version for diagnostic purposes 2018-01-04 21:01:30 +02:00
Jeremy Rimpo d06972729d Merge pull request #180 from erasmux/dev
Prefer hiding the MO proxy when waiting for spawned processes
2018-01-01 21:16:06 -06:00
Eran Mizrahi 39efb9a7c2 Prefer hiding the MO proxy when waiting for spawned processes 2017-12-29 15:32:25 +02:00
LePresidente c1a56f77ea Version bump to 2.1.1 2017-12-27 17:48:02 +02:00
Brian Munro 91bd9b1eb6 Merge pull request #168 from erasmux/dev
Various fixes
2017-12-27 10:40:59 +02:00
Eran Mizrahi 548744d746 Don't log username and password 2017-12-27 04:18:46 +02:00
Eran Mizrahi 57e65abf75 Clean up proxy spawning a process (cleaner args forwarding and QProcess had some problems even without arguments) 2017-12-27 02:43:33 +02:00
Eran Mizrahi d41cd8d877 Virtualize spawning of executable also if working directory is under mods folder 2017-12-27 02:41:43 +02:00
Eran Mizrahi 9c82a1102e Enable open in explorer option also for overwrite 2017-12-27 02:41:42 +02:00
Eran Mizrahi e623c13400 Add clear overwrite option 2017-12-27 02:41:42 +02:00
Eran Mizrahi 9c9a43ec8d print settings loading and changes to log for diagnostic purposes 2017-12-27 02:41:42 +02:00
Eran Mizrahi eb3cfe2594 Default to sorting newest download first 2017-12-26 21:01:57 +02:00
Eran Mizrahi 482f3d1f6d Show the newly added mod when creating an empty mod 2017-12-26 19:38:37 +02:00
Eran Mizrahi fed4ea257a Fix mods priorities getting messed up when renaming a mod 2017-12-26 19:07:55 +02:00
Brian Munro a4e43b68cd Create ISSUE_TEMPLATE.md
Added issue template for future issues to stick to a standard
2017-12-10 15:52:59 +02:00
Brian Munro cdf588e7c4 Added download location for furture releases,
Added download location for furture releases,
2016-12-13 07:26:25 +02:00
70 changed files with 3365 additions and 448 deletions
+6 -5
View File
@@ -1,14 +1,15 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12)
ADD_COMPILE_OPTIONS($<$<CXX_COMPILER_ID:MSVC>:/MP>)
PROJECT(organizer)
# sets ModOrganizer as StartUp Project in Visual Studio
set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY VS_STARTUP_PROJECT "ModOrganizer")
SET(DEPENDENCIES_DIR CACHE PATH "")
# hint to find qt in dependencies path
LIST(APPEND CMAKE_PREFIX_PATH ${QT_ROOT}/lib/cmake)
FILE(GLOB_RECURSE BOOST_ROOT ${DEPENDENCIES_DIR}/boost*/project-config.jam)
GET_FILENAME_COMPONENT(BOOST_ROOT ${BOOST_ROOT} DIRECTORY)
SET(ZLIB_ROOT ${DEPENDENCIES_DIR}/zlib)
LIST(APPEND CMAKE_PREFIX_PATH ${LZ4_ROOT}/dll)
ADD_SUBDIRECTORY(src)
+674
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+72 -31
View File
@@ -1,42 +1,83 @@
# Mod Organizer
Mod Organizer (MO) is a tool for managing mod collections of arbitrary size. It is specifically designed for people who like to experiment with mods and thus need an easy and reliable way to install and uninstall them.
Mod Organizer 2 is a mod manager created by Tannin to support 64-bit games like Skyrim Special Edition and Fallout 4 in addition to all the 32-bit games MO1 already supported.
Tannin discontinued the project when he was hired by the Nexus team to develop their new Vortex mod manager.
MO2 was not completed and was left with many issues. LePresidente managed to fix it to a usable state by himself after SkyrimSE came out, adding support for it, and releasing v2.0.8.
The project took up speed again after a few more coders showed up in late 2017, and a lot of progress has been made.
## Help Wanted!
Mod Organizer 2 is an open project in the hands of the community, there are problems that need to be solved and things that could be added. MO2 really needs developers and if you have the programming skills and some free time you can really improve the experience of the modding community.
To have more information, please join the open MO2 Development discord server :* [ModOrganizerDevs](https://discord.gg/vD2ZbfX)
If you want to help translate MO2 to your language you should join the discord server too and head to the #translation channel.
To setup a development environment on your machine, there is the [umbrella project](https://github.com/Modorganizer2/modorganizer-umbrella) that handles that.
If you want to submit your code changes, please use a good formating style like the default one in Visual Studio.
Through the work of a few people of the community MO2 has come quite far, now it needs some more of those people to go further.
## Reporting Issues:
Issues should be reported to the GitHub page or on the open discord server: [ModOrganizerDevs](https://discord.gg/vD2ZbfX). Here is also where dev builds are tested, bugs are reported and investigated, suggestions are discussed and a lot more.
Credits to Tannin, LePresidente, Silarn, erasmux, AL12 and many others for the development.
## Download Location
* on [GitHub.com](https://github.com/Modorganizer2/modorganizer/releases)
* on [NexusMods.com](https://www.nexusmods.com/skyrimspecialedition/mods/6194)
## Old Download Location
* [TanninOne/modorganizer/releases](https://github.com/TanninOne/modorganizer/releases)
## Building
Please refer to [TanninOne/modorganizer-umbrella](https://github.com/TanninOne/modorganizer-umbrella) for build instructions.
Please refer to [Modorganizer2/modorganizer-umbrella](https://github.com/Modorganizer2/modorganizer-umbrella) for build instructions.
## Other Repositories
MO consists of multiple repositories on github. The Umbrella project will download them automatically as required. They should however also be buildable individually.
MO2 consists of multiple repositories on github. The Umbrella project will download them automatically as required. They should however also be buildable individually.
Here is a complete list:
* https://github.com/TanninOne/modorganizer
* https://github.com/TanninOne/modorganizer-uibase
* https://github.com/TanninOne/modorganizer-hookdll
* https://github.com/TanninOne/modorganizer-bsatk
* https://github.com/TanninOne/modorganizer-esptk
* https://github.com/TanninOne/modorganizer-archive
* https://github.com/TanninOne/modorganizer-nxmhandler
* https://github.com/TanninOne/modorganizer-lootcli
* https://github.com/TanninOne/modorganizer-helper
* https://github.com/LePresidente/cpython-1
* https://github.com/Modorganizer2/githubpp
* https://github.com/Modorganizer2/modorganizer
* https://github.com/Modorganizer2/modorganizer-archive
* https://github.com/Modorganizer2/modorganizer-bsatk
* https://github.com/Modorganizer2/modorganizer-bsa_extractor
* https://github.com/Modorganizer2/modorganizer-check_fnis
* https://github.com/Modorganizer2/modorganizer-diagnose_basic
* https://github.com/Modorganizer2/modorganizer-esptk
* https://github.com/Modorganizer2/modorganizer-helper
* https://github.com/Modorganizer2/modorganizer-game_fallout3
* https://github.com/Modorganizer2/modorganizer-game_fallout4
* https://github.com/Modorganizer2/modorganizer-game_fallout4vr
* https://github.com/Modorganizer2/modorganizer-game_falloutnv
* https://github.com/Modorganizer2/modorganizer-game_features
* https://github.com/Modorganizer2/modorganizer-game_gamebryo
* https://github.com/Modorganizer2/modorganizer-game_morrowind
* https://github.com/Modorganizer2/modorganizer-game_oblivion
* https://github.com/Modorganizer2/modorganizer-game_skyrim
* https://github.com/Modorganizer2/modorganizer-game_skyrimSE
* https://github.com/Modorganizer2/modorganizer-game_ttw
* https://github.com/Modorganizer2/modorganizer-installer_bain
* https://github.com/Modorganizer2/modorganizer-installer_bundle
* https://github.com/Modorganizer2/modorganizer-installer_fomod
* https://github.com/Modorganizer2/modorganizer-installer_manual
* https://github.com/Modorganizer2/modorganizer-installer_ncc
* https://github.com/Modorganizer2/modorganizer-installer_quick
* https://github.com/Modorganizer2/modorganizer-lootcli
* https://github.com/Modorganizer2/modorganizer-NCC
* https://github.com/Modorganizer2/modorganizer-nxmhandler
* https://github.com/Modorganizer2/modorganizer-plugin_python
* https://github.com/Modorganizer2/modorganizer-preview_base
* https://github.com/Modorganizer2/modorganizer-tool_configurator
* https://github.com/Modorganizer2/modorganizer-tool_inibakery
* https://github.com/Modorganizer2/modorganizer-uibase
* https://github.com/Modorganizer2/usvfs
### Unused Repositories
* https://github.com/Modorganizer2/modorganizer-hookdll
* https://github.com/TanninOne/modorganizer-tool_nmmimport
* https://github.com/TanninOne/modorganizer-tool_configurator
* https://github.com/TanninOne/modorganizer-tool_inieditor
* https://github.com/TanninOne/modorganizer-preview_base
* https://github.com/TanninOne/modorganizer-diagnose_basic
* https://github.com/TanninOne/modorganizer-installer_quick
* https://github.com/TanninOne/modorganizer-installer_manual
* https://github.com/TanninOne/modorganizer-installer_fomod
* https://github.com/TanninOne/modorganizer-installer_bundle
* https://github.com/TanninOne/modorganizer-installer_bain
* https://github.com/TanninOne/modorganizer-game_skyrim
* https://github.com/TanninOne/modorganizer-game_oblivion
* https://github.com/TanninOne/modorganizer-game_fallout3
* https://github.com/TanninOne/modorganizer-game_fallout4
* https://github.com/TanninOne/modorganizer-game_falloutnv
* https://github.com/TanninOne/modorganizer-game_gamebryo
* https://github.com/TanninOne/modorganizer-game_features
* https://github.com/TanninOne/modorganizer-check_fnis
* https://github.com/TanninOne/modorganizer-plugin_python
* https://github.com/TanninOne/modorganizer-bsa_extractor
* https://github.com/TanninOne/usvfs
+25 -12
View File
@@ -1,4 +1,4 @@
CMAKE_MINIMUM_REQUIRED (VERSION 2.8)
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
CMAKE_POLICY(SET CMP0020 NEW)
#CMAKE_POLICY(SET CMP0043 NEW)
@@ -249,10 +249,13 @@ FIND_PACKAGE(Qt5Quick REQUIRED)
FIND_PACKAGE(Qt5Network REQUIRED)
FIND_PACKAGE(Qt5WinExtras REQUIRED)
FIND_PACKAGE(Qt5WebEngineWidgets REQUIRED)
FIND_PACKAGE(Qt5Script REQUIRED)
FIND_PACKAGE(Qt5Qml REQUIRED)
FIND_PACKAGE(Qt5LinguistTools)
QT5_WRAP_UI(organizer_UIHDRS ${organizer_UIS})
QT5_ADD_RESOURCES(organizer_RCCPPS ${organizer_QRCS})
QT5_CREATE_TRANSLATION(organizer_translations_qm ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/organizer_en.ts)
ADD_CUSTOM_TARGET(translations DEPENDS ${organizer_translations_qm})
INCLUDE_DIRECTORIES(${Qt5Declarative_INCLUDES})
@@ -277,6 +280,7 @@ SET(default_project_path "${CMAKE_SOURCE_DIR}/..")
GET_FILENAME_COMPONENT(${default_project_path} ${default_project_path} REALPATH)
SET(project_path "${default_project_path}" CACHE PATH "path to the other mo projects")
#TODO this should not be a hardcoded path
SET(lib_path "${project_path}/../../install/libs")
@@ -287,13 +291,13 @@ INCLUDE_DIRECTORIES(${project_path}/uibase/src
${project_path}/../usvfs/include
${project_path}/game_gamebryo/src
${project_path}/game_features/src
${project_path}/githubpp/src)
${project_path}/githubpp/src
${LZ4_ROOT}/include)
INCLUDE_DIRECTORIES(shared ${ZLIB_INCLUDE_DIRS})
LINK_DIRECTORIES(${lib_path}
${project_path}/../zlib/lib)
${ZLIB_ROOT}/lib
${LZ4_ROOT}/dll)
EXECUTE_PROCESS(
COMMAND git log -1 --format=%h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
@@ -312,11 +316,12 @@ ENDIF()
ADD_EXECUTABLE(ModOrganizer WIN32 ${organizer_HDRS} ${organizer_SRCS} ${organizer_UIHDRS} ${organizer_RCS} ${organizer_RCCPPS} ${organizer_translations_qm})
TARGET_LINK_LIBRARIES(ModOrganizer
Qt5::Widgets Qt5::WinExtras Qt5::WebEngineWidgets Qt5::Quick
Qt5::Script Qt5::Qml Qt5::QuickWidgets Qt5::Network
${Boost_LIBRARIES}
zlibstatic
uibase esptk bsatk githubpp
${usvfs_name}
Dbghelp advapi32 Version Shlwapi)
Dbghelp advapi32 Version Shlwapi liblz4)
IF (NOT "${OPTIMIZE_COMPILE_FLAGS}" STREQUAL "")
SET_TARGET_PROPERTIES(ModOrganizer PROPERTIES COMPILE_FLAGS_RELWITHDEBINFO
${OPTIMIZE_COMPILE_FLAGS})
@@ -325,9 +330,6 @@ SET_TARGET_PROPERTIES(ModOrganizer PROPERTIES LINK_FLAGS_RELWITHDEBINFO
"/LARGEADDRESSAWARE ${OPTIMIZE_LINK_FLAGS}")
QT5_USE_MODULES(ModOrganizer Widgets Script Qml QuickWidgets Quick Network WebEngineWidgets)
###############
## Installation
@@ -347,10 +349,16 @@ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.qt5
SET(windeploy_parameters "--no-translations --plugindir qtplugins --libdir dlls --release-with-debug-info --no-compiler-runtime")
INSTALL(
CODE
"EXECUTE_PROCESS(
COMMAND
"EXECUTE_PROCESS(COMMAND
${qt5bin}/windeployqt.exe ModOrganizer.exe --webenginewidgets ${windeploy_parameters}
COMMAND
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin
)
# run it a second time because on the first run it misses some files
EXECUTE_PROCESS(COMMAND
${qt5bin}/windeployqt.exe ModOrganizer.exe --webenginewidgets ${windeploy_parameters}
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin
)
EXECUTE_PROCESS(COMMAND
${qt5bin}/windeployqt.exe uibase.dll ${windeploy_parameters}
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin
)
@@ -363,6 +371,11 @@ INSTALL(
file(REMOVE_RECURSE ${CMAKE_INSTALL_PREFIX}/bin/qtplugins)"
)
# qdds.dll needs installing manually as Qt no longer ships with it by default.
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../qdds.dll DESTINATION bin/dlls/imageformats)
install(FILES ${organizer_translations_qm} DESTINATION bin/translations)
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/stylesheets
${CMAKE_CURRENT_SOURCE_DIR}/tutorials
DESTINATION bin)
+32 -10
View File
@@ -29,7 +29,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QTextBrowser>
#include <QVariant>
#include <Qt>
#include <QFontDatabase>
AboutDialog::AboutDialog(const QString &version, QWidget *parent)
: QDialog(parent)
@@ -37,24 +37,44 @@ AboutDialog::AboutDialog(const QString &version, QWidget *parent)
{
ui->setupUi(this);
m_LicenseFiles[LICENSE_LGPL3] = "lgpl-3.0.txt";
m_LicenseFiles[LICENSE_GPL3] = "gpl-3.0.txt";
m_LicenseFiles[LICENSE_BSD3] = "bsd3.txt";
m_LicenseFiles[LICENSE_LGPL3] = "LGPL-v3.0.txt";
m_LicenseFiles[LICENSE_LGPL21] = "GNU-LGPL-v2.1.txt";
m_LicenseFiles[LICENSE_GPL3] = "GPL-v3.0.txt";
m_LicenseFiles[LICENSE_GPL2] = "GPL-v2.0.txt";
m_LicenseFiles[LICENSE_BOOST] = "boost.txt";
m_LicenseFiles[LICENSE_CCBY3] = "by-sa3.txt";
m_LicenseFiles[LICENSE_7ZIP] = "7zip.txt";
m_LicenseFiles[LICENSE_CCBY3] = "BY-SA-v3.0.txt";
m_LicenseFiles[LICENSE_ZLIB] = "zlib.txt";
m_LicenseFiles[LICENSE_APACHE2] = "apache-license-2.0.txt";
m_LicenseFiles[LICENSE_PYTHON] = "python.txt";
m_LicenseFiles[LICENSE_SSL] = "openssl.txt";
m_LicenseFiles[LICENSE_CPPTOML] = "cpptoml.txt";
m_LicenseFiles[LICENSE_UDIS] = "udis86.txt";
m_LicenseFiles[LICENSE_SPDLOG] = "spdlog.txt";
m_LicenseFiles[LICENSE_FMT] = "fmt.txt";
m_LicenseFiles[LICENSE_SIP] = "sip.txt";
m_LicenseFiles[LICENSE_CASTLE] = "Castle.txt";
m_LicenseFiles[LICENSE_ANTLR] = "AntlrBuildTask.txt";
m_LicenseFiles[LICENSE_DXTEX] = "DXTex.txt";
addLicense("Qt", LICENSE_LGPL3);
addLicense("Qt Json", LICENSE_GPL3);
addLicense("Boost Library", LICENSE_BOOST);
addLicense("7-zip", LICENSE_LGPL3);
addLicense("ZLib", LICENSE_ZLIB);
addLicense("7-zip", LICENSE_7ZIP);
addLicense("ZLib", LICENSE_NONE);
addLicense("Tango Icon Theme", LICENSE_NONE);
addLicense("RRZE Icon Set", LICENSE_CCBY3);
addLicense("Icons by Lorc, Delapouite and sbed available on http://game-icons.net", LICENSE_CCBY3);
addLicense("Castle Core", LICENSE_APACHE2);
addLicense("Castle Core", LICENSE_CASTLE);
addLicense("ANTLR", LICENSE_ANTLR);
addLicense("LOOT", LICENSE_GPL3);
addLicense("Python", LICENSE_PYTHON);
addLicense("OpenSSL", LICENSE_SSL);
addLicense("cpptoml", LICENSE_CPPTOML);
addLicense("Udis86", LICENSE_UDIS);
addLicense("spdlog", LICENSE_SPDLOG);
addLicense("{fmt}", LICENSE_FMT);
addLicense("SIP", LICENSE_SIP);
addLicense("DXTex Headers", LICENSE_DXTEX);
ui->nameLabel->setText(QString("<span style=\"font-size:12pt; font-weight:600;\">%1 %2</span>").arg(ui->nameLabel->text()).arg(version));
#if defined(HGID)
@@ -64,6 +84,8 @@ AboutDialog::AboutDialog(const QString &version, QWidget *parent)
#else
ui->revisionLabel->setText(ui->revisionLabel->text() + " unknown");
#endif
ui->licenseText->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
}
@@ -85,7 +107,7 @@ void AboutDialog::on_creditsList_currentItemChanged(QListWidgetItem *current, QL
{
auto iter = m_LicenseFiles.find(current->data(Qt::UserRole).toInt());
if (iter != m_LicenseFiles.end()) {
QString filePath = qApp->applicationDirPath() + "/license/" + iter->second;
QString filePath = qApp->applicationDirPath() + "/licenses/" + iter->second;
QString text = MOBase::readFileText(filePath);
ui->licenseText->setText(text);
} else {
+13 -2
View File
@@ -45,12 +45,23 @@ private:
enum Licenses {
LICENSE_NONE,
LICENSE_LGPL3,
LICENSE_LGPL21,
LICENSE_GPL3,
LICENSE_BSD3,
LICENSE_GPL2,
LICENSE_BOOST,
LICENSE_CCBY3,
LICENSE_PYTHON,
LICENSE_SSL,
LICENSE_CPPTOML,
LICENSE_7ZIP,
LICENSE_ZLIB,
LICENSE_APACHE2
LICENSE_UDIS,
LICENSE_SPDLOG,
LICENSE_FMT,
LICENSE_SIP,
LICENSE_CASTLE,
LICENSE_ANTLR,
LICENSE_DXTEX
};
private:
+108 -48
View File
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>604</width>
<height>369</height>
<width>1010</width>
<height>477</height>
</rect>
</property>
<property name="windowTitle">
@@ -120,14 +120,14 @@
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string notr="true">Copyright 2011-2016 Sebastian Herbord</string>
<string notr="true">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright 2011-2016 Sebastian Herbord&lt;/p&gt;&lt;p&gt;Copyright 2016-2018 Mod Organizer 2 contributors&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string notr="true">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This program 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.&lt;/p&gt;&lt;p&gt;See the GNU General Public License for more details.&lt;/p&gt;&lt;p&gt;Source code can be found at &lt;a href=&quot;https://github.com/TanninOne/modorganizer&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#007af4;&quot;&gt;GitHub&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string notr="true">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This program 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.&lt;/p&gt;&lt;p&gt;See the GNU General Public License for more details.&lt;/p&gt;&lt;p&gt;Source code can be found at &lt;a href=&quot;https://github.com/Modorganizer2/modorganizer&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#007af4;&quot;&gt;GitHub&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -154,7 +154,7 @@
<string>Thanks</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Current Maintainers</string>
@@ -167,12 +167,17 @@
</property>
<item>
<property name="text">
<string notr="true">LePresidente</string>
<string notr="true">LePresidente (Project Lead)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Silarn</string>
<string>AL12</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Diana</string>
</property>
</item>
<item>
@@ -182,7 +187,7 @@
</item>
<item>
<property name="text">
<string notr="true">Diana</string>
<string notr="true">Silarn</string>
</property>
</item>
</widget>
@@ -201,36 +206,6 @@
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<item>
<property name="text">
<string notr="true">pndrev (German)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">DaWul (Spanish)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Fiama (Spanish)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Alyndiar (French)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Jlkawaii (French)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Rigoletto (French)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Scythe1912 (Chinese)</string>
@@ -248,7 +223,47 @@
</item>
<item>
<property name="text">
<string notr="true">tokcdk (Russian)</string>
<string>Cyb3r (Dutch)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Alyndiar (French)</string>
</property>
</item>
<item>
<property name="text">
<string>fruttyx (French)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Jlkawaii (French)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Rigoletto (French)</string>
</property>
</item>
<item>
<property name="text">
<string>Yoplala (French)</string>
</property>
</item>
<item>
<property name="text">
<string>Faron (German)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">pndrev (German)</string>
</property>
</item>
<item>
<property name="text">
<string>Mordan (Greek)</string>
</property>
</item>
<item>
@@ -261,7 +276,37 @@
</item>
<item>
<property name="text">
<string>... more (Can't track)</string>
<string>Yoosk (Polish)</string>
</property>
</item>
<item>
<property name="text">
<string>Brgodfx (Portuguese)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">tokcdk (Russian)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">DaWul (Spanish)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Fiama (Spanish)</string>
</property>
</item>
<item>
<property name="text">
<string>Jax (Swedish)</string>
</property>
</item>
<item>
<property name="text">
<string>...and all other Transifex contributors!</string>
</property>
<property name="toolTip">
<string/>
@@ -275,7 +320,7 @@
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Other Supporter</string>
<string>Other Supporters &amp;&amp; Contributors</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
@@ -283,9 +328,9 @@
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<item>
<item>
<property name="text">
<string notr="true">Al12 (Discord) </string>
<string notr="true">AnyOldName3</string>
</property>
</item>
<item>
@@ -308,6 +353,11 @@
<string notr="true">Bridger</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Brixified</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">GamerPoet</string>
@@ -323,6 +373,21 @@
<string notr="true">GSDFan</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">ogrotten</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Schilduin</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">SuperSandro2000</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Uhuru</string>
@@ -343,11 +408,6 @@
<string notr="true">thosrtanner</string>
</property>
</item>
<item>
<property name="text">
<string>ogrotten</string>
</property>
</item>
</widget>
</item>
</layout>
+1 -1
View File
@@ -167,7 +167,7 @@ void CategoryFactory::saveCategories()
}
unsigned int CategoryFactory::countCategories(std::tr1::function<bool (const Category &category)> filter)
unsigned int CategoryFactory::countCategories(std::function<bool (const Category &category)> filter)
{
unsigned int result = 0;
for (const Category &cat : m_Categories) {
+1 -1
View File
@@ -99,7 +99,7 @@ public:
* @param filter the filter to test
* @return number of matching categories
*/
unsigned int countCategories(std::tr1::function<bool (const Category &category)> filter);
unsigned int countCategories(std::function<bool (const Category &category)> filter);
/**
* @brief get the id of the parent category
+23 -25
View File
@@ -1,28 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="dlls" version="1.0.0.0" processorArchitecture="x86"/>
<file name="7z.dll"/>
<file name="archive.dll"/>
<file name="d3dcompiler_47.dll"/>
<file name="libeay32.dll"/>
<file name="libEGL.dll"/>
<file name="libGLESV2.dll"/>
<file name="liblz4.dll"/>
<file name="opengl32sw.dll"/>
<file name="Qt5Core.dll"/>
<file name="Qt5Gui.dll"/>
<file name="Qt5Network.dll"/>
<file name="Qt5Positioning.dll"/>
<file name="Qt5PrintSupport.dll"/>
<file name="Qt5Qml.dll"/>
<file name="Qt5Quick.dll"/>
<file name="Qt5QuickWidgets.dll"/>
<file name="Qt5WebChannel.dll"/>
<file name="Qt5SerialPort.dll"/>
<file name="Qt5Svg.dll"/>
<file name="Qt5WebEngineCore.dll"/>
<file name="Qt5WebEngineWidgets.dll"/>
<file name="Qt5Widgets.dll"/>
<file name="Qt5WinExtras.dll"/>
<file name="ssleay32.dll"/>
<assemblyIdentity type="win32" name="dlls" version="1.0.0.0" processorArchitecture="x86"/>
<file name="7z.dll"/>
<file name="archive.dll"/>
<file name="d3dcompiler_47.dll"/>
<file name="libEGL.dll"/>
<file name="libGLESV2.dll"/>
<file name="liblz4.dll"/>
<file name="opengl32sw.dll"/>
<file name="Qt5Core.dll"/>
<file name="Qt5Gui.dll"/>
<file name="Qt5Network.dll"/>
<file name="Qt5Positioning.dll"/>
<file name="Qt5PrintSupport.dll"/>
<file name="Qt5Qml.dll"/>
<file name="Qt5Quick.dll"/>
<file name="Qt5QuickWidgets.dll"/>
<file name="Qt5WebChannel.dll"/>
<file name="Qt5SerialPort.dll"/>
<file name="Qt5Svg.dll"/>
<file name="Qt5WebEngineCore.dll"/>
<file name="Qt5WebEngineWidgets.dll"/>
<file name="Qt5Widgets.dll"/>
<file name="Qt5WinExtras.dll"/>
</assembly>
+3 -3
View File
@@ -318,7 +318,7 @@ bool DownloadListWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel *
if (hidden) {
menu.addAction(tr("Un-Hide"), this, SLOT(issueRestoreToView()));
} else {
menu.addAction(tr("Remove from View"), this, SLOT(issueRemoveFromView()));
menu.addAction(tr("Hide"), this, SLOT(issueRemoveFromView()));
}
} else if (state == DownloadManager::STATE_DOWNLOADING){
menu.addAction(tr("Cancel"), this, SLOT(issueCancel()));
@@ -334,8 +334,8 @@ bool DownloadListWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel *
menu.addAction(tr("Delete All..."), this, SLOT(issueDeleteAll()));
if (!hidden) {
menu.addSeparator();
menu.addAction(tr("Remove Installed..."), this, SLOT(issueRemoveFromViewCompleted()));
menu.addAction(tr("Remove All..."), this, SLOT(issueRemoveFromViewAll()));
menu.addAction(tr("Hide Installed..."), this, SLOT(issueRemoveFromViewCompleted()));
menu.addAction(tr("Hide All..."), this, SLOT(issueRemoveFromViewAll()));
}
menu.exec(mouseEvent->globalPos());
+3 -3
View File
@@ -303,7 +303,7 @@ bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItem
if (hidden) {
menu.addAction(tr("Un-Hide"), this, SLOT(issueRestoreToView()));
} else {
menu.addAction(tr("Remove from View"), this, SLOT(issueRemoveFromView()));
menu.addAction(tr("Hide"), this, SLOT(issueRemoveFromView()));
}
} else if (state == DownloadManager::STATE_DOWNLOADING){
menu.addAction(tr("Cancel"), this, SLOT(issueCancel()));
@@ -319,8 +319,8 @@ bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItem
menu.addAction(tr("Delete All..."), this, SLOT(issueDeleteAll()));
if (!hidden) {
menu.addSeparator();
menu.addAction(tr("Remove Installed..."), this, SLOT(issueRemoveFromViewCompleted()));
menu.addAction(tr("Remove All..."), this, SLOT(issueRemoveFromViewAll()));
menu.addAction(tr("Hide Installed..."), this, SLOT(issueRemoveFromViewCompleted()));
menu.addAction(tr("Hide All..."), this, SLOT(issueRemoveFromViewAll()));
}
menu.exec(mouseEvent->globalPos());
+73 -12
View File
@@ -460,7 +460,29 @@ void DownloadManager::addNXMDownload(const QString &url)
return;
}
for (auto pair : m_PendingDownloads) {
if (pair.first == nxmInfo.modId() && pair.second == nxmInfo.fileId()) {
qDebug("download requested is already started (mod id: %s, file id: %s)", qPrintable(QString(nxmInfo.modId())), qPrintable(QString(nxmInfo.fileId())));
QMessageBox::information(nullptr, tr("Already Started"), tr("A download for this mod file has already been queued."), QMessageBox::Ok);
return;
}
}
for (DownloadInfo *download : m_ActiveDownloads) {
if (download->m_FileInfo->modID == nxmInfo.modId() && download->m_FileInfo->fileID == nxmInfo.fileId()) {
if (download->m_State == STATE_DOWNLOADING || download->m_State == STATE_PAUSED || download->m_State == STATE_STARTED) {
qDebug("download requested is already started (mod: %s, file: %s)", qPrintable(download->m_FileInfo->modName),
qPrintable(download->m_FileInfo->fileName));
QMessageBox::information(nullptr, tr("Already Started"), tr("There is already a download started for this file (%2).")
.arg(download->m_FileInfo->modName).arg(download->m_FileInfo->name), QMessageBox::Ok);
return;
}
}
}
emit aboutToUpdate();
m_PendingDownloads.append(std::make_pair(nxmInfo.modId(), nxmInfo.fileId()));
emit update(-1);
@@ -558,18 +580,20 @@ void DownloadManager::removeDownload(int index, bool deleteFile)
emit aboutToUpdate();
if (index < 0) {
DownloadState minState = index < -1 ? STATE_INSTALLED : STATE_READY;
index = 0;
for (QVector<DownloadInfo*>::iterator iter = m_ActiveDownloads.begin(); iter != m_ActiveDownloads.end();) {
if ((*iter)->m_State >= minState) {
removeFile(index, deleteFile);
delete *iter;
iter = m_ActiveDownloads.erase(iter);
} else {
++iter;
++index;
}
}
DownloadState minState = index == -1 ? STATE_READY : STATE_INSTALLED;
index = 0;
for (QVector<DownloadInfo*>::iterator iter = m_ActiveDownloads.begin(); iter != m_ActiveDownloads.end();) {
if ((*iter)->m_State >= minState) {
removeFile(index, deleteFile);
delete *iter;
iter = m_ActiveDownloads.erase(iter);
QCoreApplication::processEvents();
}
else {
++iter;
++index;
}
}
} else {
if (index >= m_ActiveDownloads.size()) {
reportError(tr("remove: invalid download index %1").arg(index));
@@ -878,6 +902,26 @@ void DownloadManager::markInstalled(int index)
setState(m_ActiveDownloads.at(index), STATE_INSTALLED);
}
void DownloadManager::markInstalled(QString fileName)
{
int index = indexByName(fileName);
if (index >= 0) {
markInstalled(index);
} else {
DownloadInfo *info = getDownloadInfo(fileName);
if (info != nullptr) {
QSettings metaFile(info->m_Output.fileName() + ".meta", QSettings::IniFormat);
metaFile.setValue("installed", true);
metaFile.setValue("uninstalled", false);
}
delete info;
}
}
DownloadManager::DownloadInfo* DownloadManager::getDownloadInfo(QString fileName)
{
return DownloadInfo::createFromMeta(fileName, true);
}
void DownloadManager::markUninstalled(int index)
{
@@ -893,6 +937,23 @@ void DownloadManager::markUninstalled(int index)
}
void DownloadManager::markUninstalled(QString fileName)
{
int index = indexByName(fileName);
if (index >= 0) {
markUninstalled(index);
} else {
QString filePath = QDir::fromNativeSeparators(m_OutputDirectory) + "/" + fileName;
DownloadInfo *info = getDownloadInfo(filePath);
if (info != nullptr) {
QSettings metaFile(info->m_Output.fileName() + ".meta", QSettings::IniFormat);
metaFile.setValue("uninstalled", true);
}
delete info;
}
}
QString DownloadManager::getDownloadFileName(const QString &baseName) const
{
QString fullPath = m_OutputDirectory + "/" + baseName;
+5
View File
@@ -307,6 +307,8 @@ public:
*/
void markInstalled(int index);
void markInstalled(QString download);
/**
* @brief mark a download as uninstalled
*
@@ -314,6 +316,8 @@ public:
*/
void markUninstalled(int index);
void markUninstalled(QString download);
/**
* @brief refreshes the list of downloads
*/
@@ -431,6 +435,7 @@ private slots:
private:
void createMetaFile(DownloadInfo *info);
DownloadManager::DownloadInfo* getDownloadInfo(QString fileName);
public:
+3
View File
@@ -115,6 +115,9 @@ void EditExecutablesDialog::saveExecutable()
m_Profile->storeSetting("custom_overwrites", ui->titleEdit->text(),
ui->newFilesModBox->currentText());
}
else {
m_Profile->removeSetting("custom_overwrites", ui->titleEdit->text());
}
}
+90 -11
View File
@@ -73,24 +73,94 @@ void InstanceManager::setCurrentInstance(const QString &name)
m_AppSettings.setValue(INSTANCE_KEY, name);
}
bool InstanceManager::deleteLocalInstance(const QString &instanceId) const
{
bool result = true;
QString instancePath = QDir::fromNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + instanceId);
QString InstanceManager::queryInstanceName() const
if (QMessageBox::warning(nullptr, QObject::tr("Deleting folder"),
QObject::tr("I'm about to delete the following folder: \"%1\". Proceed?").arg(instancePath), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::No ){
return false;
}
if (!MOBase::shellDelete(QStringList(instancePath),true))
{
qWarning("Failed to shell-delete \"%s\" (errorcode %lu), trying regular delete", qPrintable(instancePath), ::GetLastError());
if (!MOBase::removeDir(instancePath))
{
qWarning("regular delete failed too");
result = false;
}
}
return result;
}
QString InstanceManager::manageInstances(const QStringList &instanceList) const
{
SelectionDialog selection(
QString("<h3>%1</h3><br>%2")
.arg(QObject::tr("Choose Instance to Delete"))
.arg(QObject::tr("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.")),
nullptr);
for (const QString &instance : instanceList)
{
selection.addChoice(QIcon(":/MO/gui/multiply_red"), instance, "", instance);
}
if (selection.exec() == QDialog::Rejected) {
return(chooseInstance(instances()));
}
else {
QString choice = selection.getChoiceData().toString();
{
if (QMessageBox::warning(nullptr, QObject::tr("Are you sure?"),
QObject::tr("Are you really sure you want to delete the Instance \"%1\" with all its files?").arg(choice), QMessageBox::No | QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes)
{
if (!deleteLocalInstance(choice))
{
QMessageBox::warning(nullptr, QObject::tr("Failed to delete Instance"),
QObject::tr("Could not delete Instance \"%1\". \nIf the folder was still in use, restart MO and try again.").arg(choice), QMessageBox::Ok);
}
}
}
}
return(manageInstances(instances()));
}
QString InstanceManager::queryInstanceName(const QStringList &instanceList) const
{
QString instanceId;
while (instanceId.isEmpty()) {
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 sugested list (only letters and numbers allowed):"));
// 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({ "Oblivion", "Skyrim", "SkyrimSE", "Fallout 3",
"Fallout NV", "Fallout 4" });
dialog.setComboBoxItems({ "NewName", "Fallout 4", "SkyrimSE", "Skyrim", "Fallout 3",
"Fallout NV", "FO4VR", "Oblivion" });
dialog.setComboBoxEditable(true);
dialog.setWindowTitle(QObject::tr("Enter Instance Name"));
dialog.setLabelText(QObject::tr("Name"));
if (dialog.exec() == QDialog::Rejected) {
throw MOBase::MyException(QObject::tr("Canceled"));
}
instanceId = dialog.textValue().replace(QRegExp("[^0-9a-zA-Z ]"), "");
bool alreadyExists=false;
for (const QString &instance : instanceList) {
if(instanceId==instance)
alreadyExists=true;
}
if(alreadyExists)
{
QMessageBox msgBox;
msgBox.setText( QObject::tr("The instance \"%1\" already exists.").arg(instanceId) );
msgBox.setInformativeText(QObject::tr("Please choose a different instance name, like: \"%1 1\" .").arg(instanceId));
msgBox.exec();
instanceId="";
}
}
return instanceId;
}
@@ -100,7 +170,8 @@ QString InstanceManager::chooseInstance(const QStringList &instanceList) const
{
enum class Special : uint8_t {
NewInstance,
Portable
Portable,
Manage
};
SelectionDialog selection(
@@ -108,10 +179,10 @@ QString InstanceManager::chooseInstance(const QStringList &instanceList) const
.arg(QObject::tr("Choose Instance"))
.arg(QObject::tr(
"Each Instance is a full set of MO data files (mods, "
"downloads, profiles, configuration, ...). Use multiple "
"instances for different games. If your MO folder is "
"writable, you can also store a single instance locally (called "
"a portable install).")),
"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).")),
nullptr);
selection.disableCancel();
for (const QString &instance : instanceList) {
@@ -128,6 +199,10 @@ QString InstanceManager::chooseInstance(const QStringList &instanceList) const
static_cast<uint8_t>(Special::Portable));
}
selection.addChoice(QIcon(":/MO/gui/remove"), QObject::tr("Manage Instances"),
QObject::tr("Delete an Instance."),
static_cast<uint8_t>(Special::Manage));
if (selection.exec() == QDialog::Rejected) {
qDebug("rejected");
throw MOBase::MyException(QObject::tr("Canceled"));
@@ -139,8 +214,12 @@ QString InstanceManager::chooseInstance(const QStringList &instanceList) const
return choice.toString();
} else {
switch (choice.value<uint8_t>()) {
case Special::NewInstance: return queryInstanceName();
case Special::NewInstance: return queryInstanceName(instanceList);
case Special::Portable: return QString();
case Special::Manage: {
return(manageInstances(instances()));
}
default: throw std::runtime_error("invalid selection");
}
}
+5 -1
View File
@@ -46,9 +46,13 @@ private:
QStringList instances() const;
bool deleteLocalInstance(const QString &instanceId) const;
QString manageInstances(const QStringList &instanceList) const;
void setCurrentInstance(const QString &name);
QString queryInstanceName() const;
QString queryInstanceName(const QStringList &instanceList) const;
QString chooseInstance(const QStringList &instanceList) const;
void createDataPath(const QString &dataPath) const;
+163 -53
View File
@@ -78,6 +78,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <cstdarg>
#include <iostream>
#include <sstream>
#include <stdexcept>
@@ -139,6 +140,60 @@ static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *except
return EXCEPTION_CONTINUE_SEARCH;
}
// Parses the first parseArgCount arguments of the current process command line and returns
// them in parsedArgs, the rest of the command line is returned untouched.
LPCWSTR UntouchedCommandLineArguments(int parseArgCount, std::vector<std::wstring>& parsedArgs)
{
LPCWSTR cmd = GetCommandLineW();
LPCWSTR arg = nullptr; // to skip executable name
for (; parseArgCount >= 0 && *cmd; ++cmd)
{
if (*cmd == '"') {
int escaped = 0;
for (++cmd; *cmd && (*cmd != '"' || escaped % 2 != 0); ++cmd)
escaped = *cmd == '\\' ? escaped + 1 : 0;
}
if (*cmd == ' ') {
if (arg)
if (cmd-1 > arg && *arg == '"' && *(cmd-1) == '"')
parsedArgs.push_back(std::wstring(arg+1, cmd-1));
else
parsedArgs.push_back(std::wstring(arg, cmd));
arg = cmd + 1;
--parseArgCount;
}
}
return cmd;
}
static int SpawnWaitProcess(LPCWSTR workingDirectory, LPCWSTR commandLine) {
PROCESS_INFORMATION pi{ 0 };
STARTUPINFO si{ 0 };
si.cb = sizeof(si);
std::wstring commandLineCopy = commandLine;
if (!CreateProcessW(NULL, &commandLineCopy[0], NULL, NULL, FALSE, 0, NULL, workingDirectory, &si, &pi)) {
// A bit of a problem where to log the error message here, at least this way you can get the message
// using a either DebugView or a live debugger:
std::wostringstream ost;
ost << L"CreateProcess failed: " << commandLine << ", " << GetLastError();
OutputDebugStringW(ost.str().c_str());
return -1;
}
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD exitCode = (DWORD)-1;
::GetExitCodeProcess(pi.hProcess, &exitCode);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return static_cast<int>(exitCode);
}
static DWORD WaitForProcess() {
}
static bool HaveWriteAccess(const std::wstring &path)
{
bool writable = false;
@@ -347,6 +402,8 @@ void setupPath()
qDebug("MO at: %s", qPrintable(QDir::toNativeSeparators(
QCoreApplication::applicationDirPath())));
QCoreApplication::setLibraryPaths(QStringList(QCoreApplication::applicationDirPath() + "/dlls") + QCoreApplication::libraryPaths());
boost::scoped_array<TCHAR> oldPath(new TCHAR[BUFSIZE]);
DWORD offset = ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), BUFSIZE);
if (offset > BUFSIZE) {
@@ -354,20 +411,66 @@ void setupPath()
::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), offset);
}
std::wstring newPath(oldPath.get());
std::wstring newPath(ToWString(QDir::toNativeSeparators(
QCoreApplication::applicationDirPath())) + L"\\dlls");
newPath += L";";
newPath += ToWString(QDir::toNativeSeparators(
QCoreApplication::applicationDirPath()))
.c_str();
newPath += L"\\dlls";
newPath += oldPath.get();
::SetEnvironmentVariableW(L"PATH", newPath.c_str());
}
static void preloadSsl()
{
QString appPath = QDir::toNativeSeparators(QCoreApplication::applicationDirPath());
if (GetModuleHandleA("libeay32.dll"))
qWarning("libeay32.dll already loaded?!");
else {
QString libeay32 = appPath + "\\libeay32.dll";
if (!QFile::exists(libeay32))
qWarning("libeay32.dll not found: %s", qPrintable(libeay32));
else if (!LoadLibraryW(libeay32.toStdWString().c_str()))
qWarning("failed to load: %s, %d", qPrintable(libeay32), GetLastError());
}
if (GetModuleHandleA("ssleay32.dll"))
qWarning("ssleay32.dll already loaded?!");
else {
QString ssleay32 = appPath + "\\ssleay32.dll";
if (!QFile::exists(ssleay32))
qWarning("ssleay32.dll not found: %s", qPrintable(ssleay32));
else if (!LoadLibraryW(ssleay32.toStdWString().c_str()))
qWarning("failed to load: %s, %d", qPrintable(ssleay32), GetLastError());
}
}
static QString getVersionDisplayString()
{
VS_FIXEDFILEINFO version = GetFileVersion(ToWString(QApplication::applicationFilePath()));
return VersionInfo(version.dwFileVersionMS >> 16,
version.dwFileVersionMS & 0xFFFF,
version.dwFileVersionLS >> 16,
version.dwFileVersionLS & 0xFFFF).displayString();
}
int runApplication(MOApplication &application, SingleInstance &instance,
const QString &splashPath)
{
qDebug("start main application");
qDebug("Starting Mod Organizer version %s revision %s", qPrintable(getVersionDisplayString()),
#if defined(HGID)
HGID
#elif defined(GITID)
GITID
#else
"unknown"
#endif
);
#if !defined(QT_NO_SSL)
preloadSsl();
qDebug("ssl support: %d", QSslSocket::supportsSsl());
#else
qDebug("non-ssl build");
#endif
QString dataPath = application.property("dataPath").toString();
qDebug("data path: %s", qPrintable(dataPath));
@@ -389,6 +492,14 @@ int runApplication(MOApplication &application, SingleInstance &instance,
// global crashDumpType sits in OrganizerCore to make a bit less ugly to update it when the settings are changed during runtime
OrganizerCore::setGlobalCrashDumpsType(settings.value("Settings/crash_dumps_type", static_cast<int>(CrashDumpsType::Mini)).toInt());
qDebug("Loaded settings:");
settings.beginGroup("Settings");
for (auto k : settings.allKeys())
if (!k.contains("username") && !k.contains("password"))
qDebug(" %s=%s", k.toUtf8().data(), settings.value(k).toString().toUtf8().data());
settings.endGroup();
qDebug("initializing core");
OrganizerCore organizer(settings);
if (!organizer.bootstrap()) {
@@ -450,36 +561,42 @@ int runApplication(MOApplication &application, SingleInstance &instance,
// if we have a command line parameter, it is either a nxm link or
// a binary to start
if (arguments.size() > 1) {
if (MOShortcut shortcut{ arguments.at(1) }) {
try {
organizer.runShortcut(shortcut);
return 0;
} catch (const std::exception &e) {
reportError(
QObject::tr("failed to start shortcut: %1").arg(e.what()));
return 1;
}
} else if (OrganizerCore::isNxmLink(arguments.at(1))) {
qDebug("starting download from command line: %s",
qPrintable(arguments.at(1)));
organizer.externalMessage(arguments.at(1));
} else {
QString exeName = arguments.at(1);
qDebug("starting %s from command line", qPrintable(exeName));
arguments.removeFirst(); // remove application name (ModOrganizer.exe)
arguments.removeFirst(); // remove binary name
// pass the remaining parameters to the binary
try {
organizer.startApplication(exeName, arguments, QString(), QString());
return 0;
} catch (const std::exception &e) {
reportError(
QObject::tr("failed to start application: %1").arg(e.what()));
return 1;
}
}
}
if (arguments.size() > 1) {
if (MOShortcut shortcut{ arguments.at(1) }) {
if (shortcut.hasExecutable()) {
try {
organizer.runShortcut(shortcut);
return 0;
}
catch (const std::exception &e) {
reportError(
QObject::tr("failed to start shortcut: %1").arg(e.what()));
return 1;
}
}
}
else if (OrganizerCore::isNxmLink(arguments.at(1))) {
qDebug("starting download from command line: %s",
qPrintable(arguments.at(1)));
organizer.externalMessage(arguments.at(1));
}
else {
QString exeName = arguments.at(1);
qDebug("starting %s from command line", qPrintable(exeName));
arguments.removeFirst(); // remove application name (ModOrganizer.exe)
arguments.removeFirst(); // remove binary name
// pass the remaining parameters to the binary
try {
organizer.startApplication(exeName, arguments, QString(), QString());
return 0;
}
catch (const std::exception &e) {
reportError(
QObject::tr("failed to start application: %1").arg(e.what()));
return 1;
}
}
}
QPixmap pixmap(splashPath);
QSplashScreen splash(pixmap);
@@ -525,28 +642,21 @@ int runApplication(MOApplication &application, SingleInstance &instance,
int main(int argc, char *argv[])
{
//Should allow for better scaling of ui with higher resolution displays
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
if (argc >= 4) {
std::vector<std::wstring> arg;
auto args = UntouchedCommandLineArguments(2, arg);
if (arg[0] == L"launch")
return SpawnWaitProcess(arg[1].c_str(), args);
}
MOApplication application(argc, argv);
QStringList arguments = application.arguments();
if ((arguments.length() >= 4) && (arguments.at(1) == "launch")) {
// all we're supposed to do is launch another process
QProcess process;
process.setWorkingDirectory(QDir::fromNativeSeparators(arguments.at(2)));
process.setProgram(QDir::fromNativeSeparators(arguments.at(3)));
process.setArguments(arguments.mid(4));
process.start();
process.waitForFinished(-1);
return process.exitCode();
}
setupPath();
#if !defined(QT_NO_SSL)
qDebug("ssl support: %d", QSslSocket::supportsSsl());
#else
qDebug("non-ssl build");
#endif
bool forcePrimary = false;
if (arguments.contains("update")) {
arguments.removeAll("update");
+407 -108
View File
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More