Compare commits

...
830 Commits
Author SHA1 Message Date
Mikaël Capelle fcd2e1473f Merge pull request #1462 from Holt59/fix-stylesheets-qscrollarea
Remove border on QScrollArea from stylesheets.
2021-03-13 16:06:18 +01:00
Mikaël Capelle 287dd6d805 Remove border on QScrollArea from stylesheets. 2021-03-13 16:05:43 +01:00
Mikaël Capelle 717c2ca9cf Bump to 2.4.1rc1 and update translations. 2021-03-12 20:51:46 +01:00
Mikaël Capelle abd1a11768 Merge pull request #1449 from isanae/uilocker-disabled
Disabled uilocker for child dialogs
2021-03-03 18:52:55 +01:00
Mikaël Capelle 34636301ea Merge pull request #1447 from LostDragonist/settings_resize
Add scrollbars to some settings tabs to reduce minimum size
2021-03-03 18:52:46 +01:00
Mikaël Capelle f298ea0ae3 Merge pull request #1443 from Holt59/fix-savegame-name
Display savegame name and filepath in saves tab.
2021-03-03 18:52:28 +01:00
Chris Bessent eee1b4b3f1 Put stylesheet stuff into .ui file instead 2021-03-02 21:20:23 -07:00
isanae 00120605fb don't disable dialogs that are children of other dialogs 2021-03-02 14:41:23 -05:00
Mikaël Capelle 32088b47f1 Merge pull request #1446 from LostDragonist/disabled_plugins
Allow plugins to disable themselves by default
2021-03-02 19:27:24 +01:00
Chris Bessent 726b381ea7 Add scrollbars to some settings tabs to reduce minimum size
The previous minimum size was around 450 x 560px.  At a DPI scaling
of 200%, this means 900 x 1120px which extends off the typical 1080p
screen.  Why is someone using 200% scaling on a 1080p screen?  I have
no clue.

Now, the minimum size is around 450 x 410px for 900 x 820 px at 200%
scaling.  Which works for anything short of a 1376 x 768 screen at
200% scaling which I just don't really care about.
2021-03-02 04:07:46 -07:00
Chris Bessent 071550f7fb Allow plugins to disable themselves by default 2021-03-02 02:41:16 -07:00
Mikaël Capelle f8a50edd0f Merge pull request #1444 from LostDragonist/lockedorder
Fix load order when using locked plugins
2021-03-01 19:21:24 +01:00
Mikaël Capelle 08c7113ecb Merge pull request #1439 from Holt59/fix-downloadlist
Fix download list sorting.
2021-03-01 19:21:15 +01:00
Mikaël Capelle d436fe8cb3 Merge pull request #1442 from Holt59/fix-createempty-mod
Fix priority for 'Create Empty Mod'.
2021-03-01 19:21:06 +01:00
Chris Bessent d5183ebe6b Fix load order when using locked plugins 2021-02-27 18:50:45 -07:00
Mikaël Capelle c72326ee4b Display savegame name and filepath in saves tab. 2021-02-27 12:42:37 +01:00
Mikaël Capelle 75e90f2f3f Fix priority for 'Create Empty Mod'. 2021-02-27 10:36:17 +01:00
Mikaël Capelle be012715f3 Fix download list sorting. 2021-02-26 21:32:39 +01:00
Mikaël Capelle 2b86a14c86 Merge pull request #1437 from Holt59/fix-sendtoseparator
Fix 'Send to separator... ' in descending priority.
2021-02-26 21:12:04 +01:00
Mikaël Capelle c96c01f40e Fix 'Send to separator... ' in descending priority. 2021-02-24 20:07:55 +01:00
Mikaël Capelle d6edc5d6b7 Merge pull request #1433 from Holt59/fix-bycategory-sorting
Fix sorting by priority when grouping by priority.
2021-02-24 18:35:18 +01:00
isanae 4040dc12b7 Merge pull request #1436 from isanae/tutorial-fix
Fix tutorial stuck on mod info dialog
2021-02-24 05:46:48 -05:00
isanae d4fc7c3de1 emit modInfoDisplayed, it's required by the tutorial 2021-02-24 04:57:54 -05:00
Mikaël Capelle 27c4861907 Fix sorting by priority when grouping by priority. 2021-02-23 19:16:18 +01:00
Mikaël Capelle 8decb9df68 Merge pull request #1431 from Holt59/fix-update-filter
Switch back to invalidating filter when receiving mod updates.
2021-02-23 17:23:08 +01:00
Mikaël Capelle 8365f26d83 Merge pull request #1424 from isanae/dl-share
Network shares for envfs
2021-02-23 17:19:53 +01:00
Mikaël Capelle 0ca21d9a5e Merge pull request #1429 from Holt59/fix-stylesheets
Fix stylesheets for 2.4.
2021-02-23 17:19:43 +01:00
Mikaël Capelle f60d0e5ec6 Fix stylesheets for 2.4. 2021-02-23 09:38:52 +01:00
isanae d22d77d921 handle network shares for NtOpenFile()
changed error messages to use formatNtMessage(), which handles NTSTATUS errors
2021-02-22 18:28:07 -05:00
Mikaël Capelle 7084021067 Merge pull request #1418 from Holt59/master
Bump version to 2.4.0 and update translation.
2021-02-21 18:01:12 +01:00
Mikaël Capelle 1dd2acf07f Bump version to 2.4.0 and update translation. 2021-02-21 17:56:44 +01:00
isanae 3fad475013 Merge pull request #1416 from isanae/plugin-blacklist
Broken plugins blacklist
2021-02-21 11:50:32 -05:00
Mikaël Capelle 010a5d80d6 Switch back to invalidating filter when receiving mod updates. 2021-02-21 11:12:16 +01:00
isanae 2bd755743c clarified comment 2021-02-20 12:49:08 -05:00
isanae 9eb1dd0ec0 clearPlugins() must be called to load the blacklist or it will be empty when loadPlugins() runs 2021-02-20 05:03:17 -05:00
isanae e473caf14a Merge pull request #1415 from isanae/master
2.4rc3
2021-02-19 18:23:01 -05:00
isanae 1c87f1d8d4 rc3 2021-02-19 18:21:53 -05:00
Mikaël Capelle bb6cde175a Bump version to 2.4.0. 2021-02-19 20:08:47 +01:00
Mikaël Capelle bd93864ed2 Merge pull request #1409 from isanae/portable-loop
Portable instance loop.
2021-02-13 18:25:39 +01:00
isanae 406d6f28c0 force instance selection when the current instance cannot be used
the problem is that an empty instance name means the portable instance, but MO clears the name when it needs instance selection, which can create a loop if the portable instance can't be used
2021-02-13 07:54:05 -05:00
Mikaël Capelle ee4c364ccc Bump version to 2.4.0rc2 and update translations. 2021-02-12 18:18:19 +01:00
Mikaël Capelle 607fafa364 Merge pull request #1408 from isanae/portable-shortcuts
Fixes for portable shortcuts
2021-02-12 18:09:15 +01:00
Mikaël Capelle 7dc28b10d9 Merge pull request #1407 from isanae/processes-in-job
Fixes for processesInJob()
2021-02-12 18:09:05 +01:00
Mikaël Capelle 9f0c8c31a6 Merge pull request #1405 from LostDragonist/update_fixes
Fixes for the update dialog window
2021-02-12 18:08:54 +01:00
Mikaël Capelle 2fe627c261 Merge pull request #1404 from Al12rs/fix_update_filter
Hopefully fix update filter not showing new mod updates.
2021-02-12 18:08:41 +01:00
Mikaël Capelle 879c37984e Merge pull request #1403 from Holt59/fix-steamappid-env-error
Do not return previous value in env::set and env::setPath.
2021-02-12 18:08:25 +01:00
Mikaël Capelle 1cf8a2bfee Merge pull request #1401 from ModOrganizer2/Al12rs-appveyorFix
Appveyor: artifact only the exe
2021-02-12 18:08:07 +01:00
Mikaël Capelle 7531a860cf Merge pull request #1400 from Holt59/fix-markers-conflicts-refresh
Better refresh of override markers and conflicts.
2021-02-12 18:07:56 +01:00
Chris Bessent 31c8415e88 Use release name for changelogs 2021-02-12 01:31:41 -07:00
isanae 48274f3357 - renamed instance::name() to displayName() to reduce confusion with portable instances
- better errors when running incorrect shortcuts
- fixed shortcuts being created with moshortcut://Portable:exe instead of an empty instance name for portable instances
2021-02-12 03:22:52 -05:00
Chris Bessent f486e6fa4e Updates to text, title and buttons 2021-02-11 18:39:06 -07:00
Chris Bessent 9e5a64b545 Update CMakeLists.txt 2021-02-11 18:09:19 -07:00
Chris Bessent 3dd05ff869 Create a new dialog for the update window
The idea here is to be able to resize the window and better handle
markdown formatting.  Everything was stolen from the LOOT dialog.
2021-02-11 17:58:10 -07:00
AL eba98e8469 Remove unused variable 2021-02-11 16:34:43 +01:00
AL 73418ec616 Hopefully fix update filter not showing new mod updates.
Notify all the mods that have had their info checked, not just the ones that have been found with an update. This is because Mo2 also shows mods that have had their files deleted or moved to Old as updateAvailable, in which case there is no update but the filter still needs to be notified to include the mod.
2021-02-11 16:29:32 +01:00
Mikaël Capelle 7283e6c3ba Do not return previous value in env::set and env::setPath (avoid error log when not previously set). 2021-02-10 19:17:21 +01:00
isanae d179ad01c8 maxIds was local to the loop, not doubled
handle ERROR_MORE_DATA, it seems to sometimes happen, not sure why
added more logging, a user actually got that error
2021-02-10 10:01:39 -05:00
Al 04d80bb567 Appveyor: artifact only the exe
The entire build is too big and we get over the limit too fast
2021-02-09 22:01:24 +01:00
Mikaël Capelle 595f6eccf6 Better refresh of override markers and conflicts. 2021-02-09 20:23:42 +01:00
Chris Bessent f058125e66 Fix concatenating update logs 2021-02-08 06:09:06 -07:00
Mikaël Capelle 7d36bc20d0 Bump version to 2.4.0rc1.1. 2021-02-07 18:47:00 +01:00
Mikaël Capelle a9e3c4e2b5 Bump version to 2.4.0rc1. 2021-02-06 22:03:34 +01:00
Mikaël Capelle 86db5da217 Merge pull request #1395 from Holt59/remove-datatab-tree-updates
Remove update of data-tab tree and check for problems when modifying the mod list.
2021-02-06 17:25:29 +01:00
Mikaël Capelle a701d66cce Remove update of data-tab tree and check for problems when modifying the mod list. 2021-02-05 19:47:47 +01:00
Mikaël Capelle d5380ef6d3 Update translation file. 2021-02-02 20:39:14 +01:00
Mikaël Capelle 4256d8b40b Merge pull request #1392 from Holt59/fix-download-metainfo
Fix download of meta-information in download tab.
2021-01-31 19:00:33 +01:00
Mikaël Capelle ab0e050c46 Fix download of meta-information in download tab. 2021-01-31 18:59:52 +01:00
Mikaël Capelle 4ea7f7bf54 Merge pull request #1391 from Holt59/pluginlist-case-insensitive
Use case-insensitive data structure in plugin list.
2021-01-31 18:52:51 +01:00
Mikaël Capelle 36855f96f3 Use case-insensitive data structure in plugin list. 2021-01-31 18:47:08 +01:00
Mikaël Capelle e15cc6dd3a Merge pull request #1390 from Holt59/fix-datatab-refresh
Fix update of data tab after refresh.
2021-01-31 18:45:01 +01:00
Mikaël Capelle 4f71834250 Fix update of data tab after refresh. 2021-01-31 11:00:16 +01:00
Mikaël Capelle 881d67d318 Merge pull request #1388 from Holt59/default-collapsible-separators-desc
Enable collapsible separators in reverse order by default.
2021-01-30 18:52:57 +01:00
Mikaël Capelle ca4d56f789 Enable collapsible separators in reverse order by default. 2021-01-30 18:50:02 +01:00
Mikaël Capelle 4e8ff4f389 Merge pull request #1387 from Holt59/update-settings-dialog
Add migration code to remove old settings from ModOrganizer.ini.
2021-01-30 18:43:13 +01:00
Mikaël Capelle 029f1b1a62 Add migration code to remove old settings from ModOrganizer.ini. 2021-01-30 18:42:31 +01:00
Mikaël Capelle 792a71a3f5 Bump dev-build version. 2021-01-30 18:31:00 +01:00
Mikaël Capelle 3b360162e1 Merge pull request #1386 from Holt59/update-settings-dialog
Update settings dialog.
2021-01-30 18:21:56 +01:00
Mikaël Capelle 76989e2b8f Remove LoadMechanism completely. 2021-01-29 20:09:14 +01:00
Mikaël Capelle 7610e31394 Reorganize settingsdialog classes to match UI. 2021-01-29 20:03:47 +01:00
Mikaël Capelle d0796b4ab2 Move settings around. Remove unused settings. 2021-01-29 19:43:24 +01:00
Mikaël Capelle f53e5406d4 Merge pull request #1378 from Holt59/fix-priority-management
Increase robustness of mods priority in profile.
2021-01-29 19:29:21 +01:00
Mikaël Capelle 48fae18ac6 Fix refresh of data tab. 2021-01-29 19:27:10 +01:00
Mikaël Capelle 8606bf70c7 Merge pull request #1384 from Holt59/add-pick-argument
Implement --pick argument.
2021-01-29 08:48:01 +01:00
Mikaël Capelle 136dc17e01 Merge pull request #1385 from Holt59/fix-mo2-on-top
Do not bring MO2 to front when passing a Nexus link to the CL.
2021-01-29 08:47:46 +01:00
Mikaël Capelle 007824dde8 Do not bring MO2 to front when passing a Nexus link to the CL. 2021-01-28 19:32:07 +01:00
Mikaël Capelle a88d3436cc Implementation --pick argument. 2021-01-28 19:05:05 +01:00
Chris Bessent 41159e4eea Merge pull request #1382 from LostDragonist/fix_forced_load
Fix initial launch of forced load dialog
2021-01-24 04:44:04 -07:00
Mikaël Capelle ab820c1b0a Fix enable/disable all message. 2021-01-24 11:09:12 +01:00
Mikaël Capelle b9c8554ee3 Merge pull request #1380 from Holt59/fix-pluginlist-contextmenu
Fix error when right-clicking on an empty space in the pluginlist.
2021-01-24 10:40:40 +01:00
Chris Bessent 5c3d715cfd Fix forced load libraries
This fixes a couple issues.  First, the default libraries forced by
the game plugins were not being loaded.  Second, when the checkbox
was disabled, the forced load settings would be wiped out.

Both were fixed by always loading and saving the state of the
forced loads regardless of the global enabled state.
2021-01-23 13:26:14 -07:00
Mikaël Capelle 14536009c0 Merge pull request #1379 from Holt59/fix-loglist-startup
Fix empty loglist after startup.
2021-01-23 18:14:11 +01:00
Mikaël Capelle 54744c04b2 Use proper naming convention for constants. 2021-01-22 21:19:35 +01:00
Mikaël Capelle 7864fc0950 Use constant for minimum/maximum priorities. 2021-01-22 21:18:54 +01:00
Mikaël Capelle d94b7c444d Move update of directory structure after mod priority change to organizer core. 2021-01-21 21:56:26 +01:00
Mikaël Capelle b1795f83cd Refresh data tab when mods are enabled or moved. 2021-01-21 21:56:08 +01:00
Mikaël Capelle d81fb09f33 Replace isFixedPriority by hasAutomaticPriority. 2021-01-21 21:20:01 +01:00
Mikaël Capelle 34c87a0efa Prevent backups from being enabled. 2021-01-21 21:12:46 +01:00
Mikaël Capelle e1106ad42c Use priority from profile (+1) in directory structure to be consistent. 2021-01-21 21:02:25 +01:00
Mikaël Capelle 569ce21959 Remove unused mapping. 2021-01-21 21:02:10 +01:00
Mikaël Capelle 0a06970990 Expose proper priority in ModList and sort in the sort proxy. 2021-01-21 20:21:57 +01:00
Mikaël Capelle 51eeefa49d Fix error when right-clicking on an empty space in the pluginlist. 2021-01-21 20:10:30 +01:00
Mikaël Capelle 60085ae4b6 Use actual priority of overwrite instead of INT_MAX, and remove useless checks. 2021-01-21 20:01:43 +01:00
Mikaël Capelle 49461f0086 Remove unused variables. 2021-01-21 20:01:27 +01:00
Mikaël Capelle 1747dcf563 INT_MAX -> std::numeric_limits, plus minor clean. 2021-01-21 19:42:41 +01:00
Mikaël Capelle f8943ee477 Use range-loop instead of old-style iterators. 2021-01-21 19:38:53 +01:00
Mikaël Capelle 62a9d13948 Remove unused priority-related functions from Profile. 2021-01-21 19:31:05 +01:00
Mikaël Capelle 36489c7d8f Add const-qualifier to for loop variable. 2021-01-21 19:21:27 +01:00
Mikaël Capelle ffb820c701 Use isFixedPriority() when appropriate. 2021-01-21 19:21:07 +01:00
Mikaël Capelle 0803920486 Add method to retrieve priority of mods in ModList. 2021-01-21 19:20:45 +01:00
Mikaël Capelle 2ed3d4696b Add comment to explain the reset() on the log list. 2021-01-21 19:11:37 +01:00
Mikaël Capelle e28e316f6f Fix empty loglist after startup. 2021-01-20 22:11:40 +01:00
Mikaël Capelle 7c9d3777c2 Remove unused/undefined ModList functions. 2021-01-20 21:04:49 +01:00
Mikaël Capelle 0e7fed0e32 Move backup and overwrite priority to ModList. 2021-01-20 21:01:49 +01:00
Mikaël Capelle 946d7fc192 Add comment for m_NumRegularMods and remove unused methods. 2021-01-20 18:33:54 +01:00
Mikaël Capelle 58b6e0eb48 Increase robustness of mods priority in profile. 2021-01-20 18:16:20 +01:00
Mikaël Capelle 20a87c9cb9 Merge pull request #1376 from Holt59/fix-filter-modcount
Refresh mod counter when filtering.
2021-01-20 09:20:06 +01:00
Mikaël Capelle 7caa9806bc Merge pull request #1375 from Holt59/fix-collapsible-separators-reverse
Fix refresh on by-priority proxy when changing sort order.
2021-01-20 09:19:53 +01:00
Al 7b1f1f29da Merge pull request #1377 from ModOrganizer2/fix_install_after_query
Don't look for mods with -1 as mod ID when suggesting names
2021-01-19 22:04:05 +01:00
AL 4a6f8aa625 Don't look for mods with -1 as mod ID when suggesting names 2021-01-19 20:40:47 +01:00
Mikaël Capelle 907588b9c9 Refresh mod counter when filtering. 2021-01-19 20:29:12 +01:00
Mikaël Capelle 932a562d9d Fix refresh on by-priority proxy when changing sort order. 2021-01-19 18:08:05 +01:00
Chris Bessent 838415aa71 Merge pull request #1374 from LostDragonist/mod_casing
Improve error message about an extra overwrite mod
2021-01-19 08:41:57 -07:00
Chris Bessent aea96365c6 Improve error message about an extra overwrite mod 2021-01-19 04:15:55 -07:00
Mikaël Capelle 9997412a39 Merge pull request #1373 from Holt59/fix-change-priority
Fix change priority
2021-01-18 23:13:55 +01:00
Mikaël Capelle 8a49f2232e Clamp priority to the correct value, taking backups into account. 2021-01-18 23:02:15 +01:00
Mikaël Capelle 58e72e89c3 Fix editing priority. 2021-01-18 23:01:24 +01:00
AL 13bf05cfde Bump dev build version 2021-01-18 22:09:36 +01:00
Mikaël Capelle 0a683c0a5a Merge pull request #1372 from Holt59/install-mod-at
Modify 'Install mod... ' in context menu to install above current mod.
2021-01-18 21:17:46 +01:00
Mikaël Capelle 1f9a1da7f4 Merge pull request #1371 from Holt59/by-priority-proxy-improvements
Collapsible separators improvements
2021-01-18 21:17:35 +01:00
Mikaël Capelle 79b67559d8 Merge pull request #1370 from LostDragonist/preview_extensions
Remove case sensitivity regarding preview file extensions
2021-01-18 21:17:26 +01:00
Mikaël Capelle df9576a946 Merge pull request #1367 from LostDragonist/lockedorder
Add error checking to lockedorder.txt processing
2021-01-18 21:17:13 +01:00
Mikaël Capelle 339457f79d Merge pull request #1366 from LostDragonist/mod_casing
Make modlist.txt less case sensitive
2021-01-18 21:16:55 +01:00
Mikaël Capelle ee44a38c98 Merge pull request #1354 from isanae/startup-rework
Startup rework
2021-01-18 21:16:40 +01:00
Mikaël Capelle 3c0201a799 Update documentation for installMod / createEmptyMod. 2021-01-18 20:43:27 +01:00
Mikaël Capelle c3f73fe8ed Comment and remove extra blank lines. 2021-01-18 20:25:02 +01:00
Mikaël Capelle 5bc8256dc8 Make installMod behave similarly to createEmptyMod for the new mod priority. 2021-01-18 20:23:41 +01:00
Mikaël Capelle 792a402782 Modify 'Install mod... ' in context menu to install above current mod. 2021-01-18 20:05:13 +01:00
Mikaël Capelle 5679a12fd0 Remove log. 2021-01-18 19:53:08 +01:00
Mikaël Capelle 08110553d4 Fix scrolling when moving mods with keyboard. 2021-01-18 19:50:39 +01:00
Mikaël Capelle a19bfaa489 Better handling of layoutChanged in by-priority proxy to avoid resetting. 2021-01-18 19:44:29 +01:00
Chris Bessent 1428b350d1 Simplify getting extension 2021-01-18 08:55:59 -07:00
Chris Bessent c70e53897d Remove case sensitivity regarding preview file extensions
That means ".dds" and ".DDS" should be treated the same.
2021-01-18 08:49:23 -07:00
Chris Bessent 9d32731136 Remove TODO 2021-01-18 08:14:52 -07:00
Chris Bessent a307cc1c6a Get rid of static on lambdas 2021-01-18 07:56:54 -07:00
Chris Bessent 4c64448947 Add a warning about overwrite mods being disabled 2021-01-18 07:55:02 -07:00
Chris Bessent 527795243c Rewrite readLockedOrderFrom
This also removes the "The file containing locked plugin indices is broken" dialog.  The broken part of the lockedorder.txt will just spit out an error log now and be ignored.
2021-01-18 07:39:02 -07:00
Chris Bessent 9f96a88989 Use existing comparator from MOBase 2021-01-18 06:43:02 -07:00
isanae 6feab2ea8f moved criticalOnTop() to uibase
changed all calls to reportError(), which now uses the main window if it exists as a parent, or calls criticalOnTop()
added errors when running something from the command line for a different instance/profile
removed unused crap
2021-01-18 08:21:42 -05:00
isanae 0d641f3977 make plugins wait until after the refresh is completed when they request a refresh
this is a change in behaviour, but it makes sure plugins don't have a stale view of the mods after running something
2021-01-18 08:21:41 -05:00
isanae 181acfe832 renamed Refresh to TriggerRefresh, added WaitForRefresh
removed duplicate refreshDirectoryStructure() call that could never work
added --logs to output logs to stdout, added final "mod organizer done" log
added -i with no arguments to output the current instance name
`run -e` now does an additional, case insensitive check for names
fixed error being output along with --help
2021-01-18 08:21:41 -05:00
isanae 1c4d09d9e1 comments 2021-01-18 08:20:08 -05:00
isanae 16ba428e44 fixed runPostMultiProcess() not being called
comments
2021-01-18 08:20:08 -05:00
isanae 06109a568b put more stuff in Meta to simplify 2021-01-18 08:20:08 -05:00
isanae 65a9e51e0e added refresh command
added more help for run
2021-01-18 08:20:08 -05:00
isanae 09eb507dda moved externalMessage() to MOApplication
commands can forward to the primary instance
added reload-plugin command
MessageDialog now tries to find the main window when the reference is null, which actually used to happen often because activeWindow() is typically used, but that's null when the main window doesn't have focus (like when downloading from nexus, for example)
2021-01-18 08:20:08 -05:00
isanae 7e80184812 merged exe and run commands, added -e flag instead
added dialog when selected profile doesn't exist, this can happen with -p on the command line
2021-01-18 08:20:08 -05:00
isanae aa7a552654 implemented exe command
better error when cwd doesn't exist
2021-01-18 08:20:07 -05:00
isanae e4ae41e3a2 fixed all commands being legacy
split running command into pre and post organizer
2021-01-18 08:20:07 -05:00
isanae 3bca0e7615 split run() into setup() and run()
this is so command line processing can happen outside of MOApplication
many important objects were local to run(), so they're not members of MOApplication instead
2021-01-18 08:20:07 -05:00
Mikaël Capelle 59f055ba93 Merge pull request #1368 from Holt59/new-settings
Add settings to not check update on mod install and to auto-collapse on hover.
2021-01-18 08:21:41 +01:00
Mikaël Capelle 1644d30e59 Fix typo. 2021-01-18 08:16:38 +01:00
Mikaël Capelle 2b08f3f72c Add option to enable auto-collapse on hover after delay. 2021-01-17 13:09:10 +01:00
Mikaël Capelle 704490e315 Add setting to not check for updates after installing mods. 2021-01-17 13:00:01 +01:00
Chris Bessent e69cb90dbe Improve performance by changing the map to be case insensitive 2021-01-16 20:09:12 -07:00
Chris Bessent 1010b5958b Add error checking to lockedorder.txt processing
Errors now checked:
1. Plugin listed in lockedorder.txt does not exist
2. Priority in lockedorder.txt is negative
3. Priority in lockedorder.txt is greater than the total number of plugins

Note that lockedorder.txt is not rewritten after these errors occur as
that seems most likely to be the desired behavior...?  That is, preserving
the state of lockedorder.txt is more important than anything making sense.
Though negative priorities don't make sense and never will so just get rid
of that if the lockedorder.txt is written to at some point.
2021-01-16 19:20:51 -07:00
Chris Bessent 3dbee68726 Make modlist.txt less case sensitive
This should make it so case doesn't matter when it comes to the
folder names of mods and what's in modlist.txt.  If a mismatch
in case is detected, modlist.txt will be flagged dirty to fix
it at some point.

This handles the foillowing cases:
 * modlist.txt was modified outside MO
 * the mod folder was renamed outside MO
2021-01-16 18:02:16 -07:00
Al 2b1f01cba2 Merge pull request #1363 from Holt59/modlist-improvements
Send to last conflict
2021-01-16 23:06:04 +01:00
Al 19556bc968 Merge pull request #1362 from Holt59/downloadlistview-cleaning
DownloadListView improvements
2021-01-16 23:03:05 +01:00
Al c48791a8a1 Merge pull request #1361 from Holt59/ui-fixes-and-others
UI fixes and others.
2021-01-16 23:02:42 +01:00
isanae 8ee1f94b0f Merge pull request #1365 from isanae/master
Fix crash on bad bsa
2021-01-16 16:56:35 -05:00
isanae 9092c096d5 fix crash on bad bsa 2021-01-16 16:53:50 -05:00
Mikaël Capelle f46962686a Fix drag&drop in manual installer after drag&drop of download/external archive in mod list. 2021-01-16 22:06:20 +01:00
Mikaël Capelle e6d1f5500b Only maintain selection after drag&drop of mods. 2021-01-16 21:52:52 +01:00
Mikaël Capelle d73d930703 Maintain selection when changing priority manually. 2021-01-16 16:21:59 +01:00
Mikaël Capelle 54f7df9fbd Maintain selection after drag&drop. Fix update of conflicts (visual) after priority change. 2021-01-16 16:14:46 +01:00
Mikaël Capelle 89a735d6e1 Maintain selection after 'Send to... ' and add send to first conflict. 2021-01-16 15:55:56 +01:00
Mikaël Capelle 56d0392747 Only consider loose files vs. loose files conflicts for 'Send to last conflict' entry. 2021-01-16 15:01:33 +01:00
Mikaël Capelle a2ed9b9ba9 Fix archive overwritten marker. 2021-01-16 14:57:15 +01:00
Mikaël Capelle 253b5e9f3f Fix entry names. 2021-01-16 13:36:12 +01:00
Mikaël Capelle 65c9c69568 Fix priority foreground color on colored separators. 2021-01-16 13:29:55 +01:00
Mikaël Capelle 8fafcce33f Add send to last conflict action for modlist. 2021-01-16 13:29:36 +01:00
Mikaël Capelle f28b501b30 Handle enter and delete on download list. 2021-01-15 20:23:23 +01:00
Mikaël Capelle 417dbff2de New slot styles for context menus actions. 2021-01-15 20:14:45 +01:00
Mikaël Capelle ff3f24ff9e Rename DownloadListWidget -> DownloadListView. Clean context menu. 2021-01-15 20:12:19 +01:00
Mikaël Capelle 9f8ba0ea51 Add setting to automatically hide download after installation. 2021-01-14 22:08:58 +01:00
Mikaël Capelle 186e96c878 Fix disabling of collapsible separators settings. 2021-01-14 21:40:36 +01:00
Mikaël Capelle aa1ffe65a7 Update README. 2021-01-14 21:21:08 +01:00
Mikaël Capelle 03f7c0ef4f Move Holt59 to lead developers. Add Luca|EzioTheDeadPoet and Patchier to contributors. 2021-01-14 21:18:07 +01:00
Mikaël Capelle 7d027a446d Add settings to enable/disable icons on collapsed separators. 2021-01-14 21:16:56 +01:00
Mikaël Capelle 38129e6e77 Disable highlighting from/to separators separately. 2021-01-14 20:30:06 +01:00
Mikaël Capelle 662a1eb3d7 Contextual menu entry for enable/disable all visible. 2021-01-14 20:11:02 +01:00
Mikaël Capelle 2c9a3c7de8 Better context menu entries for mod/separator creation. 2021-01-14 19:54:13 +01:00
Mikaël Capelle 899308b31d Merge pull request #1360 from Holt59/organizercore-cleaning
OrganizerCore cleaning.
2021-01-14 09:11:52 +01:00
Mikaël Capelle 34f7ae2450 Merge pull request #1357 from Holt59/collapsible-separators
Collapsible separators in descending priority.
2021-01-14 09:11:37 +01:00
Mikaël Capelle c3334e7b4d Merge pull request #1351 from Holt59/fix-set-gamepath
Fix setting game path for games with executable in subfolder.
2021-01-13 23:04:20 +01:00
Mikaël Capelle bc9cb37942 Add comment for cdUp(). 2021-01-13 20:36:11 +01:00
Mikaël Capelle 853db4a60a Use isBackup() and isOverwrite() instead of testing flags. 2021-01-13 13:27:36 +01:00
Mikaël Capelle ce95d8b1bd Minor cleaning for boost signal declarations in OrganizerCore. 2021-01-13 13:01:11 +01:00
Mikaël Capelle c93cf33c83 Remove OrganizerCore::modsSortedByProfilePriority. 2021-01-13 13:00:54 +01:00
Mikaël Capelle 163b33f228 Remove unused close() signal from OrganizerCore. Remove declarations without definitions. 2021-01-13 13:00:34 +01:00
Mikaël Capelle 4a5ff2f232 Remove archive parsing attribute from core and use the one from settings directly. 2021-01-13 12:59:57 +01:00
Mikaël Capelle 242125fdef Merge pull request #1359 from Holt59/fix-pluginlist-edit
Write plugin list after edit.
2021-01-13 12:31:53 +01:00
Mikaël Capelle 8338ea6ff4 Merge pull request #1358 from Holt59/loglist-copy
Allow extended selection in log list and implement copy.
2021-01-13 12:10:53 +01:00
Mikaël Capelle 33a49ef51c Write plugin list after edit. 2021-01-13 11:58:18 +01:00
Mikaël Capelle f32e74c2a7 Allow extended selection in log list and implement copy. 2021-01-13 09:17:05 +01:00
Mikaël Capelle 18f70a2dff Add documentation for row computation. 2021-01-11 21:07:25 +01:00
Mikaël Capelle 748b7e6918 Combine nested if clauses. 2021-01-11 20:58:53 +01:00
Mikaël Capelle 16b825bc5d Fix drop in first item of separators. 2021-01-11 20:57:32 +01:00
Mikaël Capelle 49c2c8f333 Add setting to enable/disable collapsible priority depending on the sort order. 2021-01-11 19:44:43 +01:00
Mikaël Capelle 08520822eb Fix drop in separator and create mod in separator in descending priority. 2021-01-11 19:15:39 +01:00
Mikaël Capelle e53905329a Allow collapsible separator in descending priority. 2021-01-11 18:55:15 +01:00
Mikaël Capelle 9e663691b0 Merge pull request #1356 from Holt59/collapsible-separators
Remove dead code.
2021-01-11 18:54:31 +01:00
Mikaël Capelle a7e6f9a5a8 Remove dead code. 2021-01-11 18:15:38 +01:00
Mikaël Capelle 97ac1ce999 Warn users that game path is invalid after choosing it rather than when applying setting. 2021-01-11 13:14:24 +01:00
Mikaël Capelle 1dc2b22548 Merge pull request #1350 from Holt59/collapsible-separators
Collapsible separators - Fix & Improvements.
2021-01-11 12:49:42 +01:00
Mikaël Capelle 05efc74e40 Fix text for new option. 2021-01-11 12:43:28 +01:00
Mikaël Capelle 566441a706 Add comment to mousePressEvent(). 2021-01-11 09:36:35 +01:00
isanae a680dfa3e9 Merge pull request #1353 from isanae/master
Task dialog for deleting downloads
2021-01-11 02:09:09 -05:00
isanae 2f16f07f6e task dialog for deleting downloads
also shows filename
2021-01-10 20:41:59 -05:00
Mikaël Capelle a0cb500ff0 Fix setting game path for games with executable in subfolder. 2021-01-10 20:44:59 +01:00
Mikaël Capelle a5059cbe32 Select separator after creation. 2021-01-10 20:11:46 +01:00
Mikaël Capelle a952f51ef7 Change 'Create empty mod' depending on the currently selected mod. 2021-01-10 20:08:48 +01:00
Mikaël Capelle 8115335c55 Request window focus when dropping external archive. 2021-01-10 19:31:29 +01:00
Mikaël Capelle 32e441897f Request window focus when dropping external folder and scroll to new mod. 2021-01-10 19:29:41 +01:00
Mikaël Capelle 5bb48d5e52 Small clean. 2021-01-10 19:29:18 +01:00
Mikaël Capelle 5a7bd3db67 Re-add 'Create empty mod' and 'Create separator' to global mod list context menu. 2021-01-10 10:27:31 +01:00
Mikaël Capelle 342d529dd6 Do not notifyChange if the new name is identical to the old name. 2021-01-10 10:27:31 +01:00
Mikaël Capelle 883ca5d376 Left-align warning icon if there is no update icon in the column version. 2021-01-10 10:27:31 +01:00
Mikaël Capelle 2606b10c7e Display upgrade/warning for versions on collapsed separators. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 3e5d71923f Rename ModListStyledItemDelegated -> ModListStyledItemDelegate. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 5fb590efe3 Fix vertical alignment of icons. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 7b684f4d15 Tentative fix for automatic text color when markers or separator colors are used. 2021-01-10 10:27:30 +01:00
Mikaël Capelle d923730452 Allow double-click to accept choice in ListDialog. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 2d9fbc7421 Remove dropSeparators() method from proxy. 2021-01-10 10:27:30 +01:00
Mikaël Capelle abd82f88db Fix Alt+Click for selecting children of separators. 2021-01-10 10:27:30 +01:00
Mikaël Capelle c06d28e3a3 Tentative fix for drop indicator appearance at the top of the mod list. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 7d9fa5e4f9 Fix drop below collapsed separator. 2021-01-10 10:27:30 +01:00
Mikaël Capelle fc60ea5b7a Add option to have different separator collapsed/expanded states between profiles. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 80371ae2cc Update markers and plugins highligths when separator is expanded/collapsed. 2021-01-10 10:27:30 +01:00
Mikaël Capelle f919e09173 Show conflicts and highligth plugins from collapsed separators. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 5765439c7c Alt+Click select/deselect the rows below from a separator. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 183440d694 Display mod flags on collapsed separators. 2021-01-10 10:27:30 +01:00
Mikaël Capelle 1ac3f4d8e8 Display children contents in collapsed separator. 2021-01-10 10:27:22 +01:00
Mikaël Capelle 76796796be Re-organize settings. Add setting to remember filters when restarting MO. 2021-01-10 10:26:11 +01:00
Mikaël Capelle 80e44a9e3a Merge pull request #1338 from Holt59/collapsible-separators
Collapsible separators (and refactoring).
2021-01-10 10:25:37 +01:00
Mikaël Capelle 4a0ce804ea Menu separator before collapse entries in separator context menu. 2021-01-10 10:20:46 +01:00
Mikaël Capelle 1ed3fcaa9b NameRole -> GameNameRole. 2021-01-10 10:19:40 +01:00
isanae eaec140f7c Merge pull request #1349 from isanae/master
Handle category cycles by putting parent ids in a set
2021-01-09 15:12:56 -05:00
isanae 6781451ab2 handle cycles by putting parent ids in a set 2021-01-09 15:07:20 -05:00
isanae 135d23c20a Merge pull request #1347 from isanae/master
Fix game selection not appearing on startup
2021-01-09 14:01:25 -05:00
isanae ea76c33710 fix skipping pages in single page mode
in single page mode, ready() can return false for some pages like the instance type if the selected page is past it, so skip() has to be checked too
2021-01-09 13:56:21 -05:00
Mikaël Capelle bec0974c95 Prevent creating separator or empty mod 'on' backups. 2021-01-06 17:55:11 +01:00
Mikaël Capelle 9703c45741 Remove incorrect command and small clean for mainwindow.h. 2021-01-06 11:25:56 +01:00
Mikaël Capelle 4ac3ee4291 Do not return value from copySelection(). 2021-01-06 10:05:35 +01:00
Mikaël Capelle 86fb0dc9bd Merge remote-tracking branch 'origin/master' into collapsible-separators 2021-01-06 09:29:15 +01:00
Mikaël Capelle fc4b069a87 Remove manual setDrag/setDrop in download tab. 2021-01-06 09:27:20 +01:00
Mikaël Capelle bcdf38f5cf Avoid switching proxy model when not necessary. 2021-01-05 13:14:06 +01:00
isanae e3e54bc8d3 Merge pull request #1342 from isanae/shortcut-nolock
Fix running shortcuts with locking disabled
2021-01-05 07:06:50 -05:00
isanae 24a6749157 fix running shortcuts with locking disabled
when a ProcessRunner gets ForceWait|PreventExit and locking is disabled, wait for the process normally but without showing the ui
changed references to UILocker::Session to pointers because they can now be null
2021-01-04 20:49:05 -05:00
isanae 09f07ddae9 Merge pull request #1341 from isanae/profile-crash
Fixes for the profiles dialog
2021-01-04 20:46:43 -05:00
Mikaël Capelle 8685fcda31 Documentation + Refresh expanded state on model reset. 2021-01-04 19:46:29 +01:00
Mikaël Capelle faa4ae3426 Remove useless QObject:: accessor. 2021-01-04 19:41:47 +01:00
Mikaël Capelle b242394c0f Keep track of expanded items in the view instead of the models. 2021-01-04 19:37:20 +01:00
Mikaël Capelle 85cd337157 Disable proxies when they are not used. 2021-01-04 19:06:43 +01:00
isanae 7c0479b098 fixes for the profiles dialog:
- don't refresh before showing the dialog, this happened because setCurrentIndex() was called to reselect the old item after <manage> was selected
 - can't use previousIndex after the dialog has been shown, the ordering might have changed if profiles were created/removed
 - don't call activateSelectedProfile() manually when 'select' is clicked from the dialog, just call setCurrentText() and let it fire the event again, then return immediately so it's not done twice
2021-01-04 09:40:52 -05:00
Mikaël Capelle 7d53976ecc Reduce auto-expand delay to 750ms. 2021-01-03 16:58:26 +01:00
Mikaël Capelle fbd7e777d7 Add option to enable/disable displaying conflicts on collapsed separators. 2021-01-03 16:30:35 +01:00
Mikaël Capelle f7647b985b Fix ModListView::visualRect(). 2021-01-03 13:39:22 +01:00
Mikaël Capelle 3366d9f192 Create CopyEventFilter. Add Ctrl+C to the plugin list. 2021-01-03 12:51:54 +01:00
Mikaël Capelle c36d1126df Remove log. 2021-01-03 12:28:29 +01:00
Mikaël Capelle b708bcc097 Show conflict icons from children when separator is collapsed. 2021-01-03 12:24:27 +01:00
Mikaël Capelle 3d176cf01e Reorganizer ModList filters. 2021-01-03 11:59:27 +01:00
Mikaël Capelle 098ea31a1d Update documentation for drawBranches. 2021-01-03 01:50:45 +01:00
Mikaël Capelle e96a1f3ced Fix indentation of indicators branches when using collapsible separators. 2021-01-03 01:44:39 +01:00
Mikaël Capelle c8eb3f6e05 Fix empty separator name in copy/paste. 2021-01-03 00:03:33 +01:00
Mikaël Capelle e713e49934 Move plugin list index-view conversion to private. 2021-01-02 23:33:42 +01:00
Mikaël Capelle 94b3674d08 Move highlighting of mods containing selected plugins to mod view. 2021-01-02 20:35:39 +01:00
Mikaël Capelle 085ccd973d Remove log from filter list. 2021-01-02 20:34:30 +01:00
Mikaël Capelle 8de7b79a2b Move markers management for overwrite/overwritten to ModListView. 2021-01-02 20:26:39 +01:00
Mikaël Capelle d96dcf02b1 Refactoring of ModInfo to give access to the core. Remove ModInfo::remove() completely. 2021-01-02 19:07:50 +01:00
Mikaël Capelle c7abae79b3 Minor cleaning of PluginList. 2021-01-02 18:27:16 +01:00
Mikaël Capelle 45628951b6 Remove useless layoutChanged() in PluginList. 2021-01-02 18:24:53 +01:00
Mikaël Capelle 12148488a6 Remove unused signal. 2021-01-02 18:24:37 +01:00
Mikaël Capelle 071974c243 Save/restore filter list state between run. 2021-01-02 17:18:31 +01:00
Mikaël Capelle 22810ccbba Add Ctrl+C to copy the current selection of mod in the mod list. 2021-01-02 16:29:10 +01:00
Mikaël Capelle 740c383f63 Add index attribute to ModInfo. 2021-01-02 16:28:55 +01:00
Mikaël Capelle 9ac6e37575 Minor cleaning and fix in ModList.
- Proper display of separator name for removal.
- Replace usage of flags with isXXX.
2021-01-02 15:40:12 +01:00
Mikaël Capelle 253fbb6964 Move option to use collapsible separators. 2021-01-02 15:40:12 +01:00
Mikaël Capelle 42586639a8 Move connection from organizer to mainwindow. 2021-01-02 15:40:12 +01:00
Mikaël Capelle d86dec5382 Minor refactoring. 2021-01-02 15:40:12 +01:00
Mikaël Capelle 65577c71f3 Fix notification for removed mods. 2021-01-02 15:40:10 +01:00
Mikaël Capelle e6769bacdd Add Page Up/Down shortcut in ModInfoDialog. 2021-01-02 15:38:19 +01:00
Mikaël Capelle c0ac46d5c0 Fix create empty mod/separator position. 2021-01-02 15:38:19 +01:00
Mikaël Capelle bd76c67730 Disable 'filter separators' combo box when using collapsible separators. 2021-01-02 15:38:19 +01:00
Mikaël Capelle c135920b16 Fix highligth of collapsed separator. Move foreground color fix to delegate. 2021-01-02 15:38:19 +01:00
Mikaël Capelle 8a789d303b Remove duplicated code. 2021-01-02 15:38:19 +01:00
Mikaël Capelle 011e4d522e Fix setting the primary category of multiple mods at once. 2021-01-02 15:38:19 +01:00
Mikaël Capelle 21ab4ad78b Minor cleaning in ModList. 2021-01-02 15:38:19 +01:00
Mikaël Capelle d708287c9e Clean code and reorganize. 2021-01-02 15:38:19 +01:00
Mikaël Capelle 3bb189a427 Add method to retrieve the grouping mode. 2021-01-02 15:38:19 +01:00
Mikaël Capelle 3560093f1b Override separator color instead of mixing it. 2021-01-02 15:38:19 +01:00
Mikaël Capelle e5f43788e8 Visual fixes for the modlist.
- Fix invalid positions of markers in the scrollbar.
- Use color from children for collapsed elements (background and markers).
2021-01-02 15:38:19 +01:00
Mikaël Capelle f36c683320 Save the state of the mod list properly. 2021-01-02 15:38:19 +01:00
Mikaël Capelle 73490b3fdd Remove unused stuff from MainWindow. 2021-01-02 15:38:18 +01:00
Mikaël Capelle e02ba3b26d Some cleaning. Avoid using Qt::UserRole. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 73b4a590ca Use topLevelWidget() instead of custom parent in mod list actions. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 33860662c1 Move sort plugins handler to PluginListView. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 87dac464d9 Fix position of markers in scrollbar for non-flat models. 2021-01-02 15:38:18 +01:00
Mikaël Capelle fff41be845 Remove selection-related stuff from plugin/mod lists. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 399ff3fcf7 Minor clean for plugin list. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 91081315cf Remove unused methods. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 5d82e9cfec Add shift+enter shortcut to expand rows in mod list. 2021-01-02 15:38:18 +01:00
Mikaël Capelle b5ce6eb8e7 Move open-explorer key combination to views. 2021-01-02 15:38:18 +01:00
Mikaël Capelle bd34b53223 Move plugin list context menu to its own class and to PluginListView. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 25a2123e5f Move keyboard event to PluginListView. 2021-01-02 15:38:18 +01:00
Mikaël Capelle f2d8469ed6 Start moving stuff from MainWindow to PluginListView. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 8dffe65032 Documentation for ModListView. 2021-01-02 15:38:18 +01:00
Mikaël Capelle e420b8fc26 ProxyStyle documentation. 2021-01-02 15:38:18 +01:00
Mikaël Capelle cc4dcf617f Move modlistview proxy style to moapplication. 2021-01-02 15:38:18 +01:00
Mikaël Capelle ac6373edf6 Fix drop indicator style in mod list. 2021-01-02 15:38:18 +01:00
Mikaël Capelle ca5beac251 Remove cancelModListEditor (unused). 2021-01-02 15:38:18 +01:00
Mikaël Capelle 142ba74acf Use proper parent object in modlistviewactions. 2021-01-02 15:38:18 +01:00
Mikaël Capelle f4fff85d6d Fix parent of ModInfoDialog. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 0abf0d8c8e Remove useless using declaration. 2021-01-02 15:38:18 +01:00
Mikaël Capelle ee7097b0a7 Make some methods protected in ModListView. 2021-01-02 15:38:18 +01:00
Mikaël Capelle 524145405b Minor refactoring. 2021-01-02 15:38:18 +01:00
Mikaël Capelle acdea88541 Maintain selection while filtering (again). 2021-01-02 15:38:17 +01:00
Mikaël Capelle a19ede5b6f Move filter list to ModListView. 2021-01-02 15:38:17 +01:00
Mikaël Capelle a105e4c8c8 Move more stuff from MainWindow. Minor improvements for prev/next button in ModInfoDialog. 2021-01-02 15:38:17 +01:00
Mikaël Capelle fcf0aff98b Replace hasFlag by isX. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 48d92fbd9f Fix originModified signal handling. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 2ed9db7aab Move creations of actions to ModListView. 2021-01-02 15:38:17 +01:00
Mikaël Capelle a27656dc7b Move click event to ModListView. Remove unused slots from MainWindow. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 4f89665056 Move the regular context menu. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 51281ac304 Clean visitOnX methods. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 6e4b1790ae Move the separator context menu. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 4ee929b68a Move the backup context menu. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 7f0c9b8d82 Move the overwrite context menu. 2021-01-02 15:38:17 +01:00
Mikaël Capelle fb52a129b3 More stuff moved to mod list context. 2021-01-02 15:38:17 +01:00
Mikaël Capelle e8c2d9cd29 More context menu stuff moved. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 8a88421fd9 Start moving modlist context menu actions to separate structures. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 07c2badd17 Fix rebase from 54736a6. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 89ff59da46 Add message for invalid drag. Split & clean code. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 313589cf10 Fix canDrop in sort proxy. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 6443fa4c0e Fix category management. 2021-01-02 15:38:17 +01:00
Mikaël Capelle eabf64fbc0 Clean drag&drop code and add drop of external folder/archives. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 50a0c95a82 Remove unused method. 2021-01-02 15:38:17 +01:00
Mikaël Capelle 229033f2d6 Remove debug for not-checkable row in grouping proxy (happens with backups for instance). 2021-01-02 15:38:16 +01:00
Mikaël Capelle 8eb59316f9 Do not invalidate the sort proxy when not required (keep selection). 2021-01-02 15:38:16 +01:00
Mikaël Capelle 1efa793290 Expand separator after drop. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 53d6460558 Attempt to fix the style of the drop indicator. 2021-01-02 15:38:16 +01:00
Mikaël Capelle f906229a91 Fix indent when grouping by category/nexus id. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 41467d8e21 Conditional collapse/expand all item in 'all mods' menu. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 373b659dcb Fix and move stuff around.
- Move selection-related code from ModList to ModListView.
- Fix move-selection for multi-selection.
- Fix refresh of mod list on toggle selection.
2021-01-02 15:38:16 +01:00
Mikaël Capelle 095348c16f Add option to disable collapsible separators. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 44e846cf18 Remove context attribute from MainWindow. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 6e803a3522 Fix prev/next button in mod info dialog. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 7e2c521339 Refactoring and fixes.
- Move codes from MainWindow to ModListView.
- Fix enable/disable all visible.
- Fix changing style of the mod list.
2021-01-02 15:38:16 +01:00
Mikaël Capelle 68c9ae8592 Fix controls without indentation. 2021-01-02 15:38:16 +01:00
Mikaël Capelle a67fca4760 Tentative fix for the indentation. 2021-01-02 15:38:16 +01:00
Mikaël Capelle de87a105b0 Fix indentation and drop indicator. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 4ee3d2848e Prevent dropping mods into their current separator. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 7c073f74c2 Toggle expanded state on double-click. 2021-01-02 15:38:16 +01:00
Mikaël Capelle f923de39e0 Maintain selection while filtering. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 25d852f075 Fix filtering for separators. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 9ea4e6bb09 Increase auto-expand delay to 1s. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 9b13b467cf Revert "Revert to Qt default behavior for auto-collapse on hovering."
This reverts commit b74f08a57ba659e2da232e253844aff8a169f9e0.
2021-01-02 15:38:16 +01:00
Mikaël Capelle e5744941ae Fix dropping below/above separators. 2021-01-02 15:38:16 +01:00
Mikaël Capelle 48fc724a0d Remove non-necessary refresh() of the proxy on mod installed. 2021-01-02 15:38:16 +01:00
Mikaël Capelle d979e60aed Fix automatic refresh of the collapsible separator proxy. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 7a65cc6488 Disable drag&drop of mods in backups. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 6e802d7327 Do not move installed mod after merge/replace. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 54ea4445b0 Fix sorting of backups when using collapsible separators. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 64f771bc1f Refresh by-priority proxy after install and focus on the newly installed mod. 2021-01-02 15:38:15 +01:00
Mikaël Capelle e1ef7132ad Revert to Qt default behavior for auto-collapse on hovering. 2021-01-02 15:38:15 +01:00
Mikaël Capelle a7131a761e Prevent dropping separators onto separators. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 6d75ad0962 Allow drag&drop a separator to itself. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 8b89f9f49d Better drag handling. 2021-01-02 15:38:15 +01:00
Mikaël Capelle b340c564cf Fix keyboard move selection. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 9d8c64dccb Do not set Qt::ItemIsDropEnabled all the time. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 9db6a9d793 Save collapse state of separator. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 4636d7bd5d Small refactoring to avoid duplicated code. 2021-01-02 15:38:15 +01:00
Mikaël Capelle addb38645b Clean drag&drop of URLs and mods/archives. 2021-01-02 15:38:15 +01:00
Mikaël Capelle cc5f0c8555 Drag and drop from download view to install + Expand and scroll to mod on install. 2021-01-02 15:38:15 +01:00
Mikaël Capelle c46432cc2e Move common code to method. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 14bdef9ea6 Add collapse/expand all actions. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 1e2297604b Restrict collapsible separators to sort-by-priority in ascending order. 2021-01-02 15:38:15 +01:00
Mikaël Capelle e4473d8fd5 Restrict collapsible separators to sort-by-priority. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 6444dd7f5c Fix drag-and-drop of separators. 2021-01-02 15:38:15 +01:00
Mikaël Capelle 6e34765866 Allow drop before first separator. 2021-01-02 15:38:15 +01:00
Mikaël Capelle c778f01c89 Only expand if model is correct. 2021-01-02 15:38:14 +01:00
Mikaël Capelle 604da06bd8 Fix expansion of items when building tree. 2021-01-02 15:38:14 +01:00
Mikaël Capelle d4e0589470 Fix drag and drop of regular mods. 2021-01-02 15:38:14 +01:00
Mikaël Capelle 44103ef737 Disable auto-collapsing after delay. 2021-01-02 15:38:14 +01:00
Mikaël Capelle 064caa6ef4 Add auto-expand. 2021-01-02 15:38:14 +01:00
Mikaël Capelle d0512da758 Use an intermediate structure to store the separator tree. 2021-01-02 15:38:14 +01:00
Mikaël Capelle be0d6aef00 Start working on collapsible separators. 2021-01-02 15:38:14 +01:00
Mikaël Capelle 71055e373d Merge pull request #1340 from Holt59/update-imodinterface
Remove setName and remove from mod interface.
2021-01-02 15:25:40 +01:00
Mikaël Capelle 3a92ff96ba Remove setName and remove from mod interface. 2021-01-02 15:08:29 +01:00
Al 386cfc511a Merge pull request #1336 from Holt59/fix-crash-during-extraction
Tentative fix for crash during large extraction.
2021-01-01 14:49:46 +01:00
Mikaël Capelle 469cfcef55 Tentative fix for crash during large extraction. 2020-12-31 11:52:16 +01:00
AL edee6af38e Bump version to alpha4 2020-12-30 22:17:46 +01:00
Mikaël Capelle 4fdb8ee8e6 Merge pull request #1334 from Holt59/dot-in-filefindinfos
Allow '.' for the path in findFileInfos.
2020-12-30 21:05:57 +01:00
Mikaël Capelle d7fce1a2d6 Allow '.' for the path in findFileInfos. 2020-12-30 20:46:22 +01:00
Al 54736a6e24 Merge pull request #1329 from Holt59/imodinterface-isX
Add method to get the type of IModInterface.
2020-12-30 15:25:26 +01:00
isanae 1b101bda36 Merge pull request #1333 from isanae/more-stuff-2
More stuff 2
2020-12-29 07:29:53 -05:00
isanae 33a177f1ed profiles dialog:
- added select button
  - select new profile in the list after creating
2020-12-29 02:42:07 -05:00
isanae cc997c3704 editable combobox for output mod name 2020-12-29 02:10:33 -05:00
isanae 91e1cc9cca update mod counts for creating/restoring backups 2020-12-28 06:59:39 -05:00
isanae f01fe9ce7c refresh action, added in toolbar and menu 2020-12-28 06:37:50 -05:00
isanae e43f6e6f37 disallow renaming the active profile 2020-12-28 06:24:26 -05:00
isanae 4b059fa71f Merge pull request #1332 from isanae/more-stuff
More stuff
2020-12-28 06:23:44 -05:00
isanae 9b3e91b53e renamed DownloadList::lessThan to lessThanPredicate and added a comment that it's used with the filter widget 2020-12-28 06:01:43 -05:00
isanae c2c0f7c98d added open in explorer in save game context menu 2020-12-28 05:44:51 -05:00
isanae f46a14f3bf delete shortcut for save games 2020-12-28 05:37:14 -05:00
isanae a8f6f0d7a0 split saves tab, no changes 2020-12-28 05:28:37 -05:00
isanae 462ea08c34 fixed warning about ini files with utf8 bom
fixed main thread name still getting clobbered by QWebEngine
2020-12-28 04:17:16 -05:00
isanae 3c62a048da fixed crash for ignore data/mark converted on multiple mods
also fixes only half the selected items being handled at a time
the selection must be copied first because it's live and will get invalidated when filters are being used
there was some weird connect() calls for every item, not sure why
2020-12-28 03:37:20 -05:00
isanae 1be2006359 offline mode:
- don't try to login on startup
- don't try to update loot when sorting and display a warning that the master list might be stale
2020-12-28 03:12:15 -05:00
isanae 51db1f99f0 custom browser command
changed some places that used QDesktopServices to use shell::Open() from uibase instead
2020-12-28 01:25:33 -05:00
isanae 106ed49bae removed setUpdateDelay(false) calls, it's the default
FilterWidget for downloads tab
2020-12-26 20:58:06 -05:00
isanae 3eb64c32e8 split downloads tab 2020-12-26 19:51:47 -05:00
isanae 2b2bb69351 don't update mods after installing in offline mode 2020-12-26 19:14:34 -05:00
isanae 2e86e36a8e allow selecting another instance when the game/variant isn't found 2020-12-26 19:09:59 -05:00
Mikaël Capelle f1156e169b Add method to get the type of IModInterface. 2020-12-26 16:53:07 +01:00
isanae 89bbdf22cd Merge pull request #1328 from isanae/stuff
Stuff
2020-12-24 23:06:53 -05:00
isanae 9441d49c6d added citrix to checks 2020-12-24 12:37:19 -05:00
isanae 1b700785bb don't log modules in winroot
dashes to dots
2020-12-24 11:22:24 -05:00
isanae da0771853a added BlueAmulet to contributors (conflict icons)
sorted names
2020-12-24 10:59:46 -05:00
isanae 5183b2f47a optimizations for download manager:
- use envfs for walking directory
 - minimize string copies, disk access
 - use set of filenames to check for duplicates
 - use file size from envfs
2020-12-24 10:55:55 -05:00
isanae c8cff6166d added version to dmp filename
replaced QApplication calls so createVersionInfo() can be called without one, happens with dump_running_process.bat
2020-12-24 10:02:56 -05:00
isanae 28d24b3caa don't count overwrite, m_Overwrite is dead code 2020-12-24 09:50:43 -05:00
isanae 444f12c7c4 replaced "validator" logs with "nexus", clearer for users 2020-12-24 09:45:26 -05:00
isanae b20b458299 also log primary handler 2020-12-24 09:42:23 -05:00
isanae b2af1e340f dump nxmhandler.ini 2020-12-24 09:36:04 -05:00
isanae c676247f99 ignore steam username when dumping settings 2020-12-24 09:13:11 -05:00
isanae 4bff983527 regex for osds
added gigabyte 3d osd, more nahimic
2020-12-24 09:12:16 -05:00
isanae 06ca11edfb Merge pull request #1327 from isanae/instance-icons
Fixed incorrect instance icons
2020-12-22 15:00:49 -05:00
isanae d08ed01438 fixed instanceIcon() so it works when game plugins fail auto detection but the instance has a custom path
had to change PluginContainer to non const in a few places
2020-12-22 14:40:51 -05:00
isanae b7486d9157 typo 2020-12-21 09:49:00 -05:00
isanae 5560931ad9 Merge pull request #1324 from isanae/master
Added 6788 and trosski to the about diaog
2020-12-20 23:13:40 -05:00
isanae f1ea330df0 added 6788 and trosski to the about diaog 2020-12-20 23:13:07 -05:00
isanae 97dab75c75 Merge pull request #1323 from isanae/master
Added timing for vfs mapping
2020-12-20 23:08:53 -05:00
isanae 598a99e420 added timing for vfs mapping 2020-12-20 23:08:14 -05:00
Mikaël Capelle 904264e231 Merge pull request #1313 from Holt59/load-plugin-without-restart
Implement loading/unloading of plugins without restarting
2020-12-07 08:40:23 +01:00
Mikaël Capelle 3264d7899e Remove unused member in proxy. 2020-12-04 19:58:47 +01:00
Mikaël Capelle d644eecbb7 Remove log for disconnectSignals(). 2020-12-04 19:56:26 +01:00
Mikaël Capelle 8b02a5a796 Fix crash when starting MO2 without instance. 2020-12-04 19:32:11 +01:00
Mikaël Capelle a1ab717e9e Minor cleaning (comments, names). 2020-12-04 13:41:06 +01:00
Mikaël Capelle 7a3bc0cd23 Throw exception when trying to unload the current game plugin. 2020-12-04 13:33:14 +01:00
Mikaël Capelle 4118aef2a2 Remove disconnectPlugins() from OrganizerCore. 2020-12-04 13:32:47 +01:00
isanae 0a6a5eb786 Merge pull request #1316 from isanae/master
Spaces in paths
2020-12-04 04:24:37 -05:00
isanae 50dde6c94e quotes for spaces in paths 2020-12-04 04:23:55 -05:00
Mikaël Capelle a30d49f4fc Avoid duplicating code to simulate startup. 2020-12-04 08:50:31 +01:00
Mikaël Capelle f229dbaaa7 Do not store the list of preview plugins in PreviewGenerator. 2020-12-04 08:03:40 +01:00
Mikaël Capelle a6654eaec8 Centralize loading Qt plugin in loadQtPlugin. 2020-12-04 07:58:58 +01:00
Mikaël Capelle 1a486a0942 Add MainWindow::onPluginRegistrationChanged. 2020-12-04 07:52:24 +01:00
Mikaël Capelle 47626d654f Clarify comment. 2020-12-04 07:45:56 +01:00
isanae b2ec5fa70a Merge pull request #1315 from isanae/download-crash
Handle null plugin when adding a download
2020-12-03 20:04:21 -05:00
isanae 43f20f511c handle null plugin when adding a download
happens when some plugins refer to other plugins that are missing
2020-12-03 20:03:35 -05:00
Al 258a9e0f5a Merge pull request #1312 from BlueAmulet/master
Better blue conflict icons
2020-12-02 13:19:41 -08:00
Mikaël Capelle 4240f10260 Fix callbacks for pluginlist, modlist and download manager. 2020-12-02 21:09:42 +01:00
Mikaël Capelle cb453a9ba7 Fix callbacks for IOrganizer when plugin are unloaded/loaded. 2020-12-02 21:08:22 +01:00
Mikaël Capelle 4f7f378d8d Add methods to load/reload/unload plugins. 2020-12-02 21:07:04 +01:00
Mikaël Capelle 89190af4b2 Add signals (not used yet) for registering/unregistering plugins. 2020-12-02 21:05:54 +01:00
Mikaël Capelle facb4e7fe4 Do not store installers in InstallationManager, use the ones from PluginContainer. 2020-12-02 21:04:18 +01:00
Mikaël Capelle 90154e621a Add Settings::unregisterPlugin(). 2020-12-02 21:03:10 +01:00
BlueAmulet 44eb0946a7 Better blue conflict icons 2020-12-02 11:15:00 -07:00
Mikaël Capelle c3a9571696 Merge pull request #1311 from Holt59/ipluginproxy-unload
Add IPluginProxy::unload() and rename instantiate() to load().
2020-12-02 16:26:59 +01:00
Mikaël Capelle b8bc0f7ab3 Merge pull request #1310 from Holt59/fix-mod-extensions-check-for-install
Compute supported extensions dynamically in installation and download managers.
2020-12-02 09:09:38 +01:00
Al 5ff024b77c Merge pull request #1300 from Qudix/ignore_alt
Ignore ALT-key event when ui is locked
2020-12-01 14:06:15 -08:00
Seth Riley ce7345bde2 The Golden Comment 2020-12-01 16:05:23 -06:00
Seth Riley 852d8745a1 Merge https://github.com/ModOrganizer2/modorganizer into ignore_alt 2020-12-01 15:55:50 -06:00
Mikaël Capelle 4818eb6cfe Add IPluginProxy::unload() and rename instantiate() to load(). 2020-12-01 21:21:26 +01:00
Mikaël Capelle ad17210d7a Compute supported extensions dynamically in installation and download manager. 2020-12-01 21:07:54 +01:00
Al 1ec3ab2b8a Merge pull request #1304 from ModOrganizer2/Al12rs-refresh-waitForApplication
Refresh after waiting for application (vfs)
2020-11-28 10:55:25 -08:00
AL 3db08caaf2 Allow optional refresh for waitForApplication() 2020-11-28 17:28:49 +01:00
AL d99e576db8 Merge branch 'master' into Al12rs-refresh-waitForApplication 2020-11-28 17:21:33 +01:00
Al 2c115e48cc Merge pull request #1301 from ModOrganizer2/iplugingame-saves
IPluginGame::listSaves
2020-11-28 06:32:09 -08:00
Mikaël Capelle ef11888116 Fix conflicts with master. 2020-11-27 19:20:41 +01:00
isanae dffec4fd9d Merge pull request #1305 from ModOrganizer2/revert-1277-master
Revert "Changing the location of several directories"
2020-11-27 07:47:19 -05:00
isanae 5dd9bbe33a Revert "Changing the location of several directories" 2020-11-27 07:34:00 -05:00
Al a0229380ce Refresh after waiting for application (vfs) 2020-11-26 15:33:49 +01:00
Mikaël Capelle d855daf103 Revert translation file. 2020-11-25 21:18:37 +01:00
Mikaël Capelle f3f0036a05 Fix PluginContainer::setUserInterface(). 2020-11-23 15:30:21 +01:00
Mikaël Capelle 0a912afe72 Add timer to the save list watcher to avoid error during refresh. 2020-11-21 12:13:20 +01:00
Mikaël Capelle 32072ca19e Return shared_ptr in IPlugin::requirements(). 2020-11-19 21:21:38 +01:00
Mikaël Capelle 951ccdc823 Update following removal of IPlugin::isActive(). 2020-11-18 19:26:59 +01:00
Mikaël Capelle e76e7e034d Move MemoizedLock to uibase. 2020-11-18 19:22:13 +01:00
Mikaël Capelle e39de4dd2a Update following addition of IPluginGame::listSaves(). 2020-11-18 19:22:05 +01:00
Mikaël Capelle ddba54382a Merge pull request #1292 from Holt59/iplugin-isactive-refactoring
IPlugin::isActive refactoring
2020-11-18 10:01:27 +01:00
Qudix 60688ecf5b Ignore ALT-key event when ui is locked 2020-11-18 02:13:25 -06:00
Mikaël Capelle 61554d3df7 Better vertical alignment for plugin descriptions. 2020-11-17 18:27:21 +01:00
Mikaël Capelle 1d6d01dec8 Disable checkbox when plugin cannot be enabled. 2020-11-17 18:24:10 +01:00
Mikaël Capelle 8886674379 Better dialog for warning when disabling proxy plugin. 2020-11-17 14:28:43 +01:00
Mikaël Capelle bed3475362 Fix crash for proxied plugins on first startup. 2020-11-17 14:28:00 +01:00
Mikaël Capelle e9a4f91fac Display inactive checkbox for core plugins (not for games). 2020-11-17 13:24:57 +01:00
Mikaël Capelle 1e67c3e68d Add core plugins and better messages. 2020-11-17 12:30:59 +01:00
Mikaël Capelle 9fd2a757fa Fix had -> add. 2020-11-17 10:50:36 +01:00
Mikaël Capelle c62da01478 Replace : by . in comments. 2020-11-17 10:49:29 +01:00
Mikaël Capelle e0b73a7d7d Fix selection in Plugins settings. 2020-11-17 10:45:29 +01:00
Mikaël Capelle 037ca381a4 Fix filter for child plugins. 2020-11-17 10:27:52 +01:00
Mikaël Capelle 0668640338 Merge pull request #1298 from Holt59/fix-findfiles
Allow '.' in findFiles and filter on file name, not full paths.
2020-11-17 09:17:21 +01:00
Mikaël Capelle 3de7e93a95 Merge pull request #1291 from Qudix/tracking_integration
Add a toggle for tracking
2020-11-16 12:43:47 +01:00
Mikaël Capelle 4c822e6563 Allow '.' in findFiles and filter on file name, not full paths. 2020-11-15 20:41:26 +01:00
isanae 5f7e2988cd Merge pull request #1297 from isanae/master
Fix crash when clicking ... in path page
2020-11-15 04:07:40 -05:00
isanae 18106aa945 fixed crash when clicking ...
lambda was taking a local variable by reference
2020-11-15 04:06:56 -05:00
Qudix 67188a39cb Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into tracking_integration 2020-11-14 19:45:23 -06:00
isanae 4833e494d5 Merge pull request #1277 from Qudix/master
Changing the location of several directories
2020-11-14 06:54:51 -05:00
Qudix 24991bf5fb Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into master 2020-11-14 00:36:57 -06:00
isanae 579f94b5b6 Merge pull request #1296 from isanae/master
Adding Qudix to contributors
2020-11-13 23:54:47 -05:00
isanae 6a6cf8b0e7 added Qudix to contributors 2020-11-13 23:54:08 -05:00
Mikaël Capelle 88d2d7b918 Merge pull request #1295 from Holt59/fix-order-of-saves
Fix order of saves.
2020-11-13 18:29:53 +01:00
Mikaël Capelle e99b05f20d Fix order of saves. 2020-11-13 18:27:33 +01:00
Mikaël Capelle 34e9fb0015 Check for disabled mod page plugins. 2020-11-13 18:26:49 +01:00
Mikaël Capelle 1facda1943 Merge branch 'master' of github.com:ModOrganizer2/modorganizer into iplugin-isactive-refactoring 2020-11-13 16:14:31 +01:00
Mikaël Capelle 4d94ba8dbb Proper handling of mod pages. 2020-11-13 13:18:05 +01:00
Mikaël Capelle fe6654f892 Better 'Browse Mod Page' menu. 2020-11-13 13:04:22 +01:00
Mikaël Capelle 5384fb1cf6 Feeling like Shakespeare. 2020-11-12 22:30:22 +01:00
Mikaël Capelle 0d6bdf5721 Do not initialize proxied plugins twice. 2020-11-12 22:08:55 +01:00
Mikaël Capelle a4acfc1f99 Add callbacks for plugin enabled/disabled. 2020-11-12 21:49:57 +01:00
Mikaël Capelle 56dcdd33a2 It's 2020. 2020-11-12 21:23:35 +01:00
Mikaël Capelle 15059907c9 Proper handling of proxied plugins that implement multiple interfaces. 2020-11-12 20:47:20 +01:00
isanae 85f515da2d Merge pull request #1294 from isanae/master
Bunch of instance and command line stuff
2020-11-12 03:16:44 -05:00
isanae 6ae27224b0 fixed a bunch of instance and command line stuff
- clear instance manager overrides when restarting, or switching instances after starting MO with moshortcut://instance: won't do anything
- clear overrides when the last selected instance can't be opened; MO would keep trying to open shortcuts even after selecting a different instance
- command line was cleared too early, before the first run, so shortcuts were broken
- the instance manager dialog can be opened without an instance loaded if the last selected instance doesn't exist, createNew() would throw because it tried to access the global Settings
- fixed some problems with parts of MO wanting to restart and others expecting flow to continue
- fixed create instance dialog using settings pointer to decide whether to restart; it restarts when it's the first created instance, which is not always the case even if the settings are null, so just check whether there are instances
2020-11-12 03:15:14 -05:00
Qudix 125fc7a82e Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer 2020-11-11 23:30:03 -06:00
isanae f7de861812 Merge pull request #1293 from isanae/master
Crash when highlighting plugins from the Data directory
2020-11-12 00:18:41 -05:00
isanae a0c2651702 highlighting plugins from the data directory would crash
the mod name is "data" and getByName() crashes with a mod name that doesn't exist
2020-11-12 00:17:36 -05:00
Qudix f43b2284dd QtWebEngine does not respect built-in qt.conf 2020-11-11 20:58:38 -06:00
Mikaël Capelle 4fa44fe37e Remove duplicate dependencies. 2020-11-11 22:54:45 +01:00
Mikaël Capelle 90beed8c7b Handle proxy dependencies differently. 2020-11-11 22:45:33 +01:00
Mikaël Capelle 7ec0128eb5 Remove incorrect warning. 2020-11-11 21:42:05 +01:00
Mikaël Capelle c0ace25a87 Use IPlugin::master() when present. 2020-11-11 21:01:17 +01:00
Mikaël Capelle d3bd237c22 Fix rebase. 2020-11-11 20:34:28 +01:00
Mikaël Capelle a449098db9 Cleaner IPluginRequirement. 2020-11-11 20:30:34 +01:00
Mikaël Capelle e528d8b0ad Fix display of tools in the MainWindow menu. 2020-11-11 20:30:34 +01:00
Mikaël Capelle 0dddc5eb7b Fix handling of previous 'enabled' settings. 2020-11-11 20:30:34 +01:00
Mikaël Capelle f53d04a84d Hide Tool action instead of not adding them. 2020-11-11 20:30:34 +01:00
Mikaël Capelle 7a4f6d5344 Improve requirements handling. 2020-11-11 20:30:34 +01:00
Mikaël Capelle eb1d340f2d PluginRequirement -> IPluginRequirement and minor fixes. 2020-11-11 20:29:58 +01:00
Mikaël Capelle 6ee74831f7 Insert 'enabled' plugin if not present. 2020-11-11 20:29:58 +01:00
Mikaël Capelle 74ec078976 Replace usage of IPlugin::isActive(). 2020-11-11 20:29:58 +01:00
Qudix b9ec979b4c tabstop 2020-11-11 02:13:54 -06:00
Qudix 02c2329857 Add a toggle for tracking 2020-11-11 02:03:17 -06:00
Qudix b6f36b03a5 Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into master 2020-11-10 20:07:09 -06:00
isanae e1dceec67a Merge pull request #1290 from isanae/master
Local saves don't work
2020-11-10 21:01:57 -05:00
isanae ca54d5c55b Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer 2020-11-10 21:00:54 -05:00
isanae be2456e815 detectGame() must be called before init() 2020-11-10 20:59:47 -05:00
Qudix 62caad3cdb Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into master 2020-11-10 12:11:20 -06:00
isanae 9c21d1e4f6 Merge pull request #1289 from isanae/master
Don't delete user directories by default
2020-11-10 12:53:02 -05:00
isanae 849a8bd6b9 uncheck directories changed by the user by default to match the old behaviour of deleting an instance 2020-11-10 12:45:16 -05:00
isanae 49f208c5a2 Merge pull request #1287 from isanae/master
Stuff doesn't run
2020-11-10 11:52:34 -05:00
isanae 5fa4df5525 whitespace 2020-11-10 10:20:10 -05:00
isanae 92773706b9 don't attempt to parse the command line for launch, it fails in all sorts of ways
don't try to time stuff before logging is initialized, an exception before initLogging() will crash because ~TimeThis() tries to log
2020-11-09 17:17:04 -05:00
Qudix b9bc1a2d56 Using AppConfig 2020-11-09 14:10:50 -06:00
Qudix 0a3bdad8af Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into master 2020-11-09 13:02:01 -06:00
isanae fef8543a58 Merge pull request #1286 from isanae/master
Nexus state not updated in settings
2020-11-09 08:55:50 -05:00
isanae 713e053d2c fixed nexus state not being updated 2020-11-09 08:55:09 -05:00
isanae 84e53f3ab3 Merge pull request #1284 from isanae/command-line-cleanup
Command line cleanup
2020-11-09 04:27:12 -05:00
isanae efdda8e738 removed excess padding in plugins tab
put blacklist into a group box
2020-11-09 00:01:07 -05:00
isanae 3cc568a852 keyboard nav for create instance dialog
change the skip intro setting on click instead of on completion
ctrl+f in game page
2020-11-08 23:55:17 -05:00
isanae d7ae42d377 renamed singleinstance.h/cpp to multiprocess.h/cpp 2020-11-08 22:09:42 -05:00
isanae a5469ae4e0 renamed SingleInstance to MOMultiProcess
rewrote some comments to avoid using "instance"
2020-11-08 22:07:15 -05:00
isanae 54bf7e1fa2 timings 2020-11-08 21:58:02 -05:00
Mikaël Capelle d23b38b4df Merge pull request #1285 from Holt59/remember-tabwidget-index
Remember currently open tab in right panel.
2020-11-08 13:39:24 +01:00
Mikaël Capelle 10634245ce Remember currently open tab in right panel. 2020-11-08 13:30:59 +01:00
isanae 346a6babdf renamed "change game" button to "manage instances" 2020-11-07 21:51:47 -05:00
isanae a104f5751d changed wiki link to Instances 2020-11-07 21:48:04 -05:00
isanae 2f817f36ef task dialog for plugin loadcheck
added option to skip plugin for this session only
2020-11-07 20:55:01 -05:00
isanae f9feb5fc5b show a confirmation before switching instances 2020-11-07 20:16:28 -05:00
isanae a28aeb2b18 implemented browse buttons 2020-11-07 20:16:28 -05:00
isanae 0b8fbfdc57 larger initial size for the instance dialog
save geometry if settings are available
2020-11-07 20:16:28 -05:00
isanae dd5367f488 fixed AppConfig::logFileName so it can be used
refactored MOApplication so everything is in doOneRun()
2020-11-07 20:16:28 -05:00
isanae 08c952e53a stopped using core dump stuff from usvfs, mo has its own
set exception handler at the start, it can handle not having qt or data paths
hopefully fixed infinite crash dumps
2020-11-07 20:16:27 -05:00
isanae b4f6275c3e split getCurrentInstance() 2020-11-07 20:16:27 -05:00
isanae 98b782caff reordered functions, removed unused headers 2020-11-07 20:16:27 -05:00
isanae 1b7384f7cb moved most of the stuff from main.cpp into MOApplication 2020-11-07 20:16:27 -05:00
isanae 079fd33cf1 added sanitychecks.h, moved to namespace sanity
added a set SetThisThreadName() after creating the main window, Qt resets it
2020-11-07 20:16:27 -05:00
isanae ba7d24faef moved handleCommandLine() to CommandLine::setupCore() 2020-11-07 20:16:27 -05:00
isanae 1bf24c7daa refactored setupInstance(), comments
ok -> okay
2020-11-07 20:16:27 -05:00
isanae d288587b00 moved instance setup/selection to instancemanager.cpp
comments
2020-11-07 20:16:26 -05:00
isanae a8187e7dc4 moved dlls stuff to MOApplication 2020-11-07 20:16:26 -05:00
isanae 90ea45328d moved splash stuff to MOSplash
comments
2020-11-07 20:16:26 -05:00
isanae 6ca1ebc349 comments
interpret a first argument starting with -- as an error instead of an exe name/binary
2020-11-07 20:16:26 -05:00
isanae 7614a14749 documentation 2020-11-07 20:16:26 -05:00
isanae baa5c3abee documentation
use an okay flag in PathsPage to avoid calling checkPaths() in ready() and make stuff mutable
moved a few things around
2020-11-07 20:16:26 -05:00
isanae b962d80816 moved DirectoryCreator up, moved fix functions as lambdas 2020-11-07 20:16:26 -05:00
isanae bc157095a5 moved getInstanceName() up
removed individual getters in CreateInstanceDialog, they were duplicating the work in creationInfo()
only VariantsPage needs access to the game plugin during creationInfo(), so pass it instead
selecting an undetected game, choosing a valid path and going back to the games page would not display the selected path in the list
2020-11-07 20:16:25 -05:00
isanae dc2ada2a42 added ... to the "Delete Instance" button to make it less scary
merged InstanceInfo into Instance, most of it was redundant
added logging before deleting instance
added Instance::readFromIni(), contains stuff that used to be in setup(), used by instance dialog
replaced QDir with QString in a few places, I hate QDir
2020-11-07 20:16:25 -05:00
isanae b7cb63ddb1 removed some redundant functions in InstanceManager, made them all non-static
documentation
2020-11-07 20:16:25 -05:00
Seth Riley b7b843d42b Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into master 2020-11-06 13:21:07 -06:00
Mikaël Capelle 93e8488a63 Merge pull request #1283 from Holt59/iplugingame-detectgame
Add IPluginGame::detectGame()
2020-11-06 20:17:48 +01:00
Mikaël Capelle ffeae1a632 Call detectGame() after checking for conversion. 2020-11-06 20:10:52 +01:00
Seth Riley 92f3694acd Fixed bad merge 2020-11-06 12:16:37 -06:00
Seth Riley ed1085d567 Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into master 2020-11-06 12:02:43 -06:00
Mikaël Capelle 1074825ca6 Replace IPlugin::registered() by IPluginGame::detectGame(). 2020-11-06 18:56:00 +01:00
isanae b909677c3f Merge pull request #1280 from isanae/command-line
Command line and instance dialogs
2020-11-06 10:51:03 -05:00
isanae ad8e9d99b3 renamed InstanceManager::instance() to singleton() to avoid confusion 2020-11-06 09:27:15 -05:00
isanae be9c39a3b4 pass null IOrganizer to proxy plugins instead of one with a null OrganizerCore
removed now useless null checks in OrganizerProxy
call setPluginDataPath() early so plugins can have it, since it's now a static function in IOrganizer
2020-11-06 09:05:45 -05:00
Mikaël Capelle a63a27840b Merge pull request #1281 from Holt59/imodinterface-filetree
Add IModInterface::fileTree().
2020-11-05 10:43:58 +01:00
isanae dc9de36965 call init() on proxy plugins
OrganizerProxy now handles a null OrganizerCore, used for proxy plugins
changed appVersion() and pluginDataPath() so they don't need OrganizerCore
2020-11-04 22:50:51 -05:00
isanae e6a87a1798 added IPlugin::registered()
removed useless dummy interfaces because init() isn't called anymore
python plugins currently broken because init() isn't called on them
fixed create instance dialog being shown on startup even if portable instance existed
display a message when the last instance can't be found
fixed instance manager dialog failing to open the portable instance
2020-11-04 20:57:50 -05:00
Mikaël Capelle 780cc2a352 Add IModInterface::fileTree(). 2020-11-04 21:46:39 +01:00
Seth Riley 34e1d05c28 Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into master 2020-11-03 18:38:45 -06:00
Seth Riley 68750575d2 Implement suggestions 2020-11-03 18:12:23 -06:00
isanae f7b097e6ba stop using deprecated map() 2020-11-03 13:38:08 -05:00
isanae 38d2f87b31 replaced #pragma once by ifdefs
changed pointer to ref to NexusInterface
on_actionChange_Game_triggered() now creates the dialog itself instead of calling test code
fixed broken command line options, they'd be reset before they were used
removed useless explicit
2020-11-03 13:35:02 -05:00
isanae a4747a1ecc show create instance dialog on startup if there are no instances 2020-11-03 12:10:41 -05:00
isanae 7b1e30b464 larged delete instance dialog 2020-11-03 11:41:54 -05:00
isanae fb2cddd92a replace "create instance" title by "setting up instance"
fixed bad game location for custom paths
2020-11-03 11:41:54 -05:00
isanae 1d97d914f1 InstanceManager now returns new Instance struct instead of instance name
moved most of the figuring out of instance parameters from InstanceManager to Instance, separated all the ui from it and put it in main.cpp
added ways to show single pages in the create instance dialog so they can be used when info is missing
2020-11-03 11:41:54 -05:00
isanae b10436d60f game icons in the instance list 2020-11-03 11:41:54 -05:00
isanae 356d17b2ea fixes after rebasing 2020-11-03 11:41:53 -05:00
isanae 4c5e3da233 moved nexus api stuff to GlobalSettings
pass a pointer to Settings around for things that can be called without settings, when creating the first instance
added dummy plugin list, mod list and iorganizer to initialize plugins without an instance
moved PluginContainer into the core filter, had nothing to do with the plugins list
NexusInterface is now created manually instead of being a static singleton because it needs to know if the settings are available
2020-11-03 11:39:08 -05:00
isanae ee53312652 moved naturalCompare() to uibase
don't try to delete paths that don't exist
natsort for instance names and games
2020-11-03 11:39:07 -05:00
isanae a9772873d6 open ini button
update when renaming instance
update and select when creating instance
2020-11-03 11:39:07 -05:00
isanae 14d15070c8 added checkboxes for deleting instances
disabled instance conversion buttons again, not implemented
2020-11-03 11:39:07 -05:00
isanae 003ef66d2f - changed PathSettings::base() to use the ini's parent directory instead of the global "dataPath" property; this is always the same thing, unless another Settings object is created for a different instance than the active one, which happens in the instance manager dialog
- instance manager dialog:
   - select the active instance when opening
   - instance deletion now handles custom paths from the ini
   - started on instance conversions, not functional
2020-11-03 11:39:07 -05:00
isanae f7e9724eb1 delete instance 2020-11-03 11:39:07 -05:00
isanae f67dc91aa1 fixed boost bind warnings 2020-11-03 11:39:07 -05:00
isanae 5fc6b0cd14 renamed cancel to close
add portable instance to the list, handle some of the buttons
2020-11-03 11:39:07 -05:00
isanae ea4485857c filter, explore buttons, instance rename 2020-11-03 11:39:07 -05:00
isanae 6f21f3a19f disable portable instance button if one exists 2020-11-03 11:39:06 -05:00
isanae 44d9ebaf07 implemented nexus page 2020-11-03 11:39:06 -05:00
isanae c4df6b8ec9 split nexus connection stuff into NexusConnectionUI so it can be reused in the instance creation dialog
removed the PluginContainer* parameter from NexusInterface::instance()
 - it's a singleton, so it only needs to be given once, not every time
 - it doesn't even matter because the first time instance() is called, it creates the singleton, but the plugin container is always null
 - and setPluginContainer() is called much later from OrganizerCore with the correct value
added non functional nexus page to instance creation dialog
2020-11-03 11:39:06 -05:00
isanae c699aeb6d8 moved list of supported games to details
having too many plugins made the dialog too tall
2020-11-03 11:39:06 -05:00
isanae 58479e4b00 filter for games
replaced the button box with a regular widget with vertical layout
it was doing weird things to buttons with focus when removing and adding buttons on the fly because of filtering
2020-11-03 11:39:06 -05:00
isanae a97638249d moved switch to instance to InstanceManager
double-click an instance to switch to it (disabled for now, not sure I want that)
2020-11-03 11:39:06 -05:00
isanae b1e681e129 hide tutorial question option 2020-11-03 11:39:05 -05:00
isanae 8987693dcf added hide option for intro page in create instance dialog 2020-11-03 11:39:05 -05:00
isanae 0f0313874a new GlobalSettings class to manage the registry
close the create instance dialog when launch is unchecked
2020-11-03 11:39:05 -05:00
isanae dfbcf8ec4c restart when finished, added launch instance checkbox 2020-11-03 11:39:05 -05:00
isanae 0389688f3b move to next page when clicking a game
add game name in the label in the paths page
can't use canonicalPath(), path might not exist
2020-11-03 11:39:05 -05:00
isanae cfdfa9d40e PathChecker is unnecessary, refactored its guts into NamePage and PathsPage
made existing paths just a warning, don't check for portable instances
2020-11-03 11:39:05 -05:00
isanae 048e3ac0d9 split create instance dialog pages 2020-11-03 11:39:05 -05:00
isanae 4ac8ab9856 don't skip paths for portable instance, what am I doing
implemented actual creation
removed mentions of %BASE_DIR% everywhere, use constant and functions from PathSettings
2020-11-03 11:39:05 -05:00
isanae 7b02c77a39 review page 2020-11-03 11:39:04 -05:00
isanae 2cb5c21b8e fixed settings doing weird stuff with multiple instances
sort games by name
added intro and confirmation pages
2020-11-03 11:39:04 -05:00
isanae ebbc8ed60c paths page 2020-11-03 11:39:04 -05:00
isanae 46d81056d1 editions page 2020-11-03 11:39:04 -05:00
isanae b10bcf4cb7 instance name page 2020-11-03 11:39:04 -05:00
isanae e0ed1c2153 select custom game directory 2020-11-03 11:39:04 -05:00
isanae 717be0c048 game page 2020-11-03 11:39:04 -05:00
isanae 60b59ddf09 started create instance dialog
allow for multiple instances of Settings
fill in information in instance manager
2020-11-03 11:39:04 -05:00
isanae 5513b273c6 added empty instance manager dialog 2020-11-03 11:39:03 -05:00
isanae e29f41565f fixed splash not trying the default one 2020-11-03 11:39:03 -05:00
isanae 555b2508a5 rewrote the delete instance dialog text 2020-11-03 11:39:03 -05:00
isanae 3761ac84b5 deleteLocalInstance() now uses TaskDialog 2020-11-03 11:39:03 -05:00
isanae 3c791b0920 moved registry key from "Tannin" to "Mod Organizer Team" 2020-11-03 11:39:03 -05:00
isanae 5b13704275 moved profile, current game and game edition checks to InstanceManager
trying to centralize all of this stuff
2020-11-03 11:39:03 -05:00
isanae 2c915429d8 refactored stuff into determineGameEdition() and handleCommandLine() 2020-11-03 11:39:03 -05:00
isanae ae118153fb more refactoring:
- moved splash stuff together
 - moved stuff in the main loop into doOneRun()
2020-11-03 11:39:02 -05:00
isanae 9435202034 removed flags from SingleInstance because there's only one left
refactoring in main.cpp:
 - moved stuff to loglist.cpp and moapplication.cpp
 - split main() into a few functions
2020-11-03 11:39:02 -05:00
isanae f97e40f127 moved initLogging() to loglist.cpp 2020-11-03 11:39:02 -05:00
isanae 3d1d9f1110 removed unused HaveWriteAccess()
stop useless preloading of ssl dlls
2020-11-03 11:39:02 -05:00
isanae 93d1c97fda cleaned up includes 2020-11-03 11:39:02 -05:00
isanae cf289d7f95 command usage lines, exe options 2020-11-03 11:39:02 -05:00
isanae a8b6f22730 formatting for command list
added empty exe and run commands
2020-11-03 11:39:02 -05:00
isanae f4ca82f798 fixed handling of profile names with different casing than on the filesystem
added --instance
2020-11-03 11:39:02 -05:00
isanae ccab9eae8d add warning when profile given with -p doesn't exist
implemented moshortcut, nxm links and executable names as command line options
2020-11-03 11:39:01 -05:00
isanae 75cc2ffead removed unused update parameter
moved --multiple to CommandLine
2020-11-03 11:39:01 -05:00
isanae f121d92602 implemented launch as a command 2020-11-03 11:39:01 -05:00
isanae 5e528fb4cf new CommandLine class
implemented crashdump as a command, fixed dump_running_process.bat to use it
attach to console if present instead of always create one
2020-11-03 11:39:01 -05:00
isanae b103f29775 added --multiple to allow launching multiple instances 2020-11-03 11:39:01 -05:00
Al a7d4f2a0c4 Merge pull request #1276 from ModOrganizer2/alternatives_vector_refactor
Refactor of alternatives vector to use classes for readability.
2020-11-03 05:48:51 -08:00
Seth Riley 7cc76f7cea Fix for deprecated implicit function definition 2020-11-02 19:40:13 -06:00
Seth Riley 5bad8f9032 Fixed tutorials 2020-11-02 19:13:04 -06:00
AL c5e3fb423f Change some for loops to use refs, prefer range loop where possible. 2020-11-02 23:20:43 +01:00
AL 4814ba626e Convert FileAlternative and DataArchiveOrigin to classes 2020-11-02 21:45:32 +01:00
AL b7935aedec Change Alternatives vector to use a struct 2020-11-02 20:35:05 +01:00
Seth Riley f7d7661d58 Changing the location of several directories 2020-11-02 13:20:05 -06:00
AL 88475677d2 Print the name, not the origin object 2020-10-31 20:58:07 +01:00
Al f507305ffb Merge pull request #1274 from ModOrganizer2/conflicts_conter_tooltip
Add advanced counters as tooltip to general conflicts tab.
2020-10-31 11:53:23 -07:00
AL 529dbb2cd5 handle case of find_if failing 2020-10-31 18:31:42 +01:00
AL b53a5b6a2a prefer if over ternary op 2020-10-31 18:08:53 +01:00
AL d330a9d74b Cleanup clear() 2020-10-31 17:54:56 +01:00
isanae a57cb6bb71 Merge pull request #1275 from isanae/conflicts-sort
Conflict lists sorting not using natsort
2020-10-31 12:37:25 -04:00
isanae 71fc5d0af5 stack overflow when searching text files/ini lists because they reported children to infinity and beyond
removed update delays for filters in mod info dialog
fixed conflict lists not using source sorting so they wouldn't use the case insensitive natsort
2020-10-31 12:27:44 -04:00
AL ad4e8897ff Remove random extra whitespace 2020-10-31 16:38:49 +01:00
Al 5ee734c189 Merge pull request #1272 from ModOrganizer2/advanced_conflict_tab_archives
Fix advanced conflicts tab archive support
2020-10-31 08:35:46 -07:00
AL 89d3311aca Prefer early return in case of error. 2020-10-31 16:24:43 +01:00
AL 6f77c47907 Fix typos in comments 2020-10-31 16:21:37 +01:00
AL db3f257d07 use alternatives.back() instead of iterator shenanigans. 2020-10-31 16:20:12 +01:00
AL 2833f8d61b Make advanced conflicts tab use italic if current mod file is from archive, instead of using the status of the winning version. 2020-10-30 02:15:34 +01:00
AL a6edf645eb Add advanced counters as tooltip to general conflicts tab.
Loose, archive, totals, percentages.
2020-10-30 01:52:27 +01:00
AL 0c485304c1 Fix advanced conflicts tab archive orders.
Use the the existing sorting of the alternatives vector instead of relying on priority (archives don't follow priority).
2020-10-28 20:18:47 +01:00
Al 9615767e17 Merge pull request #1271 from ModOrganizer2/update_archivelist_on_refresh
Write back the updated list of archives during bsaListRefresh.
2020-10-28 05:45:41 -07:00
AL 194b1c9053 Write back the updated list of archives during bsaListRefresh.
This will make it so that refreshing actually updates the list of internal enabled archives, but two refreshes are still needed to observe an actual change in archive conflicts.
2020-10-27 23:57:50 +01:00
Mikaël Capelle 57e67eeb39 Merge pull request #1269 from Holt59/imodlist-updates
IModList updates
2020-10-26 21:39:25 +01:00
Mikaël Capelle 61308ae2a6 Merge branch 'master' into imodlist-updates 2020-10-26 21:39:13 +01:00
Mikaël Capelle d42399e419 Merge pull request #1267 from Holt59/iorganizer-profile-callbacks
Add IOrganizer::onProfileXXX callbacks.
2020-10-26 21:36:55 +01:00
Mikaël Capelle 0ca5d2843e Use static_cast instead of dynamic_cast. 2020-10-25 19:29:08 +01:00
Mikaël Capelle 551e8353e0 Move IOrganizer::getMod() to IModList::getMod(). 2020-10-25 17:46:29 +01:00
Mikaël Capelle a216177b87 Move IOrganizer::removeMod() to IModList::removeMod(). 2020-10-25 17:16:17 +01:00
Mikaël Capelle 4b8c2b4a3b Add missing notifyModRemoved(). 2020-10-25 17:16:04 +01:00
Mikaël Capelle d804a5e186 Move IOrganizer::modsSortedByProfilePriority() to IModList::allModsByProfilePriority(). 2020-10-25 16:53:31 +01:00
Mikaël Capelle cca709baae Rename IOrganizer::refreshModList -> refresh. 2020-10-25 16:18:19 +01:00
Mikaël Capelle 4e11faf1c8 Move IOrganizer::onModInstalled() to IModList. Add IModList::onModRemoved(). 2020-10-25 15:52:53 +01:00
Mikaël Capelle 87a53eabd5 Wrap profile in Profile::Ptr when creating. 2020-10-24 21:03:35 +02:00
Mikaël Capelle 8e591143a5 Add IOrganizer::onProfileXXX callbacks. 2020-10-24 20:54:22 +02:00
Mikaël Capelle 52cfb8e8a7 Merge pull request #1260 from Holt59/iplugin-setactive-fix
Fix usage of isActive
2020-10-21 20:08:01 +02:00
Mikaël Capelle 3c1f206d7d Always call onPluginSettingChanged and onUserInterfaceInitialized callbacks. 2020-10-18 10:13:59 +02:00
Mikaël Capelle 7762c1f53a Check for problems when closing the settings dialog. 2020-10-14 19:38:10 +02:00
Mikaël Capelle ef82ddd36a Merge pull request #1259 from Holt59/imodinterface-seturl
Add IModInterface::setUrl and remove IInstallationManager::setURL.
2020-10-14 18:44:35 +02:00
Mikaël Capelle 6652e9c3be Do not use inactive preview plugin. 2020-10-11 22:04:40 +02:00
Mikaël Capelle b43fdc3b4c Add glob_matching.h to the utility group. 2020-10-11 21:24:09 +02:00
Mikaël Capelle 3932371cd1 Use proxy for ModList, PluginList and DownloadManager. Do not use registered callbacks when plugin is inactive. 2020-10-11 21:17:34 +02:00
Mikaël Capelle 0363b73adb Do not call installer callbacks for non-active plugins. 2020-10-11 21:16:29 +02:00
Mikaël Capelle 149328dcb2 Switch from Qt signals to boost::signals for DownloadManager. 2020-10-11 21:15:12 +02:00
Mikaël Capelle 9d7d55918c Add IModInterface::setUrl and remove IInstallationManager::setURL. 2020-10-09 20:32:26 +02:00
Al 35b4aa1024 Merge pull request #1254 from ModOrganizer2/Al12rs-2.4.0alpha2
Bump version to 2.4.0alpha2 for dev release
2020-10-05 08:49:35 -07:00
Al fac6f2c349 Bump version to 2.4.0alpha2 for dev release 2020-10-05 13:46:03 +02:00
Mikaël Capelle 4167e6768e Merge pull request #1248 from Holt59/iplugin-interface-improvements
Better display of MO2 plugins
2020-10-01 18:52:35 +02:00
Mikaël Capelle cd3f496a5b Merge pull request #1245 from Holt59/save-game-recursive
Allow MO2 to find game saves into subdirectories / Hide 'Enable Mods... ' when SaveGameInfo does not exist.
2020-10-01 18:52:24 +02:00
Mikaël Capelle 475fc0b813 Fix default tab index of settings dialog. 2020-10-01 18:42:17 +02:00
Mikaël Capelle fac9d4caf6 Merge pull request #1249 from Holt59/fix-create-separator-refresh
Fix refresh of modlist when creating mods.
2020-09-30 21:43:22 +02:00
Mikaël Capelle ebabd6fd4a Fix refresh of modlist when creating mods. 2020-09-30 21:41:32 +02:00
Mikaël Capelle fb3d22a04d Only hide QTreeWidgetItem in plugin list when filtering. 2020-09-30 20:10:34 +02:00
Mikaël Capelle 7786a75fee Make filter work and reorganize layout with QSplitters. 2020-09-30 19:57:54 +02:00
Mikaël Capelle 04c8409bf5 Add filter for plugin list. 2020-09-30 18:58:01 +02:00
Jeremy Rimpo 0de18a3410 Merge remote-tracking branch 'origin/qt-5_15-compat' 2020-09-29 18:32:14 -05:00
Mikaël Capelle 4b1a89648f Display plugins in a tree instead of a list in the settings dialog. 2020-09-29 22:47:38 +02:00
Mikaël Capelle e9be288f7c Add topImplementedInterface(). Minor cleaning. 2020-09-29 21:55:44 +02:00
Mikaël Capelle cf828cd77b Use bf::for_each instead of custom templates. 2020-09-29 21:20:10 +02:00
Mikaël Capelle 69625912b8 Add a method to retrieve the localized names of the implemented plugin interfaces. 2020-09-28 22:56:12 +02:00
Mikaël Capelle eb72caa7c1 Use localizedName() instead of name() for the list of plugins in the UI. 2020-09-28 22:55:55 +02:00
Mikaël Capelle 92585af197 Do not show 'Enable Mods... ' action for game without SaveGameInfo feature. 2020-09-28 21:51:59 +02:00
Mikaël Capelle e261fffa8d Fix transfer saves for recursive saves. 2020-09-28 20:30:19 +02:00
Mikaël Capelle 34ce22bfd3 Allow MO2 to find game saves into subdirectories. 2020-09-28 20:22:07 +02:00
Al 154d83e479 Merge pull request #1243 from Holt59/absolute-path-ini-files
Allow absolute path for ini files.
2020-09-27 17:05:13 -07:00
Mikaël Capelle 718e71854e Use IProfile::absoluteIniFilePath(). 2020-09-27 21:28:14 +02:00
Mikaël Capelle 37b42df112 Allow absolute path for ini files. 2020-09-27 21:24:00 +02:00
Mikaël Capelle 9dbf4d7820 Merge pull request #1244 from Holt59/add-iprofile-inifilepath
Add IProfile::iniFilePath().
2020-09-27 21:22:21 +02:00
Mikaël Capelle 39b7f4abe9 Fix gameDirectory() -> documentsDirectory(). Use QFileInfo more properly. 2020-09-27 20:59:54 +02:00
Mikaël Capelle 7c651f6d86 Rename iniFilePath() -> absoluteIniFilePath(). 2020-09-27 20:56:55 +02:00
Mikaël Capelle b53dc1e200 Add IProfile::iniFilePath(). 2020-09-27 20:31:51 +02:00
isanae 12524354a8 Merge pull request #1242 from ModOrganizer2/Al12rs-patch-1
Remove potential early return in forEachEntry()
2020-09-27 10:15:30 -04:00
Mikaël Capelle c67f37a41f Merge pull request #1226 from Holt59/fix-ipluginlist-callbacks
Change for onPluginStateChanged to take a list of plugins.
2020-09-27 14:55:50 +02:00
Al 789e12a9f8 Remove incorrect early break in forEachEntry
This caused mo2 to skip some mod files for a user, potentially others as well.
2020-09-27 13:28:20 +02:00
Al 7f4e83ea11 TEST rem potential early return in forEachEntry()
Test to see if this fixes a bug on discord.
2020-09-27 00:54:06 +02:00
Jeremy Rimpo 8e43dee79c [skip ci] Use PR branch for umbrella repo (if it exists) 2020-09-25 00:34:23 -05:00
Mikaël Capelle a1c2d78c94 Merge pull request #1240 from Holt59/no-localsaves-if-impossible
Disable profile-specific game saves if not available from game plugin.
2020-09-24 11:44:35 +02:00
Mikaël Capelle 05ea4f2e38 Disable profile-specific game saves if not available from game plugin. 2020-09-23 20:39:59 +02:00
Mikaël Capelle bf351ff80b Merge pull request #1238 from Holt59/plugin-installer-callbacks
Add IPluginInstaller onInstallationStart and onInstallationEnd callbacks
2020-09-23 18:40:20 +02:00
Mikaël Capelle 865ae1d802 Merge pull request #1236 from Holt59/expose-modinterface-meta
Add getters for most meta-information in mod.
2020-09-23 18:34:15 +02:00
Mikaël Capelle 8980153a2c Add 'reinstallation' parameter to onInstallationStart(). 2020-09-22 22:03:16 +02:00
Mikaël Capelle d9cc013813 Change modId() to nexusId(). 2020-09-22 21:21:45 +02:00
Al 77576f626d Merge pull request #1239 from Holt59/imodinterface-clearpluginsettings
Add IModInterface::clearPluginSettings().
2020-09-21 14:42:37 -07:00
Mikaël Capelle 92c5b933cc Add IModInterface::clearPluginSettings(). 2020-09-21 23:38:51 +02:00
Mikaël Capelle c18d8c5dff Clean modinfo.h. 2020-09-21 23:24:59 +02:00
Mikaël Capelle d9a8e67598 Add IPluginInstaller onInstallationStart and onInstallationEnd callbacks. 2020-09-21 21:36:09 +02:00
Jeremy Rimpo 7563e4a517 [skip ci] Force exit PS with last exit code after umbrella build error 2020-09-21 06:25:13 -05:00
Jeremy Rimpo fc80d2f913 Needs quotes 2020-09-21 05:39:40 -05:00
Jeremy Rimpo 87e1618f1f [skip ci] Pull data from all branches 2020-09-21 05:39:13 -05:00
Jeremy Rimpo 2ec3025374 Missed CMD variable changed to PS syntax 2020-09-21 01:48:20 -05:00
Jeremy Rimpo a8f61b39c2 Change REM to PS comment 2020-09-21 00:39:36 -05:00
Jeremy Rimpo c664f26e57 Finalize appveyor script update 2020-09-20 22:34:38 -05:00
Jeremy Rimpo 9d27fb3c21 Convert scripts to PowerShell 2020-09-20 20:00:43 -05:00
Jeremy Rimpo dbe27903f4 Merge remote-tracking branch 'origin/master' into master 2020-09-20 19:06:10 -05:00
Jeremy Rimpo 4d6f43926b Update to checkout current branch in umbrella if it exists 2020-09-20 19:02:39 -05:00
Al 35500736ab Merge pull request #1237 from Holt59/mod-specific-plugin-settings
Add pluginSetting[s]() and setPluginSetting() to IModInterface.
2020-09-20 12:53:00 -07:00
Al 80ea74c70c Merge pull request #1235 from Holt59/fix-current-saves-dir
Fix issue with global saves directory when setting files are availble for non-Bethesda games.
2020-09-20 06:55:24 -07:00
Mikaël Capelle 89c93c3d32 Add pluginSetting[s]() and setPluginSetting() to IModInterface. 2020-09-20 15:13:56 +02:00
Mikaël Capelle 3211f518ce Add validated() and converted(). 2020-09-20 13:32:45 +02:00
Mikaël Capelle dce1993aef Fix issue with global saves directory when setting files are availble for non-Bethesda games. 2020-09-20 12:30:41 +02:00
Mikaël Capelle 4ed297750f Add getters for most meta-information in mod. 2020-09-20 12:29:56 +02:00
Al 4d9456dcf9 Bump appveyor version to 2.4 2020-09-10 14:46:23 +02:00
Jeremy Rimpo 5f3d4770d8 Update script 2020-09-10 02:47:40 -05:00
Jeremy Rimpo f0b7546fa8 Failures should be failures 2020-09-10 02:03:59 -05:00
Jeremy Rimpo 7fff2d85c9 Add handling for nightly builds 2020-09-10 01:45:11 -05:00
Jeremy Rimpo a5c2e516ed Merge branch 'bulk-update-fix' into master 2020-09-09 14:16:23 -05:00
Jeremy Rimpo 95b1c13dc6 Don't always increment 2020-09-09 14:15:22 -05:00
Jeremy Rimpo 3711cc0144 Merge pull request #1230 from ModOrganizer2/bulk-update-fix
Fixes for bulk update check
2020-09-09 13:34:54 -05:00
Jeremy Rimpo d30d966500 Standardizing 2020-09-09 13:33:36 -05:00
Jeremy Rimpo 10234e436a Traslate lines, use QPair 2020-09-09 12:37:34 -05:00
Jeremy Rimpo 81036b0149 Fixes for bulk update check
* Check game source for validity
* Display name of source when no updates found
2020-09-09 11:25:19 -05:00
Jeremy Rimpo 9938ded589 Compatibility fix for Qt 5.15.x 2020-09-09 11:23:54 -05:00
Chris Bessent 504683776c Merge pull request #1227 from LostDragonist/master
Do not report a canceled install as failed
2020-09-07 17:56:37 -07:00
Chris Bessent 23eab916ae Do not report a canceled install as failed
When a mod install reached the point of checking for overwrites with
existing mods (i.e., new mod has the same name as an old mod), there
was no way to distinguish between a failure and a user cancellation.
Now, an explicit status is passed up the stack so the cancellation
can be safely ignored by error checking code.
2020-09-06 06:57:05 -07:00
Mikaël Capelle b95373cb12 Change for onPluginStateChanged to take a list of plugins. 2020-09-05 13:49:55 +02:00
AL 2ad41ee2cd Bump dev build number 2020-09-01 13:37:59 +02:00
Al 460a068b38 Merge pull request #1222 from Holt59/ipluginlist-setpriority
Add IPluginList::setPriority implementation.
2020-09-01 04:00:04 -07:00
Al fa6136c671 Merge pull request #1220 from Holt59/modlist-setactive-bulk
Add a bulk-version of ModList::setActive.
2020-09-01 03:59:22 -07:00
Mikaël Capelle 6c86a0321b Add IPluginList::setPriority implementation. 2020-08-30 14:03:49 +02:00
Mikaël Capelle 3729f18af1 Update for change to onModStateChanged. 2020-08-29 19:35:41 +02:00
Mikaël Capelle fd86000f1e Fix typo in notifyModStateChanged documentation. 2020-08-29 16:10:23 +02:00
Mikaël Capelle 97e9e7cf2b Refactor the way m_ModStateChanged works. 2020-08-29 15:20:46 +02:00
Mikaël Capelle e421837ba0 Remove check for alwaysEnabled() and log missing mods in ModList::setActive(). 2020-08-29 13:35:58 +02:00
Mikaël Capelle 600a4b3b14 Add a bulk-version of ModList::setActive. 2020-08-29 12:48:17 +02:00
Al f0e94c26ae Merge pull request #1212 from Al12rs/mod_reinstall_modinfo_fix
Fix missing installed file info after reinstalling a mod.
2020-08-26 11:23:42 -07:00
Al abc714c624 Merge pull request #1214 from Al12rs/mark_uninstalled_when_replacing
Mark downloads of replaced mods as uninstalled
2020-08-26 11:23:28 -07:00
Al df26f75880 Merge pull request #1218 from Al12rs/backup_remove_no_uninstall
Don't mark a file as uninstalled when removing a backup.
2020-08-26 11:23:03 -07:00
Al 6e0919ab2c Merge pull request #1217 from Al12rs/conflicts_tab_labels
Improve modinfodialog conflicts tab labels and tooltips.
2020-08-26 11:22:50 -07:00
Al ac0f5a286c Merge pull request #1216 from ModOrganizer2/Al12rs-patch-1
Bump version to prealpha 2.4.0alpha1
2020-08-26 11:22:34 -07:00
Al f4aa0d4132 Merge pull request #1213 from Al12rs/adjustForVirtualized_fix
Use trailing slashes to make accurate comparisons in adjustForVirtualized
2020-08-26 11:22:17 -07:00
AL 743b03ceba Don't mark a file as uninstalled when removing a backup. 2020-08-26 14:15:11 +02:00
AL 3c778ef7c0 Improve modinfodialog conflicts tab labels and tooltips. 2020-08-26 13:53:11 +02:00
Al 27f9849992 Bump version to prealpha 2.4.0alpha1 2020-08-26 12:58:07 +02:00
AL c23ee0b1dc Mark downloads of replaced mods as uninstalled 2020-08-26 02:15:37 +02:00
AL ba1ff53c1b Use trailing slashes to make accurate comparisons in adjustForVirtualized. 2020-08-26 01:09:26 +02:00
AL 93b32b3658 Add the installed file to the list even from InstallMod, not just InstallDownload.
InstallMod is used for Reinstalling.
2020-08-25 20:46:23 +02:00
isanae 6f232d566e Merge pull request #1210 from Holt59/improve-mo2-update-details
Show details for all releases from Github when updating.
2020-08-24 13:12:46 -04:00
Mikaël Capelle e9787953d9 Better separation of changelogs in details. 2020-08-23 19:52:10 +02:00
Mikaël Capelle 172dda1bce Show details for all releases from Github when updating. 2020-08-23 19:44:55 +02:00
isanae a4043bab8c Merge pull request #1201 from erri120/open-meta
Open Meta file from downloads list
2020-08-21 01:27:50 -04:00
erri120 321b1facdc Updating error logging 2020-08-20 19:37:45 +00:00
erri120 9a9a2c5c6e Removed error log localization 2020-08-20 21:19:59 +02:00
Al 9e3793c194 Merge pull request #1202 from AnyOldName3/patch-3
Add FOMOD C# installer link
2020-08-20 11:05:09 -07:00
Chris Djali 0361707358 Add FOMOD C# installer link
Maybe we should add a CI step to check we've got links to all the MO2 repos (except the few that are deliberately not there).
2020-08-20 19:01:13 +01:00
erri120 5a857be1e4 Create meta file if it does not exist when trying to open it 2020-08-20 17:56:57 +02:00
erri120 586b3cd04e Added Open Meta File context action to downloads 2020-08-20 17:40:46 +02:00
isanae 41249036e5 Merge pull request #1194 from isanae/die-after-dump
Die after dumping
2020-08-13 14:42:19 -04:00
isanae d69289e081 always call the previous terminate handler, which should abort
without it, execution just resumes and dumps are created endlessly
2020-08-13 14:40:35 -04:00
isanae 0adf8a9f1b Merge pull request #1182 from AnyOldName3/dont-speak-ill-of-the-dead
Don't use reference as class member
2020-08-07 22:45:51 -04:00
AnyOldName3 05d03eec68 Don't use reference as class member
This particular QString was only ever constructed from a temporary,
so it was literally never going to work. We only hadn't noticed this
earlier as no one had tried using the mod repository bridge from a
plugin before (which is fairly bad given that three people have
theoretically tested it while working on its Python bindings in the
past).
2020-08-08 00:17:14 +01:00
isanae 592fa73104 Merge pull request #1176 from isanae/2.3.1-fixes
2.3.1 fixes
2020-08-01 11:11:41 -04:00
isanae 64ba6cae1e revert font scaling:
- users report low quality splash screen
 - sticking with qt's default is better in the long run
 - can still use the environment variable

revert network timer:
 - users report error in log every second
 - was a blind fix anyway, can't reliably reproduce it
2020-08-01 11:03:09 -04:00
isanae f71accc1ad bump to 2.3.1 2020-07-31 11:09:20 -04:00
isanae 44332c778d possible fix for "Network access is disabled"
start a timer and change NotAccessible back to UnknownAccessibility
2020-07-31 11:08:32 -04:00
isanae 6a1d57fe0c fixed bad font scaling 2020-07-31 10:01:00 -04:00
isanae 777229f28f added startSafeThread() to get core dumps for threads other than the main thread
added terminate handler
2020-07-31 09:56:19 -04:00
isanae 2eeaa0e31a fixed warning when trying to get the file type of files without extensions 2020-07-31 09:17:22 -04:00
Al 9d3281fd58 Update game-support-request.md 2020-07-29 16:59:32 +02:00
Al 1a468d66db Update game-support-request.md 2020-07-29 16:58:18 +02:00
Al 19fe01b60d Update issue templates 2020-07-29 16:57:31 +02:00
Al b6fac68b32 Update game-support-request.md 2020-07-29 16:53:57 +02:00
Al 50d883079e Update game-support-request.md 2020-07-29 16:53:22 +02:00
Al e379610805 Update game-support-request.md 2020-07-29 16:52:27 +02:00
Al 6dc736ca37 Update game-support-request.md 2020-07-29 16:50:00 +02:00
Al 7791ea0bd5 Create game-support-request.md 2020-07-29 16:47:43 +02:00
252 changed files with 30531 additions and 14591 deletions
@@ -0,0 +1,27 @@
---
name: Game support Request
about: Request support for a new game
title: Add support for game [GAME NAME]
labels: 'additional games support, Feature Request, area: mo2 game plugins'
assignees: ''
---
**This template is useful to add basic support using https://github.com/ModOrganizer2/modorganizer-basic_games.**
**If you are vaguely familiar with programming you can try following the instructions on that link to get something working yourself. If you have trouble with that please fill in this template.**
**Please provide the following information for the game (remove the optional lines you do not use):**
- **Name:** Name of the game
- **Short name:** Name of the game in Nexus URL (e.g. skyrimse for Skyrim SE).
- **Nexus ID [optional]:** ID of the game on Nexus (you can usually find this in Nexus URL).
- **Executable:** Name of the main executable for the game (relative to the game folder).
- **Launcher [optional]:** Name of the game launcher (relative to the game folder).
- **Data path:** Path to the data folder of the game (relative to the game folder).
- **Documents path:** Path to folder containing INI files, etc., for the game (usually under "My Games", or the game folder itself).
- **Saves directory [optional]:** Path to the folder containing save games (this default to the path above).
- **Save extension [optional]:** Extension of the saves
- **Steam ID [optional]:** ID of the game on Steam (if the game is on Steam).
**Provide additional details regarding the game that could be required for the plugin.**
+1 -1
View File
@@ -20,7 +20,7 @@ Steps to reproduce the behavior:
## Environment:
* Mod Organizer Version that exhibits the issue:
* Last Mod Organizer Verison that did not exhibit the issue (if applicable):
* Last Mod Organizer Version that did not exhibit the issue (if applicable):
* Desktop OS/version used to run Mod Organizer:
## Details:
+28 -20
View File
@@ -16,42 +16,46 @@ init:
environment:
WEBHOOK_URL:
secure: gOKbXaZM9ImtMD5XrYITvdyZUW/az082G9OIN1EC1VaKiI9iefpxhBavJ6Al6CzIZvQ+3pxnLqjmNgA7cDc22wcj2kB4hSG5qhbTI8wGa8jLQ5L65nuRZ3vrIqghBz9G3GLglgZkg6eqH9r3Kqc6UzcpCGzxxPOqm550nRcIiUU=
MO_VERSION: 2.3.0
VER_STUB_NORMAL: dev-appveyor
MO_VERSION: 2.4.0
VER_STUB_NORMAL: dev-appveyor-
VER_STUB_NIGHTLY: dev-nightly-
build_script:
- cmd: >-
REM Maintenance comments:
- pwsh: >-
# Maintenance comments:
REM APPVEYOR_BUILD_FOLDER= "c:\projects\modorganizer-slug"
# APPVEYOR_BUILD_FOLDER= "c:\projects\modorganizer-slug"
REM -Need to update py3 version used to invoke unimake.py once in a while.
# -Need to update py3 version used to invoke unimake.py once in a while.
REM -Need update MO_VERSION env variable after each release.
# -Need update MO_VERSION env variable after each release.
REM -Always clones umbrella master
# -Always clones umbrella master
REM -Will checkout all the branches matching the one that triggered the build on the main repo.
# -Will checkout all the branches matching the one that triggered the build on the main repo.
REM End comments.
# End comments.
$ErrorActionPreference = 'Stop'
git clone --depth=1 https://github.com/ModOrganizer2/modorganizer-umbrella.git c:\projects\modorganizer-umbrella 2> $null
mkdir %APPVEYOR_BUILD_FOLDER%\modorganizer-build -type directory
git clone --depth=1 --no-single-branch https://github.com/ModOrganizer2/modorganizer-umbrella.git c:\projects\modorganizer-umbrella
New-Item -ItemType Directory -Path ${env:APPVEYOR_BUILD_FOLDER}\modorganizer-build
cd c:\projects\modorganizer-umbrella
($env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH -eq $null) ? ($branch = $env:APPVEYOR_REPO_BRANCH) : ($branch = $env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH)
git checkout $(git show-ref --verify --quiet refs/remotes/origin/${branch} || echo '-b') ${branch}
C:\Python38-x64\python.exe unimake.py -d %APPVEYOR_BUILD_FOLDER%\modorganizer-build -s Appveyor_Build=True -s Feature_Branch=%APPVEYOR_REPO_BRANCH% -s override_build_version=%APPVEYOR_BUILD_VERSION%
C:\Python38-x64\python.exe unimake.py -d ${env:APPVEYOR_BUILD_FOLDER}\modorganizer-build -s Appveyor_Build=True -s Feature_Branch=${env:APPVEYOR_REPO_BRANCH} -s override_build_version=${env:APPVEYOR_BUILD_VERSION}
if($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode ) }
test: off
artifacts:
- path: '\modorganizer-build\install\bin'
- path: '\modorganizer-build\install\bin\ModOrganizer.exe'
name: Mod.Organizer-$(APPVEYOR_BUILD_VERSION)
- path: '\modorganizer-build\install\pdb'
name: PDBs-Mod.Organizer-$(APPVEYOR_BUILD_VERSION)
- path: '\modorganizer-build\install\pdb\ModOrganizer.pdb'
name: PDB-Mod.Organizer-$(APPVEYOR_BUILD_VERSION)
deploy: off
on_success:
- ps: >-
@@ -59,11 +63,15 @@ on_success:
Invoke-RestMethod https://raw.githubusercontent.com/DiscordHooks/appveyor-discord-webhook/master/send.ps1 -o send.ps1
./send.ps1 success $env:WEBHOOK_URL
if($env:APPVEYOR_SCHEDULED_BUILD -ne 'True'){
./send.ps1 success $env:WEBHOOK_URL
}
on_failure:
- ps: >-
Set-Location -Path $env:APPVEYOR_BUILD_FOLDER
Invoke-RestMethod https://raw.githubusercontent.com/DiscordHooks/appveyor-discord-webhook/master/send.ps1 -o send.ps1
./send.ps1 failure $env:WEBHOOK_URL
if($env:APPVEYOR_SCHEDULED_BUILD -ne 'True'){
./send.ps1 failure $env:WEBHOOK_URL
}
+1 -1
View File
@@ -1,2 +1,2 @@
pushd "%~dp0"
start ModOrganizer.exe --crashdump
start ModOrganizer.exe crashdump
+97
View File
@@ -8,5 +8,102 @@ file={m_wsFile}
loaded={m_loaded}
expanded={m_expanded}
}}</DisplayString></Type>
<Type Name="QFileInfoPrivate">
<DisplayString Condition="0 == this">&lt;null&gt;</DisplayString>
<DisplayString>{fileEntry}</DisplayString>
<StringView>fileEntry</StringView>
<Expand>
<Item Name="QSharedData">*((Qt5Core.dll!QSharedData *) this)</Item>
<Item Name="fileEntry">fileEntry</Item>
<!--
<Item Name="metaData">metaData</Item>
<Item Name="fileListsInitialized">fileListsInitialized</Item>
<Item Name="fileEngine">fileEngine</Item>
<Item Name="fileNames">fileNames</Item>
<Item Name="fileOwners">fileOwners</Item>
<Item Name="cachedFlags">cachedFlags</Item>
<Item Name="isDefaultConstructed">isDefaultConstructed</Item>
<Item Name="cache_enabled">cache_enabled</Item>
<Item Name="fileFlags">fileFlags</Item>
<Item Name="fileSize">fileSize</Item>
<Item Name="fileTimes">fileTimes</Item>
-->
</Expand>
</Type>
<Type Name="QFileInfo">
<DisplayString>{*((Qt5Core.dll!QFileInfoPrivate *) d_ptr.d)}</DisplayString>
<StringView>*((Qt5Core.dll!QFileInfoPrivate *) d_ptr.d)</StringView>
<Expand>
<Item Name="QFileInfoPrivate">*((Qt5Core.dll!QFileInfoPrivate *) d_ptr.d)</Item>
</Expand>
</Type>
<Type Name="QFileSystemEntry">
<DisplayString Condition="0 == this">&lt;null&gt;</DisplayString>
<DisplayString>{m_filePath}</DisplayString>
<StringView>m_filePath</StringView>
<!--
<Expand>
<Item Name="m_filePath">m_filePath</Item>
<Item Name="m_nativeFilePath">m_nativeFilePath</Item>
<Item Name="m_lastSeparator">m_lastSeparator</Item>
<Item Name="m_firstDotInFileName">m_firstDotInFileName</Item>
<Item Name="m_lastDotInFileName">m_lastDotInFileName</Item>
</Expand>
-->
</Type>
<Type Name="QDirPrivate">
<DisplayString Condition="0 == this">&lt;null&gt;</DisplayString>
<DisplayString>{dirEntry}</DisplayString>
<StringView>dirEntry</StringView>
<Expand>
<Item Name="QSharedData">*((Qt5Core.dll!QSharedData *) this)</Item>
<Item Name="dirEntry">dirEntry</Item>
<Item Name="nameFilters">nameFilters</Item>
<Item Name="absoluteDirEntry">absoluteDirEntry</Item>
<!--
<Item Name="metaData">metaData</Item>
<Item Name="fileListsInitialized">fileListsInitialized</Item>
<Item Name="fileEngine">fileEngine</Item>
<Item Name="files">files</Item>
<Item Name="fileInfos">fileInfos</Item>
<Item Name="sort">sort</Item>
<Item Name="filters">filters</Item>
-->
</Expand>
</Type>
<Type Name="QDir">
<DisplayString>{*((Qt5Core.dll!QDirPrivate *) d_ptr.d)}</DisplayString>
<StringView>*((Qt5Core.dll!QDirPrivate *) d_ptr.d)</StringView>
<Expand>
<Item Name="QDirPrivate">*((Qt5Core.dll!QDirPrivate *) d_ptr.d)</Item>
</Expand>
</Type>
<Type Name="QFilePrivate">
<DisplayString Condition="0 == this">&lt;null&gt;</DisplayString>
<DisplayString>{fileName}</DisplayString>
<StringView>fileName</StringView>
<Expand>
<Item Name="QFileDevice">*((Qt5Core.dll!QFileDevice *) this)</Item>
<Item Name="fileName">fileName</Item>
</Expand>
</Type>
<Type Name="QFile">
<DisplayString>{*((Qt5Core.dll!QFilePrivate *) d_ptr.d)}</DisplayString>
<StringView>*((Qt5Core.dll!QFilePrivate *) d_ptr.d)</StringView>
<Expand>
<Item Name="QFilePrivate">*((Qt5Core.dll!QFilePrivate *) d_ptr.d)</Item>
</Expand>
</Type>
</AutoVisualizer>
+11 -7
View File
@@ -12,17 +12,17 @@ The project took up speed again after a few more coders showed up in late 2017,
## 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)
To have more information, please join the open MO2 Development discord server: [Mod Organizer 2](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.
To setup a development environment on your machine, there is the [mob project](https://github.com/modorganizer2/mob) that handles that.
If you want to submit your code changes, please use a good formatting 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.
Issues should be reported to the GitHub page or on the open discord server: [Mod Organizer 2](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, LostDragonist, AnyOldName3 and many others for the development.
Credits to Tannin, LePresidente, Silarn, erasmux, AL12, LostDragonist, AnyOldName3, isa, Holt59 and many others for the development.
## Download Location
@@ -35,11 +35,11 @@ Credits to Tannin, LePresidente, Silarn, erasmux, AL12, LostDragonist, AnyOldNam
## Building
Please refer to [Modorganizer2/modorganizer-umbrella](https://github.com/Modorganizer2/modorganizer-umbrella) for build instructions.
Please refer to [Modorganizer2/mob](https://github.com/modorganizer2/mob) for build instructions.
## Other Repositories
MO2 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 mob project will download them automatically as required. They should however also be buildable individually.
Here is a complete list:
* https://github.com/LePresidente/cpython-1
@@ -47,6 +47,7 @@ Here is a complete list:
* https://github.com/ModOrganizer2/githubpp
* https://github.com/ModOrganizer2/modorganizer
* https://github.com/ModOrganizer2/modorganizer-archive
* https://github.com/ModOrganizer2/modorganizer-basic_games
* https://github.com/ModOrganizer2/modorganizer-bsatk
* https://github.com/ModOrganizer2/modorganizer-bsa_extractor
* https://github.com/ModOrganizer2/modorganizer-check_fnis
@@ -68,10 +69,13 @@ Here is a complete list:
* https://github.com/ModOrganizer2/modorganizer-game_skyrimVR
* https://github.com/ModOrganizer2/modorganizer-game_ttw
* https://github.com/ModOrganizer2/modorganizer-installer_bain
* https://github.com/ModOrganizer2/modorganizer-installer_wizard
* https://github.com/ModOrganizer2/modorganizer-installer_bundle
* https://github.com/ModOrganizer2/modorganizer-installer_fomod
* https://github.com/ModOrganizer2/modorganizer-installer_fomod_csharp
* https://github.com/ModOrganizer2/modorganizer-installer_manual
* https://github.com/ModOrganizer2/modorganizer-installer_ncc
* https://github.com/ModOrganizer2/modorganizer-installer_omod
* https://github.com/ModOrganizer2/modorganizer-installer_quick
* https://github.com/ModOrganizer2/modorganizer-lootcli
* https://github.com/ModOrganizer2/modorganizer-NCC
+52 -20
View File
@@ -11,12 +11,14 @@ endif()
add_filter(NAME src/application GROUPS
iuserinterface
commandline
main
moapplication
moshortcut
multiprocess
sanitychecks
selfupdater
singleinstance
updatedialog
)
add_filter(NAME src/browser GROUPS
@@ -28,12 +30,10 @@ add_filter(NAME src/core GROUPS
categories
archivefiletree
installationmanager
instancemanager
loadmechanism
nexusinterface
nxmaccessmanager
organizercore
organizerproxy
plugincontainer
apiuseraccount
processrunner
qdirfiletree
@@ -63,13 +63,13 @@ add_filter(NAME src/dialogs GROUPS
add_filter(NAME src/downloads GROUPS
downloadlist
downloadlistsortproxy
downloadlistwidget
downloadlistview
downloadmanager
)
add_filter(NAME src/env GROUPS
env
envdump
envfs
envmetrics
envmodule
@@ -84,6 +84,13 @@ add_filter(NAME src/executables GROUPS
editexecutablesdialog
)
add_filter(NAME src/instances GROUPS
createinstancedialog
createinstancedialogpages
instancemanager
instancemanagerdialog
)
add_filter(NAME src/loot GROUPS
loot
lootdialog
@@ -91,12 +98,13 @@ add_filter(NAME src/loot GROUPS
add_filter(NAME src/mainwindow GROUPS
datatab
downloadstab
iconfetcher
filetree
filetreeitem
filetreemodel
filterlist
mainwindow
savestab
statusbar
)
@@ -123,17 +131,34 @@ add_filter(NAME src/modinfo/dialog GROUPS
modinfodialogtab
modinfodialogtextfiles
)
add_filter(NAME src/modinfo/dialog/widgets GROUPS
modidlineedit
)
add_filter(NAME src/modlist GROUPS
modlist
modlistdropinfo
modlistsortproxy
modlistbypriorityproxy
)
add_filter(NAME src/modlist/view GROUPS
filterlist
modlistview
modlistviewactions
modlistcontextmenu
modflagicondelegate
modcontenticondelegate
modconflicticondelegate
modlistversiondelegate
)
add_filter(NAME src/plugins GROUPS
plugincontainer
pluginlist
pluginlistsortproxy
pluginlistview
pluginlistcontextmenu
)
add_filter(NAME src/previews GROUPS
@@ -147,6 +172,14 @@ add_filter(NAME src/profiles GROUPS
profilesdialog
)
add_filter(NAME src/proxies GROUPS
downloadmanagerproxy
modlistproxy
organizerproxy
pluginlistproxy
proxyutils
)
add_filter(NAME src/register GROUPS
shared/directoryentry
shared/fileentry
@@ -169,25 +202,25 @@ add_filter(NAME src/settingsdialog GROUPS
settingsdialognexus
settingsdialogpaths
settingsdialogplugins
settingsdialogsteam
settingsdialogworkarounds
settingsdialogmodlist
settingsdialogtheme
disableproxyplugindialog
)
add_filter(NAME src/utilities GROUPS
shared/appconfig
bbcode
csvbuilder
shared/error_report
shared/leaktrace
persistentcookiejar
serverinfo
spawn
shared/stackdata
shared/util
usvfsconnector
shared/windows_error
thread_utils
json
glob_matching
)
add_filter(NAME src/widgets GROUPS
@@ -198,13 +231,12 @@ add_filter(NAME src/widgets GROUPS
lcdnumber
loglist
loghighlighter
modflagicondelegate
modconflicticondelegate
modidlineedit
noeditdelegate
qtgroupingproxy
texteditor
viewmarkingscrollbar
modelutils
copyeventfilter
)
@@ -215,17 +247,17 @@ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.qt5
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.qt5"
DESTINATION bin/dlls
RENAME dlls.manifest)
install(FILES ${qm_files} DESTINATION bin/translations)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/stylesheets
${CMAKE_CURRENT_SOURCE_DIR}/tutorials
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/stylesheets"
"${CMAKE_CURRENT_SOURCE_DIR}/tutorials"
DESTINATION bin)
deploy_qt(BINARIES ModOrganizer.exe uibase.dll plugins/bsa_packer.dll)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../qdds.dll DESTINATION bin/dlls/imageformats)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/markdown.html DESTINATION bin/resources)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../qdds.dll" DESTINATION bin/dlls/imageformats)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/resources/markdown.html" DESTINATION bin/resources)
+1 -1
View File
@@ -120,5 +120,5 @@ void AboutDialog::on_creditsList_currentItemChanged(QListWidgetItem *current, QL
void AboutDialog::on_sourceText_linkActivated(const QString &link)
{
emit linkClicked(link);
MOBase::shell::Open(QUrl(link));
}
-4
View File
@@ -40,10 +40,6 @@ public:
explicit AboutDialog(const QString &version, QWidget *parent = 0);
~AboutDialog();
signals:
void linkClicked(QString link);
private:
enum Licenses {
+48 -18
View File
@@ -220,6 +220,11 @@
<string notr="true">isa</string>
</property>
</item>
<item>
<property name="text">
<string>Holt59</string>
</property>
</item>
</widget>
</item>
</layout>
@@ -256,11 +261,6 @@
<string notr="true">przester</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Holt59</string>
</property>
</item>
</widget>
</item>
</layout>
@@ -429,6 +429,11 @@
<string>Tannin (Original Creator)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">6788</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">blacksol</string>
@@ -436,17 +441,7 @@
</item>
<item>
<property name="text">
<string notr="true">DoubleYou</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Drew Warwick</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">deathneko11</string>
<string notr="true">BlueAmulet</string>
</property>
</item>
<item>
@@ -459,6 +454,21 @@
<string notr="true">Brixified</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">deathneko11</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">DoubleYou</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Drew Warwick</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">GamerPoet</string>
@@ -479,6 +489,11 @@
<string notr="true">GSDFan</string>
</property>
</item>
<item>
<property name="text">
<string>Luca|EzioTheDeadPoet</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">ogrotten</string>
@@ -489,11 +504,21 @@
<string notr="true">outdatedtv</string>
</property>
</item>
<item>
<property name="text">
<string>Patchier</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">PurpleFez</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Qudix</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">reedts</string>
@@ -509,6 +534,11 @@
<string notr="true">SuperSandro2000</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Trosski</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Uhuru</string>
@@ -521,12 +551,12 @@
</item>
<item>
<property name="text">
<string notr="true">z929669</string>
<string notr="true">thosrtanner</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">thosrtanner</string>
<string notr="true">z929669</string>
</property>
</item>
</widget>
+16 -2
View File
@@ -282,9 +282,23 @@ bool CategoryFactory::categoryExists(int id) const
}
bool CategoryFactory::isDecendantOf(int id, int parentID) const
bool CategoryFactory::isDescendantOf(int id, int parentID) const
{
// handles cycles
std::set<int> seen;
return isDescendantOfImpl(id, parentID, seen);
}
bool CategoryFactory::isDescendantOfImpl(
int id, int parentID, std::set<int>& seen) const
{
if (!seen.insert(id).second) {
log::error("cycle in category: {}", id);
return false;
}
std::map<int, unsigned int>::const_iterator iter = m_IDMap.find(id);
if (iter != m_IDMap.end()) {
unsigned int index = iter->second;
if (m_Categories[index].m_ParentID == 0) {
@@ -292,7 +306,7 @@ bool CategoryFactory::isDecendantOf(int id, int parentID) const
} else if (m_Categories[index].m_ParentID == parentID) {
return true;
} else {
return isDecendantOf(m_Categories[index].m_ParentID, parentID);
return isDescendantOfImpl(m_Categories[index].m_ParentID, parentID, seen);
}
} else {
log::warn("{} is no valid category id", id);
+3 -2
View File
@@ -124,7 +124,7 @@ public:
* @param parentID the parent id to test for
* @return true if id is a child of parentID
**/
bool isDecendantOf(int id, int parentID) const;
bool isDescendantOf(int id, int parentID) const;
/**
* @brief test if the specified category has child categories
@@ -209,7 +209,8 @@ private:
std::map<int, unsigned int> m_NexusMap;
private:
// called by isDescendantOf()
bool isDescendantOfImpl(int id, int parentID, std::set<int>& seen) const;
};
+931
View File
File diff suppressed because it is too large Load Diff
+379
View File
@@ -0,0 +1,379 @@
#ifndef MODORGANIZER_COMMANDLINE_INCLUDED
#define MODORGANIZER_COMMANDLINE_INCLUDED
#include "moshortcut.h"
#include <vector>
#include <memory>
class OrganizerCore;
class MOApplication;
class MOMultiProcess;
namespace cl
{
namespace po = boost::program_options;
// base class for all commands
//
class Command
{
public:
virtual ~Command() = default;
// command name, used on the command line to invoke it; this is meta().name
//
std::string name() const;
// command short description, shown in general help; this is
// meta().description
//
std::string description() const;
// usage line, puts together the name and whatever meta().usage is
//
std::string usageLine() const;
// shown after the usage line; this is meta().more
//
std::string moreInfo() const;
// returns all options for this command, including hidden ones; used to parse
// the command line
//
po::options_description allOptions() const;
// returns visible options, used to display usage
//
po::options_description visibleOptions() const;
// returns positional arguments
//
po::positional_options_description positional() const;
// when this returns true, the command line is not parsed at all and doRun()
// is expected to use untouched()
//
virtual bool legacy() const;
// remembers the given values
//
void set(
const std::wstring& originalLine,
po::variables_map vm,
std::vector<std::wstring> untouched);
// called as soon as the command line has been parsed; return something to
// exit immediately
//
virtual std::optional<int> runEarly();
// called as soon as the MOApplication has been created, which is also the
// first time where Qt stuff is available
//
virtual std::optional<int> runPostApplication(MOApplication& a);
// called as soon as the multi process checks have confirmed that this is
// a primary instance; return something to exit immediately
//
virtual std::optional<int> runPostMultiProcess(MOMultiProcess& mp);
// called after the OrganizerCore has been initialized; return something to
// exit immediatley
//
virtual std::optional<int> runPostOrganizer(OrganizerCore& core);
// whether this command can be forwarded to the primary instance if one is
// already running
//
// if an instance is already running and this returns true, the whole command
// line is sent as a message to the primary instance, which will construct a
// new CommandLine and call runPostOrganizer() with it
//
// if an instance is already running and this returns false, the "an instance
// is already running" error dialog will be shown
//
// if this is the primary instance, this function is not called
//
virtual bool canForwardToPrimary() const;
protected:
// meta information about this command, returned by derived classes
//
struct Meta
{
std::string name, description, usage, more;
Meta(
std::string name, std::string description,
std::string usage, std::string more);
};
// meta
//
virtual Meta meta() const = 0;
// returns visible options specific to this command
//
virtual po::options_description getVisibleOptions() const;
// returns hidden options specific to this command
//
virtual po::options_description getInternalOptions() const;
// returns positional arguments specific to this command
//
virtual po::positional_options_description getPositional() const;
// returns the original command line
//
const std::wstring& originalCmd() const;
// variables
//
const po::variables_map& vm() const;
// returns unparsed options, only used by launch
//
const std::vector<std::wstring>& untouched() const;
private:
std::wstring m_original;
po::variables_map m_vm;
std::vector<std::wstring> m_untouched;
};
// generates a crash dump for another MO process
//
class CrashDumpCommand : public Command
{
protected:
po::options_description getVisibleOptions() const override;
Meta meta() const override;
std::optional<int> runEarly() override;
};
// this is the `launch` command used when starting a process from within the
// virtualized directory, see processrunner.cpp
//
// it has its own parsing of the command line to extract the argument after
// `launch` and use it as the cwd of the process, but pass the remaining
// arguments verbatim
//
// this is very old code that should probably never be changed
//
// note that it's actually buggy; in particular, it doesn't handle multiple
// whitespace between arguments
//
class LaunchCommand : public Command
{
public:
bool legacy() const override;
protected:
Meta meta() const override;
std::optional<int> runEarly() override;
int SpawnWaitProcess(LPCWSTR workingDirectory, LPCWSTR commandLine);
LPCWSTR UntouchedCommandLineArguments(
int parseArgCount, std::vector<std::wstring>& parsedArgs);
};
// runs a program or an executable
//
class RunCommand : public Command
{
protected:
Meta meta() const override;
po::options_description getVisibleOptions() const override;
po::options_description getInternalOptions() const override;
po::positional_options_description getPositional() const override;
bool canForwardToPrimary() const override;
std::optional<int> runPostOrganizer(OrganizerCore& core) override;
};
// reloads the given plugin
//
class ReloadPluginCommand : public Command
{
protected:
Meta meta() const override;
po::options_description getInternalOptions() const override;
po::positional_options_description getPositional() const override;
bool canForwardToPrimary() const override;
std::optional<int> runPostOrganizer(OrganizerCore& core) override;
};
// refreshes mo
//
class RefreshCommand : public Command
{
protected:
Meta meta() const override;
bool canForwardToPrimary() const override;
std::optional<int> runPostOrganizer(OrganizerCore& core) override;
};
// parses the command line and runs any given command
//
// the command line used to support a few commands but with no real conventions;
// those are mostly preserved for backwards compatibility, but deprecated:
//
// - moshortcut:// for desktop/taskbar shortcuts, may contain an instance name
// and a configured executable or arbitrary binary (still used in MO for
// shortcuts)
//
// - nxm:// links
//
// - the name of a configured executable or path to binary, followed by
// arbitrary parameters, forwarded to the program
//
// any command added CommandLine will unfortunately break any executable with
// the same name: `ModOrganizer.exe run` used to launch a program named "run"
// but will now execute the command "run"
//
// if moshortcut:// is detected and has an instance, it will override -i if both
// are given
//
//
// the command is used in two phases:
//
// 1) run() is called in main() shortly after startup; it parses the command
// line and runs the given command, if any
//
// 2) if the command did not request to exit, the instance is loaded
// in main() et al. and setupCore() is called; it handles moshortcut,
// nxm links and starting executables/binaries
//
// either can return an exit code, which will make MO exit immediately
//
class CommandLine
{
public:
CommandLine();
// parses the given command line and calls runEarly() on the appropriate
// command, if any
//
// returns an empty optional if execution should continue, or a return code
// if MO must quit
//
std::optional<int> process(const std::wstring& line);
// called as soon as the MOApplication has been created; this handles a few
// global actions and forwards to the command, if any
//
std::optional<int> runPostApplication(MOApplication& a);
// calls Command::runPostMultiProcess() on the command, if any
//
std::optional<int> runPostMultiProcess(MOMultiProcess& mp);
// calls Command::runPostOrganizer() on the command, if any
//
// if MO wasn't invoked with a valid command, this also handles moshortcut,
// nxm links and starting processes
//
std::optional<int> runPostOrganizer(OrganizerCore& core);
// called when this instance is not the primary one
//
// if a command was executed and the command returns true for
// canForwardToPrimary(), this forwards the command line as an external
// message and returns true
//
// if the command returns false for canForwardToPrimary(), returns false
//
// if there was no valid command on the command line, this also forwards
// moshortcut and nxm links
//
// if there was no command, moshortcut or nxm links, this returns false, which
// will end up displaying an error message about an instance already running
//
bool forwardToPrimary(MOMultiProcess& multiProcess);
// clears parsed options, used when MO is "restarted" so the options aren't
// processed again
//
void clear();
// global usage string plus usage for the given command, if any
//
std::string usage(const Command* c=nullptr) const;
// whether --pick was given
//
bool pick() const;
// whether --multiple was given
//
bool multiple() const;
// profile override (-p)
//
std::optional<QString> profile() const;
// instance override (-i)
//
std::optional<QString> instance() const;
// returns the data parsed from an moshortcut:// option, if any
//
const MOShortcut& shortcut() const;
// returns the nxm:// link, if any
//
std::optional<QString> nxmLink() const;
// returns the executable/binary, if any
//
std::optional<QString> executable() const;
// returns the list of arguments, excluding moshortcut or executable name;
// deprecated, only use with executable()
//
const QStringList& untouched() const;
private:
po::options_description m_visibleOptions, m_allOptions;
po::positional_options_description m_positional;
std::vector<std::unique_ptr<Command>> m_commands;
po::variables_map m_vm;
MOShortcut m_shortcut;
std::optional<QString> m_nxmLink;
std::optional<QString> m_executable;
QStringList m_untouched;
Command* m_command;
void createOptions();
std::string more() const;
template <class... Ts>
void add()
{
(m_commands.push_back(std::make_unique<Ts>()), ...);
}
std::optional<int> runEarly();
};
} // namespace
#endif // MODORGANIZER_COMMANDLINE_INCLUDED
+51
View File
@@ -0,0 +1,51 @@
#include "copyeventfilter.h"
#include <QClipboard>
#include <QGuiApplication>
#include <QKeyEvent>
CopyEventFilter::CopyEventFilter(QAbstractItemView* view, int column, int role) :
CopyEventFilter(view, [=](auto& index) { return index.sibling(index.row(), column).data(role).toString(); })
{
}
CopyEventFilter::CopyEventFilter(
QAbstractItemView* view, std::function<QString(const QModelIndex&)> format) :
QObject(view), m_view(view), m_format(format)
{
}
void CopyEventFilter::copySelection() const
{
if (!m_view->selectionModel()->hasSelection()) {
return;
}
// sort to reflect the visual order
QModelIndexList selectedRows = m_view->selectionModel()->selectedRows();
std::sort(selectedRows.begin(), selectedRows.end(), [=](const auto& lidx, const auto& ridx) {
return m_view->visualRect(lidx).top() < m_view->visualRect(ridx).top();
});
QStringList rows;
for (auto& idx : selectedRows) {
rows.append(m_format(idx));
}
QGuiApplication::clipboard()->setText(rows.join("\n"));
}
bool CopyEventFilter::eventFilter(QObject* sender, QEvent* event)
{
if (sender == m_view && event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->modifiers() == Qt::ControlModifier
&& keyEvent->key() == Qt::Key_C) {
copySelection();
return true;
}
}
return QObject::eventFilter(sender, event);
}
+43
View File
@@ -0,0 +1,43 @@
#ifndef COPY_EVENT_FILTER_H
#define COPY_EVENT_FILTER_H
#include <functional>
#include <QAbstractItemView>
#include <QModelIndex>
#include <QObject>
// this small class provides copy on Ctrl+C and also
// exposes a method to actual copy the selection
//
// the way the selection is copied can be customized by
// passing a functor to format each index, by default
// it only extracts the display role
//
// only works for view that selects whole row since it only
// considers the first cell in each row
//
class CopyEventFilter : public QObject
{
Q_OBJECT
public:
CopyEventFilter(QAbstractItemView* view, int column = 0, int role = Qt::DisplayRole);
CopyEventFilter(QAbstractItemView* view, std::function<QString(const QModelIndex&)> format);
// copy the selection of the view associated with this
// event filter into the clipboard
//
void copySelection() const;
bool eventFilter(QObject* sender, QEvent* event) override;
private:
QAbstractItemView* m_view;
std::function<QString(const QModelIndex&)> m_format;
};
#endif
File diff suppressed because it is too large Load Diff
+222
View File
@@ -0,0 +1,222 @@
#ifndef MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
#define MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
#include <QDialog>
namespace MOBase { class IPluginGame; }
namespace Ui { class CreateInstanceDialog; };
namespace cid { class Page; }
class PluginContainer;
class Settings;
// this is a wizard for creating a new instance, it is made out of Page objects,
// see createinstancedialogpages.h
//
// each page can give back one or more pieces of information that is collected
// in creationInfo() and used by finish() to do the actual creation
//
// pages can be disabled if they return true in skip(), which happens globally
// for some (IntroPage has a setting in the registry), depending on context
// (NexusPage is skipped if the API key already exists) or explicitly (when
// only some info about the instance is missing on startup, such as a game
// variant)
//
class CreateInstanceDialog : public QDialog
{
Q_OBJECT
public:
enum class Actions
{
Find = 1
};
// instance type
//
enum Types
{
NoType = 0,
Global,
Portable
};
// all the paths required by the instance, some may be empty, such as
// basically all of them except for `base` when the user doesn't use the
// "Advanced" part of the paths page
//
struct Paths
{
QString base;
QString downloads;
QString mods;
QString profiles;
QString overwrite;
QString ini;
auto operator<=>(const Paths&) const = default;
};
// all the info filled in the various pages
//
struct CreationInfo
{
Types type;
MOBase::IPluginGame* game;
QString gameLocation;
QString gameVariant;
QString instanceName;
QString dataPath;
QString iniPath;
Paths paths;
};
CreateInstanceDialog(
const PluginContainer& pc, Settings* s, QWidget *parent = nullptr);
~CreateInstanceDialog();
Ui::CreateInstanceDialog* getUI();
const PluginContainer& pluginContainer();
Settings* settings();
// disables all the pages except for the given one, used on startup when some
// specific info is missing
template <class Page>
void setSinglePage(const QString& instanceName)
{
for (auto&& p : m_pages) {
if (auto* tp=dynamic_cast<Page*>(p.get())) {
tp->setSkip(false);
} else {
p->setSkip(true);
}
}
setSinglePageImpl(instanceName);
}
// returns the page having the give path, or null
//
template <class Page>
Page* getPage()
{
for (auto&& p : m_pages) {
if (auto* tp=dynamic_cast<Page*>(p.get())) {
return tp;
}
}
return nullptr;
}
// moves to the next page; if `allowFinish` is true, calls finish() if
// currently on the last page
//
void next(bool allowFinish=true);
// moves to the previous page, if any
//
void back();
// whether the current page reports that it is ready; if this is the last
// page, next() would call finish()
//
bool canNext() const;
// whether the current page is not the first one and there is an enabled page
// prior
//
bool canBack() const;
// selects the given page by index; this doesn't check if the page should be
// skipped
//
void selectPage(std::size_t i);
// moves by `d` pages, can be negative to move back
//
void changePage(int d);
// creates the instance and closes the dialog
//
void finish();
// updates the navigation buttons based on the current page
//
void updateNavigation();
// whether this is the last enabled page
//
bool isOnLastPage() const;
// returns whether the user has requested to switch to the new instance
//
bool switching() const;
// gathers the info from all the pages as it appears, paths are not fixed;
// see creationInfo()
//
CreationInfo rawCreationInfo() const;
// gathers the info from all the pages: paths are converted to absolute and
// the base dir variable is expanded everywhere; see rawCreationInfo()
//
CreationInfo creationInfo() const;
private:
std::unique_ptr<Ui::CreateInstanceDialog> ui;
const PluginContainer& m_pc;
Settings* m_settings;
std::vector<std::unique_ptr<cid::Page>> m_pages;
QString m_originalNext;
bool m_switching;
bool m_singlePage;
// creates a shortcut for the given sequence
//
void addShortcut(QKeySequence seq, std::function<void ()> f);
// creates a shortcut for the given sequence and executes the action when
// activated
//
void addShortcutAction(QKeySequence seq, Actions a);
// calls action() with the given action on the selected page, if any
//
void doAction(Actions a);
// called from setSinglePage(), does whatever doesn't need the T
//
void setSinglePageImpl(const QString& instanceName);
// adds a line to the creation log
//
void logCreation(const QString& s);
void logCreation(const std::wstring& s);
// calls the given member function on all pages until one returns an object
// that's not empty; used by gatherInfo()
//
template <class MF, class... Args>
auto getSelected(MF mf, Args&&... args) const
{
// return type
using T = decltype((std::declval<cid::Page>().*mf)(std::forward<Args>(args)...));
for (auto&& p : m_pages) {
const auto t = (p.get()->*mf)(std::forward<Args>(args)...);
if (t != T()) {
return t;
}
}
return T();
}
};
#endif // MODORGANIZER_CREATEINSTANCEDIALOG_INCLUDED
File diff suppressed because it is too large Load Diff
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