Compare commits

...
406 Commits
Author SHA1 Message Date
isanae b9f9e6af94 Merge pull request #1178 from isanae/2_3_0
Merge 2.3.1 changes
2020-08-01 11:33:35 -04:00
isanae b9078ffefd bump to 2.3.1 2020-08-01 11:29:09 -04:00
isanae 04c5986aa6 added startSafeThread() to get core dumps for threads other than the main thread
added terminate handler
2020-08-01 11:29:09 -04:00
isanae 1cb18b3c00 fixed warning when trying to get the file type of files without extensions 2020-08-01 11:29:09 -04:00
isanae e34a9e7315 Merge pull request #1172 from isanae/remove-prerelease
Chang release type to 0
2020-07-28 20:15:42 -04:00
isanae 4d546ea262 changed release type to 0 2020-07-28 20:15:12 -04:00
isanae 2ca7c1c9ea Merge pull request #1171 from isanae/bump-2.3
Bump to 2.3
2020-07-28 18:35:38 -04:00
isanae 4b0ba5c579 bumped to 2.3 2020-07-28 18:33:55 -04:00
isanae 7a10a74766 Merge pull request #1162 from isanae/bump-2.3rc2
Bump to 2.3rc2
2020-07-21 19:08:56 -04:00
isanae 7db0841a22 bumped to 2.3rc2
updated translations
2020-07-21 19:07:26 -04:00
isanae 2c082d6a3b Merge pull request #1161 from isanae/2.3rc2-fixes
2.3rc2 fixes (wip)
2020-07-21 18:13:42 -04:00
isanae a965a9dc41 added confirmation for sorting, some users click it by mistake 2020-07-20 20:05:15 -04:00
isanae 82cc488a18 conflict model didn't change persistent indexes when sorting 2020-07-20 20:01:46 -04:00
isanae 4adfeac9b7 shift+ and ctrl+double-click in mod list will now only open one mod instead of the whole selection
since these modifiers are also used for selecting, this is too error prone and users have reported opening a crapload of tabs in their browser or explorer windows
2020-07-20 19:26:33 -04:00
isanae c7a90f9506 added turkish translator 2020-07-20 19:09:12 -04:00
isanae 80645bacc1 Merge pull request #1160 from isanae/filetree-bugs
Filetree bugs and improvements
2020-07-20 19:07:58 -04:00
isanae 0c7265be4f only sort once at the end when fully loading for search
temporarily disable filtering completely when fully loading instead of just disabling recursive filtering, this could close already expanded nodes if their parent directories didn't match
2020-07-20 19:02:14 -04:00
isanae 6c4e237d4b fixed crash because items were sorted while being expanded
when expanding all or updating the tree, only sort once at the end
cache file types
2020-07-19 16:48:31 -04:00
isanae d32250597a Merge pull request #1154 from isanae/bump-2.3rc1
Bump to 2.3 rc1
2020-07-14 14:52:29 -04:00
isanae bd113a9502 bumped to 2.3 rc1 2020-07-14 14:50:56 -04:00
isanae 4fc61c7cd4 Merge pull request #1152 from isanae/small-fixes
Small fixes
2020-07-10 15:55:13 -04:00
isanae 315776799f don't translate new names 2020-07-10 15:51:06 -04:00
isanae 287e285afa added a bunch more osd checks
added warnings for paths in documents and downloads
2020-07-10 15:47:44 -04:00
isanae 285d0bfc79 loot exit code in hex 2020-07-10 15:33:00 -04:00
isanae 55451956c4 added VT_UI1 for productState 2020-07-10 15:31:08 -04:00
isanae cf01fa955c resize data tab columns when migrating from < 2.3 so the new columns are visible 2020-07-10 15:20:01 -04:00
isanae e0db7177b4 added hidden validation_timeouts setting 2020-07-10 15:04:54 -04:00
isanae 97dd16a87a don't log old nexus username and password
they're not supposed to be in the INI anymore, but the migration code looks broken and some users still have them
2020-07-10 14:54:02 -04:00
isanae b0fb203742 typo 2020-07-10 14:50:56 -04:00
isanae a2c630af24 added names to the about dialog 2020-07-10 14:50:46 -04:00
isanae 69b86b206b Merge pull request #1151 from isanae/data-tab-filter-slow
Slow search in data tab
2020-07-10 14:03:37 -04:00
isanae 16c7cc5605 fixed ensureFullyLoaded() taking forever because it was queuing all the sorts unnecessarily 2020-07-10 13:58:58 -04:00
isanae c8e1d62af0 Merge pull request #1150 from isanae/ts
updated translations
2020-07-10 12:21:44 -04:00
isanae 4a18791c2e updated translations 2020-07-10 12:12:31 -04:00
AL 732be7d38d Show .toml files in the "Text Files" modInfoDialog tab. 2020-06-24 15:52:20 +02:00
AL e4372b4570 Add a dash between the managed game and "Mod Organizer" to distinguish app name. 2020-06-24 15:50:55 +02:00
isanae 4ae95e21ad Merge pull request #1135 from Holt59/new-iorganizer-callbacks
Update for new organizer callbacks.
2020-06-16 15:39:59 -04:00
Mikaël Capelle 8c410aff33 Clean notification of userInterfaceInitialized between MainWindow and OrganizerCore. 2020-06-16 21:30:24 +02:00
Al 7d553557a6 Update issue-report.md 2020-06-16 15:20:15 +02:00
Al 72a992da68 Update issue-report.md 2020-06-16 15:19:49 +02:00
Mikaël Capelle 331fcad9f3 Remove unecessary default constructor call. 2020-06-16 12:47:50 +02:00
Mikaël Capelle f8bb349b3e Move userInterfaceInitialized notification at the end of the first show event. 2020-06-16 12:47:36 +02:00
Mikaël Capelle f66cf4ad99 Update for new organizer callbacks. 2020-06-15 22:47:21 +02:00
Al 4b92ba40be Merge pull request #1132 from Holt59/fix-getloadorder
Update following change to getLoadOrder() in game_features.
2020-06-14 15:59:35 -07:00
Mikaël Capelle eb1ca18ed8 Update following change to getLoadOrder() in game_features. 2020-06-14 15:33:16 +02:00
Al 92639dae7a Merge pull request #1131 from Holt59/allow-plugins-to-fix-filetree
Update following ModDataChecker change.
2020-06-14 05:48:49 -07:00
Mikaël Capelle 0ad3bbbdfa Update following ModDataChecker change. 2020-06-13 23:48:52 +02:00
AL 517749901d Version bump 2020-06-13 21:37:35 +02:00
Al 4606162eb4 Merge pull request #1127 from Holt59/fix-crash-archive-extraction
Fix archive extraction due to infinite QProgressDialog::setValue recursion
2020-06-12 10:59:08 -07:00
Al 628b56144d Merge pull request #1124 from Holt59/fix-unloading-of-plugins
Manually unload plugins to avoid issue with automatic unloading.
2020-06-11 11:54:07 -07:00
Mikaël Capelle a64ff3c7bb Add Qt bug report in comment and use while() instead of do { } while();. 2020-06-11 20:25:22 +02:00
Mikaël Capelle a769bc0061 Add comment explaining the usage of the QEventLoop. 2020-06-11 20:12:39 +02:00
Mikaël Capelle 93b1cea0d3 Rollback to using QProcessEvents but use WaitForMoreEvents. 2020-06-11 20:09:00 +02:00
Mikaël Capelle 26c7cd4f22 Disconnect signal after extraction to avoid calling them on destroyed widgets. 2020-06-11 18:33:44 +02:00
Al 297cb8320f Merge pull request #1123 from Holt59/fix-right-tabs-refresh
Fix refresh events of tabs in the right panel when some tabs are hidden.
2020-06-11 04:29:23 -07:00
Mikaël Capelle 5d0b6b0eab Manually unload plugins to avoid issue with automatic unloading. 2020-06-11 13:23:03 +02:00
Mikaël Capelle bb2dc9bd01 Avoid using indexOf everywhere. 2020-06-11 12:55:59 +02:00
Mikaël Capelle d0d795d12d Fix refresh events of tabs in the right panel when some tabs are hidden. 2020-06-11 12:46:09 +02:00
AL 2285ed32af Version bump to 2.3.0alpha10 2020-06-10 15:41:23 +02:00
Al 054af144fc Merge pull request #1120 from Holt59/hide-unused-tabs
Hide plugins and archives tabs when features are missing.
2020-06-09 13:16:42 -07:00
Mikaël Capelle af723f4297 Hide plugins and archives tabs when features are missing. 2020-06-09 22:08:03 +02:00
Al da66cb4917 Merge pull request #1118 from Al12rs/nexus_requests_leak
Fix consecutive mod update checks checking some mods again
2020-06-09 07:34:45 -07:00
AL a565472b82 Mark mods with orphaned nexus ids as checked to avoid repeated requests. 2020-06-09 15:54:36 +02:00
AL d164c17958 Fix consecutive mod update checks checking some mods again..
by correctly setting the last nexus update timestamp on a missed case.
2020-06-09 15:53:26 +02:00
Al b548fd37e4 Merge pull request #1117 from Holt59/iinstallmanager-silent-extraction
Add silent parameter to extraction methods of IInstallationManager.
2020-06-09 05:52:48 -07:00
Mikaël Capelle dfdf396149 Add silent parameter to extraction methods of IInstallationManager. 2020-06-09 13:43:02 +02:00
Al e13ca4bead Merge pull request #1115 from Al12rs/fix_problems_button
Fix problems button not updating on startup in some cases.
2020-06-08 14:37:31 -07:00
AL 210cd42395 Fix problems button not updating on startup in some cases.
Mainwindow wasn't guaranteed to exist after first directory structure refresh was complete so there was no mainwindow slot triggered to check for problems.
Added a proper problems check in the mainwindow constructor.
2020-06-08 23:26:02 +02:00
Al 29893868dc Merge pull request #1114 from Holt59/iorganizer-findfiles-glob
Add findFiles overload with glob patterns.
2020-06-08 12:04:54 -07:00
Mikaël Capelle 1aedff5c60 Add documentation for the support globbing features. 2020-06-08 20:53:05 +02:00
Mikaël Capelle 0d873719eb Replace QString::fromStdWString by ToQString. 2020-06-08 20:51:11 +02:00
Mikaël Capelle 56f6e5504b Fix & placement. 2020-06-08 20:34:32 +02:00
Mikaël Capelle 13d79f3cbe Add findFiles overload with glob patterns. 2020-06-08 18:37:05 +02:00
Al 4e0d47868a Merge pull request #1113 from Al12rs/bettr_wait_on_events
Use QEventLoop instead of manually calling ProcessEvents
2020-06-08 06:58:16 -07:00
AL 67ae37d614 Use QEventLoop instead of manually spinning calling ProcessEvents in a while with a sleep. 2020-06-07 22:01:30 +02:00
Al ec5a78cefa Merge pull request #1112 from Al12rs/updateProblemsButton
Move Problems Checks on a thread and avoid redundant calls
2020-06-07 12:21:41 -07:00
AL 6d7c086685 Change time measurement to not include lock wait time. 2020-06-07 21:06:33 +02:00
AL d845fe9a74 Make checks that occur at the same time not return immediately to avoid issues with stuff that might need to rely on check completion. 2020-06-07 18:51:02 +02:00
AL d1c42e69c1 Make even the last direct call to checkForProblemsImpl use the async version. 2020-06-07 17:44:06 +02:00
AL 0dc66e7ff4 Avoid executing Problems checks concurrently.
Reduce timer to 500ms.
Make other calls also scheduled.
2020-06-07 16:42:18 +02:00
AL 2b4c0288b4 Make a couple more calls async since there is no good reason not to. 2020-06-07 14:32:54 +02:00
AL 66690bd176 Fix comment on checkForProblems() 2020-06-07 14:32:08 +02:00
AL 30605e8381 Make m_NumberOfProblems atomic 2020-06-07 14:31:32 +02:00
Al 8b667fe69a Merge pull request #1109 from Holt59/set-plugin-setting-signal
Add IOrganizer signal when a plugin setting is changed.
2020-06-07 03:45:42 -07:00
Al bf055e8048 Merge pull request #1101 from Holt59/archive-lib-modification
Archive lib refactoring
2020-06-07 03:44:05 -07:00
AL a30ec0018b * Change the diagnoseUpdate() signals to collapse into a single async call in case of multiple signals in short time span.
* Make mainwindow constructor and show() use updateProblemsButton() to just update the problems icon without performing checks.

* Make directory refreshed schedule a problems check since it can overlap with other invocations.

* Make changing translation not trigger checks at all.

* Make changing style only update the icon instead of also performing the check.

* Make MainWindow ctor, MainWindow::show()and MainWindow::resetActionIcons() just update the icon without actually performing a check.

* Make clearing overwrite checkForProblems synchronously. Same before opening the notifications window and after closing it.
2020-06-06 23:13:14 +02:00
AL 1497685ea5 Make checkForProblems update local variable with the problem count,
Make updateProblemsButton just update the ui using that variable (no heavy operation)
Add checkForProblemsAsync to perform the heavy checks in another thread.
2020-06-06 18:08:30 +02:00
Mikaël Capelle 0ad56591fd Fix order of operations to avoid deadlock with event loop. 2020-06-06 13:40:38 +02:00
Mikaël Capelle e49ce3ed21 Use QEventLoop to process events when extracting instead of manual loop with processEvents. 2020-06-05 20:36:35 +02:00
Mikaël Capelle 8fa905cde6 Update to follow changes in FileData from archive. 2020-06-05 17:50:26 +02:00
Mikaël Capelle 093fddda37 Add IOrganizer signal when a plugin setting is changed. 2020-06-05 16:47:49 +02:00
Mikaël Capelle b7a559c75c Update following archive callback changes. 2020-06-02 23:30:03 +02:00
Mikaël Capelle b8a1365dac Update after change to CreateArchive. Remove unused archive handler from self-updater. 2020-06-02 12:40:46 +02:00
Al 226b2b1843 Merge pull request #1098 from Holt59/install-manager-improvements
Installation manager improvements
2020-06-01 13:56:26 -07:00
Mikaël Capelle 30361186c1 Update installation manager after namespace changes in archive. 2020-06-01 21:48:52 +02:00
Mikaël Capelle 2c20a4115d Fix opening and extraction of archives with passwords and/or encrypted filenames. 2020-06-01 21:06:52 +02:00
Mikaël Capelle af0c0dc33e Correct handling of 7z errors. 2020-06-01 17:40:15 +02:00
Mikaël Capelle 046af63dd5 Remove non-used declarations. Move queryPassword to lambda. 2020-06-01 17:14:30 +02:00
Mikaël Capelle 4b1b897a14 Use a single extractFiles() method and avoir member variables when not needed. 2020-06-01 17:12:20 +02:00
Mikaël Capelle 70fe708474 Remove usage of QString in FileData following archive change. 2020-06-01 14:55:19 +02:00
Mikaël Capelle f442f5da51 Modification following 'archive' update. 2020-06-01 13:58:46 +02:00
Mikaël Capelle 926267faa0 Fix issue with progress dialog disapearing too soon during installation. 2020-05-31 00:31:29 +02:00
Mikaël Capelle 0b3e3ab590 Set the parent widget properly in installation manager. 2020-05-30 21:44:40 +02:00
Mikaël Capelle 1dc98e3af2 Small update to installation manager following uibase changes. 2020-05-30 21:32:04 +02:00
Mikaël Capelle e9595ec91a Fix comment in installation manager. 2020-05-30 17:49:46 +02:00
Mikaël Capelle 3f768ae53a Implement createFile() for the installation manager. 2020-05-30 15:00:10 +02:00
Mikaël Capelle 21296a6459 Allow creation of file using addFile() in ArchiveFileTree. 2020-05-30 14:59:38 +02:00
Chris Djali a92fdeb400 Add correct link to CMake Common to readme 2020-05-29 16:16:56 +01:00
Chris Djali 25b6f5dd8d Add CMake Common link to readme 2020-05-29 16:15:34 +01:00
isanae da35955d6c Merge pull request #1092 from Holt59/mod-data-content
Use ModDataContent feature from GamePlugin
2020-05-28 23:42:53 -04:00
Mikaël Capelle 0a5790b333 Add icon for FO4 material (courtesy of @twizz0r). 2020-05-28 21:58:59 +02:00
Mikaël Capelle 78143598db Remove space. 2020-05-28 19:51:20 +02:00
Mikaël Capelle 7f42698f4c Change auto& to const auto&. 2020-05-28 19:50:39 +02:00
Mikaël Capelle d2b7a1a321 Expose ModDataContentHolder from OrganizerCore instead of vector of Content. 2020-05-28 19:48:21 +02:00
Mikaël Capelle 4791569790 Ignore filter-only content when sorting. 2020-05-27 22:46:03 +02:00
Mikaël Capelle 700c5fb16c Store contents as a set instead of a vector. 2020-05-27 22:45:42 +02:00
Mikaël Capelle 6f22a77cda Do not show Content with isOnlyForFilter() in the column. 2020-05-27 22:01:36 +02:00
Mikaël Capelle 9c3ddb53c9 Fix sorting for the Content column. 2020-05-27 21:29:17 +02:00
Mikaël Capelle 70f1e8bdf6 Make ModInfo::getContents() pure virtual. 2020-05-27 14:58:32 +02:00
Mikaël Capelle c31c79c61d Add temporary icon for material content. 2020-05-27 14:56:49 +02:00
Mikaël Capelle 7c7631d409 Replace usage of MakeVector with initializer lists. 2020-05-26 20:20:47 +02:00
AL 652d3ab054 Fix modlist scrolling to wrong location after filter refresh in some cases.
If the currently selected column wasn't the Name column it would scroll to the first modnamee that matched the currently selected column contents (like scrolling to a mod called Audio overhaul after assigning Audio category to another mod).
2020-05-26 15:36:40 +02:00
Mikaël Capelle 36b81b4a7c Use ModDataContent to display the tooltip in the header. 2020-05-25 20:17:21 +02:00
Mikaël Capelle cf1bbdd13e Switch to using the ModDataContent feature from the game plugin. 2020-05-25 19:54:15 +02:00
isanae a721347fd1 Merge pull request #1079 from Holt59/moinfo-improvements
ModInfo improvements
2020-05-25 13:48:45 -04:00
Mikaël Capelle 9212a7d2e9 Use hasSuffix() where needed. 2020-05-25 18:27:49 +02:00
Mikaël Capelle 09e75d14e5 Fix comment for prefetch(). 2020-05-25 17:59:07 +02:00
Mikaël Capelle c5bbf7360c Fix suffix comparison for SKSE DLLs. 2020-05-25 17:58:58 +02:00
Mikaël Capelle 03fc2b0dc2 Update ModInfo classes following MemoizedLocked changes. 2020-05-25 17:57:07 +02:00
Mikaël Capelle 86f516953d Update MemoizedLock to allow more flexible callable. 2020-05-25 17:56:45 +02:00
Mikaël Capelle e7afedaebe Remove useless calls to diskContentModified(). 2020-05-25 17:50:49 +02:00
Mikaël Capelle 238e233c18 Use memoization for file tree, contents and validity of ModInfo. 2020-05-24 23:33:21 +02:00
Mikaël Capelle 0aac4f3291 Add MemoizedLocked. 2020-05-24 23:32:47 +02:00
Mikaël Capelle b352aa53e0 Add thread_utils to CMakeList.txt. 2020-05-24 23:31:34 +02:00
Mikaël Capelle 4d8b5aaae8 Remove old comment. 2020-05-24 15:35:35 +02:00
Mikaël Capelle a67a99acb7 Force lower case comparison for extensions in getContents(). 2020-05-24 15:35:09 +02:00
Mikaël Capelle a62bf7aa12 Fix typo in getContents(). 2020-05-24 15:21:08 +02:00
Mikaël Capelle 4bcb92fc47 Use a more generic 'prefetch' method instead of isValid(). 2020-05-24 14:49:51 +02:00
Mikaël Capelle 001e44fec4 Minor cleaning. 2020-05-24 14:40:44 +02:00
Mikaël Capelle ff4fbbdc5f Switch from ThreadPool to a simpler thread map for containers. 2020-05-24 14:39:39 +02:00
Mikaël Capelle 73248d9e40 Use the refresh_thread_count setting for ModInfo::updateFromDisc. 2020-05-24 13:36:16 +02:00
Mikaël Capelle a284c64dc1 Update file tree in parallel when loading from disk. 2020-05-24 13:28:00 +02:00
Mikaël Capelle 9fb639a00e Update ModInfo to use a single file tree for all content-related operations. 2020-05-24 13:27:40 +02:00
Al 08ae9db2fd Merge pull request #1076 from Holt59/moddatachecker
Use the ModDataChecker feature to check mod validity
2020-05-23 14:19:54 -07:00
Mikaël Capelle 6374845a28 Bump to 2.3.0a9 and update copyright to 2020. 2020-05-23 23:09:20 +02:00
isanae 20649ec027 Fix issues with very slow refresh time for large root data directories. 2020-05-23 23:08:33 +02:00
Mikaël Capelle fceca422db Add comment about lazy-populating the QDirFileTree. 2020-05-23 22:21:38 +02:00
Mikaël Capelle 5f794fec2c Remove time() method from FileTreeEntry. 2020-05-23 21:45:57 +02:00
Mikaël Capelle 2652ed1209 Update QDirFileTree to hide implementation and allow querying time through QFileInfo. 2020-05-23 18:40:21 +02:00
Mikaël Capelle 7b973d5f10 Remove header that has been removed from uibase. 2020-05-23 17:33:16 +02:00
Mikaël Capelle 064ef4cfeb Update IFileTree implementations following uibase changes. 2020-05-23 17:33:01 +02:00
Mikaël Capelle ee995b8df5 Remove include that has been removed from uibase. 2020-05-23 17:09:20 +02:00
Mikaël Capelle ee7438827e Switch to ModDataChecker for testing mod validity. 2020-05-22 15:50:50 +02:00
Mikaël Capelle 5fc66d8793 Move m_GamePlugin up into ModInfoWithConflictInfo. 2020-05-22 15:27:19 +02:00
Mikaël Capelle c0035ada02 Add QDirFileTree implementation. 2020-05-22 13:49:51 +02:00
Al e618afa5d1 Merge pull request #1075 from Holt59/bump-to-2.3.0a8
Bump version to 2.3.0 alpha 8.
2020-05-22 01:27:16 +02:00
Mikaël Capelle 736fc28b12 Bump version to 2.3.0 alpha 8. 2020-05-22 00:00:41 +02:00
Al 5f00213b8a Merge pull request #1074 from IsmayilMirzali/add_open_logs
Add option to open logs folder
2020-05-20 23:48:19 +02:00
IsmayilMirzali f31a74a6a8 Add option to open logs folder 2020-05-21 00:44:34 +03:00
Al b7110cba2d Merge pull request #1066 from Holt59/new-filetree
Update for the new file tree implementation and minor fixes
2020-05-20 13:05:02 +02:00
isanae c214b67ae7 Merge pull request #1073 from Holt59/fix-missing-junction-plugins
Fix issue with plugins in junction mods not being activated.
2020-05-20 06:55:01 -04:00
Mikaël Capelle 89db02eb94 Fix issue with plugins in junction mods not being activated. 2020-05-20 12:53:36 +02:00
Mikaël Capelle c391c2b584 Rollback to setGameName instead of setGamePlugin for mod interface. 2020-05-19 18:00:12 +02:00
Mikaël Capelle 04698417a9 Add implementation of clone() and doClone() for the archive filetree. 2020-05-16 14:00:24 +02:00
Mikaël Capelle 0a3dade905 Update after const_cast removal in uibase. 2020-05-12 19:32:31 +02:00
Mikaël Capelle 572fa7050f Minor comment updates. 2020-05-08 21:43:27 +02:00
Mikaël Capelle b2bd13e3db Fix another issue with some archives not being loading properly. 2020-05-07 22:09:40 +02:00
Mikaël Capelle 411b73e0aa Fix issue with some archives not being extracted correctly. 2020-05-07 19:18:58 +02:00
Mikaël Capelle f405a51bf6 Override astree() in ArchiveFileTreeImpl to avoid VS warnings. 2020-05-07 16:22:07 +02:00
Mikaël Capelle ff990c7743 Fix issue with getColor() not being overriden properly. 2020-05-07 12:17:27 +02:00
Mikaël Capelle 5a90eecc21 Fix issue with mods not being checked properly and overwrite not having the right priority. 2020-05-07 12:16:33 +02:00
Mikaël Capelle 068e12bbb2 Move to the new filetree for the installation manager. 2020-05-07 12:16:33 +02:00
Mikaël Capelle 40c433580f Update ModInfo classes to handle plugin game and clean some declarations. 2020-05-07 12:16:33 +02:00
Mikaël Capelle cd2b7683b7 Avoid using GamePlugins when not provided by the game plugin. 2020-05-07 12:16:32 +02:00
AL 14d1ea87f9 Fix separator colors not working right due to missing brackets. 2020-05-07 01:57:58 +02:00
isanae 2860447dce Merge pull request #1064 from isanae/cmakefile-appveyor-fix
Appveyor fix for new cmake files
2020-04-30 18:43:05 -04:00
isanae 8ef7db6a4c appveyor does not build modorganizer in its standard location, so use DEPENDENCIES_DIR to find cmake_common 2020-04-30 18:42:02 -04:00
Al 4b265a5cd3 Merge pull request #1063 from Al12rs/mod_colors
Mod colors
2020-04-30 15:57:42 +02:00
AL bdd1e97d4f Add modinfodialog Notes Tab color selector. 2020-04-29 22:13:09 +02:00
AL 4d67365600 Only show color context menu for mods when right clicking on Notes column. 2020-04-29 17:04:25 +02:00
AL 312af10f4f Allow coloring notes field. 2020-04-29 16:49:12 +02:00
isanae 9945beabf1 Merge pull request #1061 from isanae/new-cmakefiles
New cmakefiles
2020-04-26 02:54:00 -04:00
isanae ca9c953d6a moved a few projects to requires_project() 2020-04-25 00:19:25 -04:00
isanae bbfec30539 now using new common cmakefiles
fixed includes because shared/ isn't in the path anymore
removed unused modeltest files
2020-04-23 21:00:00 -04:00
AL 530bade5f7 Allow resizing and maximizing the Loot sort report dialog. 2020-04-18 21:25:00 +02:00
isanae a2f550ee33 Merge pull request #1057 from isanae/warning-fixes
Fixed warnings about Q_OBJECT and thousand separators
2020-04-18 04:54:10 -04:00
isanae b91dbba734 fixed warnings about Q_OBJECT and thousand separators
had to move some classes to header files
2020-04-18 04:53:14 -04:00
isanae c47ab23f95 Merge pull request #1055 from isanae/sysdir-opt
Fix for getOptionalKnownFolder()
2020-04-17 11:08:14 -04:00
isanae 2c1331e3e5 getOptionalKnownFolder() returns a string now 2020-04-17 11:06:08 -04:00
isanae 855650215f Merge pull request #1054 from isanae/bunch-of-fixes
Bunch of fixes
2020-04-17 10:31:47 -04:00
isanae 21166f820b bumped to alpha 7 2020-04-17 10:25:42 -04:00
isanae 47867d427f fixed crash when switching to an instance with a lower refresh thread count
fixed rare race condition when waking up handle closer threads
2020-04-17 10:23:10 -04:00
isanae f43c11497d added game, instance and profile to status bar 2020-04-17 10:01:33 -04:00
isanae 014df88aa8 typo 2020-04-17 09:44:28 -04:00
isanae 960afe9ea5 log command line 2020-04-17 09:43:58 -04:00
isanae e11ca50a57 update available log is now info instead of debug
added AV warning when a game plugin is no longer available
2020-04-17 09:31:59 -04:00
isanae d49f038d5d silenced a few annoying logs 2020-04-17 09:30:16 -04:00
isanae 77d292727b sanity checks: added nahimicmsiosd.dll, specialk64.dll and mactype64.dll 2020-04-17 09:27:17 -04:00
isanae 52c7a6a181 added directory checks for desktop and onedrive 2020-04-17 09:14:24 -04:00
isanae 3b0fbebc6a dump a bunch of counts for mods when selecting a profile 2020-04-17 09:06:41 -04:00
Al ff912b5f61 Merge pull request #1053 from Al12rs/fix_no_inis
Fix crash when game plugin does not provide any ini files.
2020-04-17 14:30:41 +02:00
isanae d7ceadeae1 hook ctrl+f and escape directly on widgets instead of on the main window to allow other widgets to use the same shortcuts, like the FilterWidget 2020-04-17 08:19:22 -04:00
AL 89ee58de38 Fix crash when game plugin does not provide any ini files. 2020-04-17 13:49:26 +02:00
isanae 15e04d4fe8 fixed typo 2020-04-17 07:24:12 -04:00
isanae 4275cadf13 changed first validation timeout back to 10s, a lot of people report that 5s is too short 2020-04-17 07:24:02 -04:00
isanae 333a0c3c16 removed some debug logging 2020-04-17 07:23:28 -04:00
isanae 4621c27164 Merge pull request #1052 from isanae/filetree-crash-fixes
File tree crashes
2020-04-17 07:06:38 -04:00
isanae 0faa5d6995 fixed crashes and empty items in the file tree
sorting and removing items have to be queued since they corrupt various internal structures in Qt when done during layout
2020-04-17 06:58:21 -04:00
AL 502e752b0a Fix inconsistent Explore menu option naming. Used Visual Studio standard. 2020-04-02 14:29:40 +02:00
AL a4ed20295f Fix "Failed to setup data paths" loop by showing the choose instance dialog for next startup.
This could sometimes happen if users changed a drive letter or removed a drive with one of the Mo2 paths on it making Mo2 error on startup. Only fix was to manually edit the modorganizer.ini file or manually deleting the instance. This allows users to create or use other instances even if that particular instance still needs manual fixing.
2020-03-30 22:10:15 +02:00
AL aab5a120ff Imrpoved mod already exist dialog when installing. 2020-03-19 20:43:53 +01:00
AL 57be0f0db6 Fix and improve NexusID detection during installation for Install Mod button. 2020-03-13 22:48:02 +01:00
Al 7683dc205d Fix timestamp formatting for appveyor 2020-03-01 13:53:53 +01:00
AL 979889edfe Made all lists uniform row heights for performance and alternate row color 2020-02-29 15:02:15 +01:00
AL 99ac2c0e9a Fixed comboboxes and tooltip lagginess due to bad animations. 2020-02-29 15:01:26 +01:00
AL 5e83ecf8c4 New appveyor complete build configuration. 2020-02-29 14:23:14 +01:00
Chris Bessent 6f11e3d741 Revert "Hacky fix to installation progress dialog flashing"
This reverts commit 42e5c33a32.
2020-02-28 12:12:54 -07:00
Al a44100ada1 Merge pull request #1021 from Al12rs/log_changes
Various UI changes:
2020-02-27 11:02:34 +01:00
AL c2e2be8ff7 Cleanup previous filterList code 2020-02-26 19:34:33 +01:00
AL c4b95bad65 Removed "State" header from filterlist.
Allow lower vertical sizes for loglist.
Fixed alignments and size of various elements.
2020-02-26 19:24:15 +01:00
AL c1554d1c3f Added checkbox icons for filterlist state 2020-02-26 19:22:15 +01:00
AL 60437644e4 Enabled icons for all log level line.
Added new icon for Debug level.
Moved icons after timestamp.
2020-02-26 19:20:56 +01:00
AL 0a6c7dce97 Allow log to be reduced in size to a greater extent. 2020-02-26 14:50:19 +01:00
Al 756056fcc3 Merge pull request #1019 from Al12rs/context_menu_delay_fix
Fix context menu rendering delay and and general crappiness.
2020-02-26 14:47:33 +01:00
AL 87fcb7cf9e Fix context menu rendering delay and and general crappiness.
This affected users that had the windows "Fade or slide menus into view" option enabled. Qt's implementation of these effects sucks
2020-02-25 17:13:03 +01:00
AL 8bf4cd3b27 Fix random <br> in Alternate Game icon tooltip 2020-02-25 17:07:14 +01:00
Al a6d3ab75c0 Merge pull request #1018 from Al12rs/remove_flashing_widgets
Fixed widgets flashing during Mo2 startup,
2020-02-25 17:05:33 +01:00
AL 85f4ca3870 Fixed widgets flashing during Mo2 startup,
they were caused by some code I can't even make sense of that I left over. My bad...
2020-02-25 14:06:53 +01:00
Al f02aa15fc5 Merge pull request #1017 from Al12rs/filterwidget_updates
Filterwidget updates
2020-02-25 14:02:49 +01:00
AL 22f8698e0b Moved filters back to the bottom 2020-02-23 22:11:18 +01:00
AL 5208bf5251 Set filterwidget delay for the data tab to avoid typing stutter 2020-02-23 14:22:46 +01:00
AL e6cd3d026d Add option to filterwidget to keep selection in view 2020-02-23 02:32:51 +01:00
AL e5688ecea3 Fix crashing on Nexus descriptions that are missing BBCode closing brackets. 2020-02-22 14:48:59 +01:00
Chris Bessent 6107883829 Merge pull request #1006 from LostDragonist/master
Hacky fix to installation progress dialog flashing
2020-02-21 02:13:06 -07:00
Chris Bessent 42e5c33a32 Hacky fix to installation progress dialog flashing 2020-02-21 01:59:49 -07:00
isanae 21904f6214 Merge pull request #1005 from isanae/missing-categories
Missing categories
2020-02-19 03:40:26 -05:00
isanae 13a622e6cd categories were loaded too late 2020-02-18 21:06:04 -05:00
isanae d41d57fe07 Merge pull request #1004 from isanae/timings
More timings
2020-02-18 18:15:35 -05:00
isanae f9ad6d9709 timing for refreshBSAList and updateProblemsButton 2020-02-18 18:13:23 -05:00
isanae 75cd8b3bab added more timings
missed fileregisterfwd.h in cmake list
2020-02-18 18:09:03 -05:00
isanae e749b20726 Merge pull request #1003 from isanae/file-list-improvements
Refresh optimizations
2020-02-18 17:32:11 -05:00
isanae a28bd45c0b changed FileRegister to a deque instead 2020-02-18 17:25:06 -05:00
isanae d7ad9dcc19 removed copy/pasted qt copyright 2020-02-18 17:25:06 -05:00
isanae f7d7c4465b bumped to alpha 6 2020-02-18 17:25:05 -05:00
isanae d3fe9ff1fa moved TimeThis to uibase
fixed progress bar
2020-02-18 17:25:05 -05:00
isanae 528fa988b5 error handling for last modified time 2020-02-18 17:25:05 -05:00
isanae 5e569d0107 re-enabled archive parsing 2020-02-18 17:25:05 -05:00
isanae dbb3f5117a removed directoryrefresher.h from organizercore.h 2020-02-18 17:25:05 -05:00
isanae 777d822f13 cleanup, typedefs 2020-02-18 17:25:05 -05:00
isanae bbd9bb1fd9 hide version.aps 2020-02-18 17:25:05 -05:00
isanae b1cf498924 split directoryentry
made classes noncopyable, fixed a few unintended copies
2020-02-18 17:25:04 -05:00
isanae 88ef053000 error checking in dump()
removed a bunch of "{} saved" in the logs
2020-02-18 17:25:04 -05:00
isanae 9eeaa88cf5 fixed sorting 2020-02-18 17:25:04 -05:00
isanae 82106134cb added natvis 2020-02-18 17:25:04 -05:00
isanae 4a74102736 moved dump() to DirectoryEntry
static functions instead of lambdas
2020-02-18 17:25:04 -05:00
isanae 75359bc9c2 fixed crash when disabling mod 2020-02-18 17:25:04 -05:00
isanae fb3fbd3421 removed lastAccessed from FileEntry, not used
FileRegister keeps a vector instead of a map
2020-02-18 17:25:03 -05:00
isanae 567fe019ac removed some unnecessary counters
delete old structure in thread
2020-02-18 17:25:03 -05:00
isanae c8fc7abade thread-safe OriginConnection
ThreadPool now keeps threads running
keep ModThreads around so avoid reallocating buffers
2020-02-18 17:25:03 -05:00
isanae 763a5d6c08 more instrumentation
tighter mutexes, required thread-safe FileEntry
2020-02-18 17:25:03 -05:00
isanae 29244f3328 thread-safe directory entry 2020-02-18 17:25:03 -05:00
isanae d082a91ad6 faster getSubDirectory() for env::Directory, added lcname
instrumentation
2020-02-18 17:25:03 -05:00
isanae 7860e927a7 removed dead insertFile()
avoided a few string copies
lowercase filename in thread
2020-02-18 17:25:03 -05:00
isanae 3423b0a593 threaded refresher 2020-02-18 17:25:02 -05:00
isanae 6ee4285588 close handles in thread 2020-02-18 17:23:48 -05:00
isanae c1cf760337 don't lowercase twice 2020-02-18 17:23:48 -05:00
isanae 3a65665d36 wstring_view when possible
first implementation of NtQueryDirectoryFile
2020-02-18 17:23:48 -05:00
isanae 3db95eb404 customizable columns for mod and plugin lists 2020-02-18 17:23:48 -05:00
isanae 0c62a26e09 customizable columns for file tree 2020-02-18 17:23:47 -05:00
isanae 177dc6b320 shift+right-click selects items 2020-02-18 17:23:47 -05:00
isanae 7eae9b5dd4 localized warning when file doesn't exist for shell menu 2020-02-18 17:23:47 -05:00
isanae 7c2952b83c fixed stylesheets for "valid-filter" property 2020-02-18 17:23:47 -05:00
isanae f9f31c57dc added support for FilterWidget regexes 2020-02-18 17:23:47 -05:00
isanae b5c0b2b0a2 updated stylesheets for new "filtered" property on lists with FilterWidget 2020-02-18 17:23:47 -05:00
isanae 8c2814c9dc Merge pull request #1000 from Al12rs/startup_performance
Startup performance
2020-02-18 17:22:29 -05:00
Al cfb05d72be Merge pull request #998 from Al12rs/warnings
Change Qtime to QElapsedtimer in some palaces to remove the warnings.
2020-02-17 13:22:13 +01:00
AL 8e3ab9fb66 Cleanup commented code 2020-02-17 11:00:27 +01:00
AL 5043a930ce Add setting to disable splash since it can cause load time increase
use_spash=true by default. It's not exposed to the ui for now.
2020-02-17 03:26:47 +01:00
AL 112f91357e Reduce overhead introduced by splashscreen
by not letting it wait on the mainwindow and instead immediately close
2020-02-17 02:34:56 +01:00
AL 29b331817c Remove duplicated updateFromDisc() call during refresh
comment mentioned that it was needed but it was very old and testing would suggest this is no longer the case.
2020-02-17 02:11:42 +01:00
AL edc7f3d5b2 Avoid refreshing when setting downloads supported extensions as it only happens during init. 2020-02-16 15:54:41 +01:00
AL c02fbe89c7 Allow not refreshing downloads when setting their folder, for example during init. 2020-02-16 15:54:40 +01:00
AL e33d0f9d35 Avoid updating the downloadView when it hasn't even been initialized. 2020-02-16 15:54:40 +01:00
AL c4059f0dfe Avoid refreshing the profile again when initializing the pforilebox 2020-02-16 15:54:40 +01:00
AL 60c86e7cee Move modInfo loadFromDisc to it's own function 2020-02-16 15:53:24 +01:00
AL 423db56781 Change Qtime to QElapsedtimer in some palaces to remove the warnings. 2020-02-15 23:02:49 +01:00
Al 86c5b64ab5 Merge pull request #997 from Al12rs/custom_url_overwrite_fix
Avoid overwriting existing URL values when replacing a mod if new val…
2020-02-14 14:01:58 +01:00
AL 460e015e96 Avoid overwriting existing URL values when replacing a mod if new value is empty. 2020-02-14 13:43:22 +01:00
Al 2af0698484 Merge pull request #991 from Al12rs/remember_last_modinfo_tab
Always remember last opened ModInfoDialog tab.
2020-02-14 13:35:20 +01:00
Al d2af089a14 Merge pull request #992 from Al12rs/version_check_for_optional_files
Avoid getting the general mod version for optional and miscellaneous …
2020-02-14 13:35:08 +01:00
isanae 1f1f99f253 Merge pull request #994 from isanae/generic-file-list
New file tree
2020-02-09 08:52:03 -05:00
isanae 3a80685189 don't sort items when they're not expanded 2020-02-08 21:38:01 -05:00
isanae d0c16e60d7 just disable recursive filtering when fully loading
switching models clears persistent indexes and collapses everything
2020-02-07 14:02:00 -05:00
isanae 2b0a720863 fixed sorting not emitting layout events and fixing persistent indexes 2020-02-07 13:39:35 -05:00
isanae 1c8c1bb89b fixed data tab not refreshing after "restarting" MO
larger default size for filename column
fixed sorting in descending order by default
2020-02-07 11:40:26 -05:00
isanae 9c2fc69405 sort on demand 2020-02-07 11:26:11 -05:00
isanae 41e6189be4 disconnect any proxies when fully loading
disable model when resetting, enable it back after the directory refresh so the tree doesn't appear in a weird state in between
2020-02-07 10:52:49 -05:00
isanae 49a1e234ef item activation
removed a bunch of unnecessary QObject qualifiers
2020-02-07 09:24:54 -05:00
isanae 6b97e2185f bump to alpha5 2020-02-07 08:28:59 -05:00
isanae fe76e6518b Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer into generic-file-list 2020-02-07 08:06:08 -05:00
AL a120a36e11 Avoid getting the general mod version for optional and miscellaneous files,
as those usually have their own version unbound to the main one.
2020-02-06 16:24:47 +01:00
isanae e6fe832b4f don't refresh the data tab every time the index changes 2020-02-05 22:00:47 -05:00
isanae 593ed64f86 filter on filename column only because loading the meta for every file takes forever
some small optimizations when enabling mods
2020-02-05 21:55:52 -05:00
isanae b7e51b65e8 removed bad minimum column width in the data tab
fixed crash in log when restart MO
2020-02-05 20:37:18 -05:00
isanae 03ee407c34 fixed LogModel not being thread safe
optimizations:
- create BrowserDialog on demand
- scroll to bottom of log in a timer, coalesces fast logging
- disabled md5 of dlls
2020-02-05 20:23:53 -05:00
isanae ea0429342a harmonized widgets in the tabs, fixed styles 2020-02-05 19:11:49 -05:00
isanae 34b022a229 fixed warning when comparing empty strings
filter in data tab
fixed some bad iterators when removing rows
fixed empty directories not being marked as such when refreshing
always sort directories first even when reversing the sort order
fixed children not being sorted
fixed errors about file sizes for directories
remember state of checkboxes in data tab
2020-02-05 16:21:41 -05:00
Al 718c2a56f9 Merge pull request #990 from Al12rs/shift_visit_website
Allow Shift-double click on modlist to open Nexus or custom URL as fa…
2020-02-05 16:28:14 +01:00
Al 6ab940892f Merge pull request #989 from Al12rs/more_text_types
Add support for other text file types to Text Files modinfo tab
2020-02-05 16:28:01 +01:00
AL 3079f84954 Always remember last opened ModInfoDialog tab.
Don't reopen saved tab if mainwindow requested specific tab.
2020-02-05 16:26:44 +01:00
AL ebd71dd053 Remove .cfg from INI Files tab as it's in Text Files tab now. 2020-02-04 15:04:37 +01:00
isanae 6f10702349 case insensitive checks for mohidden extension (lost in rebase) 2020-02-04 03:36:34 -05:00
isanae 2f3b9f9a9e skip files from archives for the shell menu 2020-02-04 03:33:23 -05:00
isanae d14488d2f7 update tree items when origins change 2020-02-04 03:33:23 -05:00
isanae 47d1826f55 hidden unique_ptr into FileTreeItem
refactored pruning
don't show shell menu for directories
added collapse all in context menu
2020-02-04 03:33:23 -05:00
isanae 97b91b5fe5 prune empty directories 2020-02-04 03:33:23 -05:00
isanae 34bc2191e6 don't get meta for fields that are not used
show compressed file size if available
remember file sizes for files in archives
2020-02-04 03:33:22 -05:00
isanae 85a9f810a0 moved refresh and checkboxes to the top 2020-02-04 03:33:22 -05:00
isanae c6c01f86c6 sort 2020-02-04 03:33:22 -05:00
isanae 7c98635edc filetype and last modified columns 2020-02-04 03:33:22 -05:00
isanae a55a69e6ac file size column 2020-02-04 03:33:22 -05:00
isanae 412165fcfb show file counts when there are discrepancies 2020-02-04 03:33:22 -05:00
isanae 2a0e78e3cf fixed bad path for alternate origins
finished ShellMenuCollection, had to split a bunch of things
2020-02-04 03:33:22 -05:00
isanae 6005da6187 ShellMenuCollection, events not processed yet 2020-02-04 03:33:21 -05:00
isanae a7a406e553 preparing for multiple origins shell menus
split exec() from createMenu()
2020-02-04 03:33:21 -05:00
isanae 0f6205bea5 dummy menu for files in multiple directories 2020-02-04 03:33:21 -05:00
isanae d0be8a0d3b ShellMenu class 2020-02-04 03:33:21 -05:00
isanae e3211683fd shell menu for multiple files 2020-02-04 03:33:21 -05:00
isanae abdf98bbfe status bar messages 2020-02-04 03:33:21 -05:00
isanae dd4bd5b17d shift+right click for shell menu 2020-02-04 03:33:21 -05:00
isanae 2d4216a4f0 icons 2020-02-04 03:33:20 -05:00
isanae 0f3c01425d font, tooltip and foreground 2020-02-04 03:33:20 -05:00
isanae 3bc1a4a067 createDirectoryItem() and createFileItem() 2020-02-04 03:33:20 -05:00
isanae f49643075a moved a bunch of duplicate stuff in a new class Range 2020-02-04 03:33:20 -05:00
isanae 7c4d3c6fb9 refactored removeDisappearingFiles() to just check for directories in the main loop 2020-02-04 03:33:20 -05:00
isanae 9c9de680c6 faster parent() and indexFromItem() with index guess
implemented files
2020-02-04 03:33:20 -05:00
isanae 8e3a360cd4 implemented fetchMore() and update for subdirectories
don't refresh tree on active, it's taken care of by fetchMore()
2020-02-04 03:33:20 -05:00
isanae bb9a4600bb rewriting FileTreeModel, implemented add/remove folders in root 2020-02-04 03:33:19 -05:00
isanae 08188830a3 removed LEAK_TRACE stuff
refactored DirectoryEntry for lookup maps
filetreemodel: made ensureLoaded() a no-op while refreshing, faster processing for removing rows
2020-02-04 03:33:19 -05:00
isanae aa63bffd35 missing toStdString() from merge 2020-02-04 03:33:19 -05:00
isanae ee03c23290 refactoring: moved member functions in the same order as the header 2020-02-04 03:33:19 -05:00
isanae 1c07f8ddda refactoring: whitespace, newlines, auto, removed commented out code 2020-02-04 03:33:19 -05:00
isanae 6da813a633 refactoring: whitespace and newlines 2020-02-04 03:33:19 -05:00
isanae 2be531470d renamed ToLower() to avoid confusion with in-place vs copy
pre-hashed file lookup in DirectoryEntry
2020-02-04 03:33:19 -05:00
isanae 0a908c4962 added a map for directories in DirectoryEntry
more optimizations for filetree
2020-02-04 03:33:18 -05:00
isanae 72394faa75 some optimizations to avoid case conversions and memory allocations 2020-02-04 03:33:18 -05:00
isanae 2d276cad0b put expensive logging in an optional function 2020-02-04 03:33:18 -05:00
isanae a7051df5da split item and model 2020-02-04 03:33:18 -05:00
isanae e0c605be1d initial implementation for updating file tree, buggy 2020-02-04 03:33:18 -05:00
isanae 219bd59a21 removed dead stuff 2020-02-04 03:33:18 -05:00
isanae f27a73b123 implemented dump to file
fixed duplicate module notifications not being skipped
2020-02-04 03:33:18 -05:00
isanae 2f07eb51c1 implemented explore origin, open mod info, hide and unhide 2020-02-04 03:33:17 -05:00
isanae 8bcf8cde3c hide spacers on statusbar when the progress bar is not visible
always show menu items, added status tips
2020-02-04 03:33:17 -05:00
isanae 87868e1b22 added a few missing consts
removed incorrect assert about an empty game edition
added FileTree to wrap a QTreeView and a FileTreeModel, moved some context menu actions over
2020-02-04 03:33:17 -05:00
isanae b6e91484ba split IconFetcher 2020-02-04 03:33:17 -05:00
isanae c5f98f9756 now prunes empty directories
handles archives and conflicts checkboxes
2020-02-04 03:33:17 -05:00
isanae d3e9abddaf tooltips, archive names 2020-02-04 03:33:17 -05:00
isanae de29b6a5a8 IconFetcher 2020-02-04 03:33:17 -05:00
isanae efdc3eb14f load items on demand 2020-02-04 03:33:17 -05:00
isanae a4624f239f split FileTreeModel, initial implementation, some stuff is broken 2020-02-04 03:33:16 -05:00
isanae e8027bfeaa moved main window classes to their own filter 2020-02-04 03:33:16 -05:00
isanae 7e748d15c9 split data tab
removed a bunch of undefined functions in MainWindow
2020-02-04 03:33:16 -05:00
AL 46319decd1 Allow Shift-double click on modlist to open Nexus or custom URL as fall-back. 2020-02-04 03:36:51 +01:00
AL d6d613f071 Add support for other text file types to Text Files modinfo tab 2020-02-04 02:43:29 +01:00
AL e9da5b4fad Version bump and update translations 2020-02-02 01:55:52 +01:00
Al c058721056 Merge pull request #988 from Al12rs/move_filter_widget
Moved filterWidget and eventFilter to ui base
2020-02-01 23:33:52 +01:00
AL 17cfba60a7 Fix Mobase namespace for filterwidget 2020-02-01 22:36:33 +01:00
AL 326c9130c4 Moved filterWidget and eventFilter to ui base 2020-02-01 21:28:14 +01:00
AL 9c8412a051 Change tooltip of Category column to say "Primary" 2020-01-31 23:04:34 +01:00
Al 0bc2a50440 Merge pull request #987 from IsmayilMirzali/master
Add more context menu options for mod backups
2020-01-28 23:08:24 +01:00
IsmayilMirzali 11f3a8caf5 Add seperators for mod backup context menu 2020-01-28 22:20:23 +02:00
IsmayilMirzali 28d449c026 Add more context menu options for mod backups 2020-01-28 00:51:44 +02:00
Chris Bessent 4963c278fe Don't allow foreign mods or overwrite for overriding overwrite 2020-01-26 18:26:03 -07:00
AL 6214cf3923 Fix CSV exporting of primary category.
#450
2020-01-26 20:19:15 +01:00
AL 6019e12ea5 Fixed file structure not being kept when drag and dropping files.
Fix #981
2020-01-23 17:17:03 +01:00
AL ade9cfb603 Bump bersion for dev build 3 2020-01-22 23:45:57 +01:00
Al 6305f6e2e9 Merge pull request #980 from Al12rs/context-menu-fix
Fixed missing context menu on general conflicts tab.
2020-01-22 23:09:57 +01:00
Al eacbe101f1 Merge pull request #979 from Al12rs/hidden-files-flag
Add Restore hidden files option and clean up hidden files code
2020-01-22 23:09:45 +01:00
Al 5af018d18a Renamed underscores function name to pascal case 2020-01-21 01:54:44 +01:00
Al 2217d9c575 Removed missed line 2020-01-21 01:49:22 +01:00
Al 123f9f408b Fixed missing context menu on general conflicts tab.
Was due to the new FilterWidget adding a QSortProxy and the selection had to be translated to the underlying model.
Normalized use of FilderWidget on the Advanced Conflicts tab.
2020-01-21 01:24:29 +01:00
Al 7c55ae3a22 Add "Restore hidden files" context menu option to modlist.
Recursively restores all hidden files in the mod or mods if more than one is selected.
2020-01-20 19:46:03 +01:00
Al 61b64d9431 Make hidden files extension checks case insensitive 2020-01-20 19:41:09 +01:00
Al 3e98a6e5bf Use ModInfo::s_HideExt instead of ".mohidden" directly 2020-01-20 19:38:08 +01:00
Al 84678a3a28 Merge pull request #978 from Al12rs/hidden-files-flag
Also check for .mohidden directories for HiddenFiles flag.
2020-01-19 20:34:02 +01:00
Al 304ca8066f Also check for .mohidden directories for HiddenFiles flag. 2020-01-19 16:32:32 +01:00
Al 7d11492ac2 Revert "Fix "Explore virtual folder" not being translatable"
This reverts commit de1bae9d92.
2020-01-19 12:52:22 +01:00
Al de1bae9d92 Fix "Explore virtual folder" not being translatable 2020-01-19 12:33:00 +01:00
Al a41c74bc5c Merge pull request #973 from Al12rs/hidden-files-flag
Added text filters for general conflicts lists
2020-01-16 21:30:26 +01:00
Al 58f3596028 Added text filters for general conflicts lists 2020-01-15 20:01:23 +01:00
Al a12e56f977 Bump version for 2.3.0 alpha 2 2020-01-15 12:04:25 +01:00
Al 5aad5eb8a2 Merge pull request #970 from Al12rs/hidden-files-flag
Hidden files flag
2020-01-15 11:59:13 +01:00
Silarn 0c2289b6f9 modsSortedByProfilePriority should return the internal name of the mod 2020-01-14 20:19:42 -06:00
Al f65121b8bc Fix some more tabs 2020-01-14 22:18:03 +01:00
Al 7579e42577 Fix incorrect tabs 2020-01-14 22:02:52 +01:00
Al 6b75741139 Add has hidden files filter for modlist. 2020-01-14 21:12:21 +01:00
Al a5d0cb8b5d Add icon for hidden files flag 2020-01-14 20:56:15 +01:00
Al 39f36ca27a Added ModInfo::FLAG_HIDDEN_FILES and check in modinfowithconflictinfo 2020-01-14 20:55:34 +01:00
Chris Bessent 3fb21b74a9 Merge pull request #969 from ModOrganizer2/2_2_2
Pull in 2.2.2.1 changes
2020-01-13 22:41:40 -07:00
Al b9ff5cc7dc Merge pull request #961 from Al12rs/filter-fix
Nestled categories in filters missing fix
2020-01-09 12:34:42 +01:00
AL 62a6b1ce5e Updated translations 2020-01-09 02:09:28 +01:00
AL 3c6804c502 Add headers with tooltips to Filter view. 2020-01-09 02:02:24 +01:00
AL 734bd0ed20 List all categories flatly in filters view as nestled ones would otherwise not be accessible. 2020-01-09 02:00:50 +01:00
Jeremy Rimpo f37ec77b26 Merge pull request #959 from ModOrganizer2/qt-5-14
Qt 5 14
2020-01-07 11:55:13 -06:00
Silarn 81abbacd67 Update manifest for 5.14 dlls 2019-12-31 02:53:58 -06:00
Silarn d259a0e1fa Migrate obsoleted qVariantFromValue 2019-12-31 02:49:15 -06:00
172 changed files with 14224 additions and 7301 deletions
+3 -2
View File
@@ -28,10 +28,11 @@ If necessary, describe the problem you have been experiencing with more details
## Link to Mod Organizer logs:
To access the log files you can press the Open folder icon over the modlist and select "Open MO2 Logs folder". You should close MO2 before sending or examining the logs as they are finished writing only after the program is closed.
Right click on the log window at the bottom of MO2, set log level to debug, restart Mo2 and reproduce the problem.
To access the log files you can press the Open folder icon over the modlist and select "Open MO2 Logs folder".
### USVFS:
Create a [GIST](https://gist.github.com) which is a paste of your USVFS logs, and link them here.
Create a [GIST](https://gist.github.com) which is a paste of your latest USVFS log, and link them here.
Do _NOT_ paste your full USVFS logs here, as it will make this issue very long and hard to read!
If you are reporting a bug, _always_ include the USVFS logs!
+1
View File
@@ -13,3 +13,4 @@ edit
/*std*.log
/*build
/src/version.aps
+16 -35
View File
@@ -1,39 +1,20 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12)
cmake_minimum_required(VERSION 3.16)
ADD_COMPILE_OPTIONS(
$<$<CXX_COMPILER_ID:MSVC>:/MP>
$<$<CXX_COMPILER_ID:MSVC>:/D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING>
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:RELEASE>:/O2>>
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:RELWITHDEBINFO>:/O2>>)
project(organizer)
set(project_type exe)
set(executable_name ModOrganizer)
set(enable_warnings OFF)
PROJECT(organizer)
# sets ModOrganizer as StartUp Project in Visual Studio
set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY VS_STARTUP_PROJECT "ModOrganizer")
set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
set(CMAKE_INSTALL_MESSAGE NEVER)
SET(DEPENDENCIES_DIR CACHE PATH "")
# hint to find qt in dependencies path
LIST(APPEND CMAKE_PREFIX_PATH ${QT_ROOT}/lib/cmake)
LIST(APPEND CMAKE_PREFIX_PATH ${LZ4_ROOT}/dll)
LIST(APPEND CMAKE_PREFIX_PATH ${FMT_ROOT}/build)
ADD_SUBDIRECTORY(src)
set(vcxproj_user_file "${CMAKE_CURRENT_BINARY_DIR}/INSTALL.vcxproj.user")
if(NOT EXISTS ${vcxproj_user_file})
FILE(WRITE ${vcxproj_user_file}
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<Project ToolsVersion=\"Current\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"
"<PropertyGroup>\n"
"<LocalDebuggerWorkingDirectory>${CMAKE_INSTALL_PREFIX}/bin</LocalDebuggerWorkingDirectory>\n"
"<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>"
"<LocalDebuggerCommand>${CMAKE_INSTALL_PREFIX}/bin/ModOrganizer.exe</LocalDebuggerCommand>\n"
"</PropertyGroup>\n"
"</Project>\n")
# appveyor does not build modorganizer in its standard location, so use
# DEPENDENCIES_DIR to find cmake_common
if(DEFINED DEPENDENCIES_DIR)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/project.cmake)
else()
include(../cmake_common/project.cmake)
endif()
INSTALL(FILES dump_running_process.bat DESTINATION bin)
set(additional_translations ${uibase_path}/src)
add_subdirectory(src)
install(FILES dump_running_process.bat DESTINATION bin)
+56 -19
View File
@@ -1,32 +1,69 @@
version: 1.0.{build}
version: dev-appveyor{build}
skip_branch_with_pr: true
image: Visual Studio 2019
init:
- ps: >-
# define build version depending on nightly or normal build
if($env:APPVEYOR_SCHEDULED_BUILD -eq 'True'){
$timestamp= Get-Date -Format "ddMMyyyy-HHmm"
Update-AppveyorBuild -Version "$($env:MO_VERSION)$($env:VER_STUB_NIGHTLY)$timestamp"
} else {
Update-AppveyorBuild -Version "$($env:MO_VERSION)$($env:VER_STUB_NORMAL)$($env:APPVEYOR_BUILD_NUMBER)"
}
Write-Host Build version set to: $env:APPVEYOR_BUILD_VERSION
environment:
WEBHOOK_URL:
secure: gOKbXaZM9ImtMD5XrYITvdyZUW/az082G9OIN1EC1VYoNNsKROB4s6VsQiL6qbLNLc4XQhc8Y9DhdU9Hfh49vhypcjUEQmMsENxnp+1hYMJctTqIYDunVSd767eez5wz6rKHqk+XOHmg5gyVNCV9u4DVcCZJSVe4UTKn1lc47H0=
build:
parallel: true
secure: gOKbXaZM9ImtMD5XrYITvdyZUW/az082G9OIN1EC1VaKiI9iefpxhBavJ6Al6CzIZvQ+3pxnLqjmNgA7cDc22wcj2kB4hSG5qhbTI8wGa8jLQ5L65nuRZ3vrIqghBz9G3GLglgZkg6eqH9r3Kqc6UzcpCGzxxPOqm550nRcIiUU=
MO_VERSION: 2.3.0
VER_STUB_NORMAL: dev-appveyor
VER_STUB_NIGHTLY: dev-nightly-
build_script:
- cmd: >-
git clone --depth=1 --branch=%APPVEYOR_REPO_BRANCH% https://github.com/ModOrganizer2/modorganizer-umbrella.git c:\projects\modorganizer-umbrella 2> $null
REM Maintenance comments:
REM APPVEYOR_BUILD_FOLDER= "c:\projects\modorganizer-slug"
REM -Need to update py3 version used to invoke unimake.py once in a while.
REM -Need update MO_VERSION env variable after each release.
REM -Always clones umbrella master
REM -Will checkout all the branches matching the one that triggered the build on the main repo.
REM End comments.
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
mkdir c:\projects\modorganizer-build -type directory
cd c:\projects\modorganizer-umbrella
C:\Python37-x64\python.exe unimake.py -d c:\projects\modorganizer-build -s Appveyor_Build=True %APPVEYOR_PROJECT_NAME%
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%
test: off
artifacts:
- path: build\src\ModOrganizer.exe
name: modorganizer_exe
- path: build\src\ModOrganizer.pdb
name: modorganizer_pdb
- path: '\modorganizer-build\install\bin'
name: Mod.Organizer-$(APPVEYOR_BUILD_VERSION)
- path: '\modorganizer-build\install\pdb'
name: PDBs-Mod.Organizer-$(APPVEYOR_BUILD_VERSION)
deploy: off
on_success:
- ps: Set-Location -Path $env:APPVEYOR_BUILD_FOLDER
- ps: Invoke-RestMethod https://raw.githubusercontent.com/DiscordHooks/appveyor-discord-webhook/master/send.ps1 -o send.ps1
- ps: ./send.ps1 success $env:WEBHOOK_URL
- 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 success $env:WEBHOOK_URL
on_failure:
- ps: Set-Location -Path $env:APPVEYOR_BUILD_FOLDER
- ps: Push-AppveyorArtifact ${env:APPVEYOR_BUILD_FOLDER}\stdout.log
- ps: Push-AppveyorArtifact ${env:APPVEYOR_BUILD_FOLDER}\stderr.log
- ps: Invoke-RestMethod https://raw.githubusercontent.com/DiscordHooks/appveyor-discord-webhook/master/send.ps1 -o send.ps1
- ps: ./send.ps1 failure $env:WEBHOOK_URL
- 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
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="FileTreeItem"><DisplayString>{{
file={m_wsFile}
dir={m_isDirectory}
origin={m_originID}
flags={m_flags.i}
loaded={m_loaded}
expanded={m_expanded}
}}</DisplayString></Type>
</AutoVisualizer>
+2 -1
View File
@@ -1,4 +1,4 @@
[![Build status](https://ci.appveyor.com/api/projects/status/23qmd9rufv9vpmg7?svg=true)](https://ci.appveyor.com/project/Modorganizer2/modorganizer)
[![Build status](https://ci.appveyor.com/api/projects/status/hxenwxmpaob5xung?svg=true)](https://ci.appveyor.com/project/ModOrganizer2/modorganizer-736bd)
# Mod Organizer
@@ -43,6 +43,7 @@ MO2 consists of multiple repositories on github. The Umbrella project will downl
Here is a complete list:
* https://github.com/LePresidente/cpython-1
* https://github.com/ModOrganizer2/cmake_common
* https://github.com/ModOrganizer2/githubpp
* https://github.com/ModOrganizer2/modorganizer
* https://github.com/ModOrganizer2/modorganizer-archive
+64 -524
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -20,7 +20,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "aboutdialog.h"
#include "ui_aboutdialog.h"
#include "util.h"
#include "shared/util.h"
#include <utility.h>
#include <QApplication>
+21 -1
View File
@@ -217,7 +217,7 @@
</item>
<item>
<property name="text">
<string notr="true">isanae</string>
<string notr="true">isa</string>
</property>
</item>
</widget>
@@ -256,6 +256,11 @@
<string notr="true">przester</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Holt59</string>
</property>
</item>
</widget>
</item>
</layout>
@@ -390,6 +395,11 @@
<string>Nubbie (Swedish)</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">Hakan &quot;Nyks45&quot; Albayrak (Turkish)</string>
</property>
</item>
<item>
<property name="text">
<string>...and all other contributors!</string>
@@ -429,6 +439,11 @@
<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>
@@ -474,6 +489,11 @@
<string notr="true">outdatedtv</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">PurpleFez</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">reedts</string>
+1 -1
View File
@@ -53,7 +53,7 @@ public:
/**
* @brief get a list of mods that the user chose to activate
*
*
* @note This can of ocurse only be called after the dialog has been displayed
*
* @return set< QString > the mods to activate
+260
View File
@@ -0,0 +1,260 @@
/*
Copyright (C) MO2 Team. All rights reserved.
This file is part of Mod Organizer.
Mod Organizer is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Mod Organizer is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
*/
// For QObject::tr:
#include <QObject>
#include "archivefiletree.h"
#include "log.h"
using namespace MOBase;
/**
* We use custom file entries to store the index.
*/
class ArchiveFileEntry : public virtual FileTreeEntry {
public:
/**
* @brief Create a new entry.
*
* @param parent The tree containing this entry.
* @param name The name of this entry.
* @param index The index of the entry in the archive.
*/
ArchiveFileEntry(std::shared_ptr<const IFileTree> parent, QString name, int index) :
FileTreeEntry(parent, name), m_Index(index) {
}
virtual std::shared_ptr<FileTreeEntry> clone() const override {
return std::make_shared<ArchiveFileEntry>(nullptr, name(), m_Index);
}
// No private since we are in an implementation file:
const int m_Index;
};
/**
*
*/
class ArchiveFileTreeImpl: public virtual ArchiveFileTree, public virtual ArchiveFileEntry {
public:
using File = std::tuple<QStringList, bool, int>;
public: // Public for make_shared (but not accessible by other since not exposed in .h):
ArchiveFileTreeImpl(std::shared_ptr<const IFileTree> parent, QString name, int index, std::vector<File> files)
: FileTreeEntry(parent, name), ArchiveFileEntry(parent, name, index), IFileTree(), m_Files(std::move(files)) { }
public: // Override to avoid VS warnings:
virtual std::shared_ptr<IFileTree> astree() override {
return IFileTree::astree();
}
virtual std::shared_ptr<const IFileTree> astree() const override {
return IFileTree::astree();
}
protected:
virtual std::shared_ptr<FileTreeEntry> clone() const override {
return IFileTree::clone();
}
public: // Overrides:
/**
*
*/
static void mapToArchive(IFileTree const& tree, QString path, std::vector<FileData*> const& data)
{
if (path.length() > 0) {
// when using a long windows path (starting with \\?\) we apparently can have redundant
// . components in the path. This wasn't a problem with "regular" path names.
if (path == ".") {
path.clear();
}
else {
path.append("\\");
}
}
for (auto const& entry : tree) {
if (entry->isDir()) {
const ArchiveFileTreeImpl& archiveEntry = dynamic_cast<const ArchiveFileTreeImpl&>(*entry);
QString tmp = path + archiveEntry.name();
if (archiveEntry.m_Index != -1) {
data[archiveEntry.m_Index]->addOutputFilePath(tmp.toStdWString());
}
mapToArchive(*archiveEntry.astree(), tmp, data);
}
else {
const ArchiveFileEntry& archiveFileEntry = dynamic_cast<const ArchiveFileEntry&>(*entry);
if (archiveFileEntry.m_Index != -1) {
data[archiveFileEntry.m_Index]->addOutputFilePath((path + archiveFileEntry.name()).toStdWString());
}
}
}
}
/**
*
*/
void mapToArchive(Archive &archive) const override {
mapToArchive(*this, "", archive.getFileList());
}
protected:
/**
* Overriding makeDirectory and makeFile to create file tree or file entry with index -1.
*
*/
virtual std::shared_ptr<IFileTree> makeDirectory(
std::shared_ptr<const IFileTree> parent, QString name) const override {
return std::make_shared<ArchiveFileTreeImpl>(parent, name, -1, std::vector<File>{});
}
virtual std::shared_ptr<FileTreeEntry> makeFile(
std::shared_ptr<const IFileTree> parent, QString name) const override {
return std::make_shared<ArchiveFileEntry>(parent, name, -1);
}
virtual bool doPopulate(std::shared_ptr<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& entries) const override {
// Sort by name:
std::sort(std::begin(m_Files), std::end(m_Files),
[](const auto& a, const auto& b) {
return std::get<0>(a)[0].compare(std::get<0>(b)[0], Qt::CaseInsensitive) < 0; });
// We know that the files are sorted:
QString currentName = "";
int currentIndex = -1;
std::vector<File> currentFiles;
for (auto& p : m_Files) {
// At the start or if we have reset, just retrieve the current name:
if (currentName == "") {
currentName = std::get<0>(p)[0];
}
// If the name is different, we need to create a directory from what we have
// accumulated:
if (currentName != std::get<0>(p)[0]) {
// We may or may not have an index here, it depends on the type of archive (some archives list
// intermediate non-empty folders, some don't):
entries.push_back(std::make_shared<ArchiveFileTreeImpl>(parent, currentName, currentIndex, std::move(currentFiles)));
currentFiles.clear(); // Back to a valid state.
// Reset the index:
currentIndex = -1;
}
// We can always override the current name:
currentName = std::get<0>(p)[0];
// If the current path contains only one components:
if (std::get<0>(p).size() == 1) {
// If it is not a directory, then it is a file in directly under this tree:
if (!std::get<1>(p)) {
entries.push_back(
std::make_shared<ArchiveFileEntry>(parent, currentName, std::get<2>(p)));
currentName = "";
}
else {
// Otherwize, it is the actual "file" corresponding to the directory we are listing, so we can retrieve
// the index here:
currentIndex = std::get<2>(p);
}
}
else {
currentFiles.push_back({
QStringList(std::get<0>(p).begin() + 1, std::get<0>(p).end()), std::get<1>(p), std::get<2>(p)
});
}
}
if (currentName != "") {
entries.push_back(std::make_shared<ArchiveFileTreeImpl>(parent, currentName, currentIndex, std::move(currentFiles)));
}
// Let the parent class sort the entries:
return false;
}
virtual std::shared_ptr<IFileTree> doClone() const override {
return std::make_shared<ArchiveFileTreeImpl>(nullptr, name(), m_Index, m_Files);
}
private:
mutable std::vector<File> m_Files;
};
std::shared_ptr<ArchiveFileTree> ArchiveFileTree::makeTree(Archive const& archive)
{
auto const& data = archive.getFileList();
std::vector<ArchiveFileTreeImpl::File> files;
files.reserve(data.size());
for (size_t i = 0; i < data.size(); ++i) {
files.push_back(std::make_tuple(
QString::fromStdWString(data[i]->getArchiveFilePath()).replace("\\", "/").split("/", Qt::SkipEmptyParts),
data[i]->isDirectory(),
(int) i));
}
auto tree = std::make_shared<ArchiveFileTreeImpl>(nullptr, "", -1, std::move(files));
return tree;
}
/**
* @brief Recursive function for the ArchiveFileTree::mapToArchive method. Need a template
* here because iterators from a vector of entries are not exactly the same as the iterators
* returned by a IFileTree.
*
*/
template <class It>
void mapToArchive(std::vector<FileData*> const& data, It begin, It end) {
for (auto it = begin; it != end; ++it) {
auto entry = *it;
auto* aentry = dynamic_cast<const ArchiveFileEntry*>(entry.get());
if (aentry->m_Index != -1) {
data[aentry->m_Index]->addOutputFilePath(aentry->path().toStdWString());
}
if (entry->isDir()) {
auto tree = entry->astree();
mapToArchive(data, tree->begin(), tree->end());
}
}
}
void ArchiveFileTree::mapToArchive(Archive &archive, std::vector<std::shared_ptr<const FileTreeEntry>> const& entries) {
::mapToArchive(archive.getFileList(), entries.cbegin(), entries.cend());
}
+72
View File
@@ -0,0 +1,72 @@
/*
Copyright (C) MO2 Team. All rights reserved.
This file is part of Mod Organizer.
Mod Organizer is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Mod Organizer is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ARCHIVEFILENETRY_H
#define ARCHIVEFILENTRY_H
#include "archive.h"
#include "ifiletree.h"
/**
*
*/
class ArchiveFileTree: public virtual MOBase::IFileTree {
public:
/**
* @brief Create a new file tree representing the given archive.
*
* @param archive Archive to represent by the file tree.
*
* @return a file tree representing the given archive.
*/
static std::shared_ptr<ArchiveFileTree> makeTree(Archive const& archive);
/**
* @brief Update the given archive to reflect change in this tree.
*
* This method disables files that have been removed from the file
* tree and move the ones that have been moved.
*
* @param archive The archive to update. Must be the one used to
* create the tree.
*/
virtual void mapToArchive(Archive &archive) const = 0;
/**
* @brief Update the given archive to prepare for the extraction
* of the given entries.
*
* This method "enables" files that correspond to the given entry.
*
* @param archive The archive to update. Must be the one used to
* create the tree.
* @param entries List of entries to mark for extraction. All the entries must
* come from a tree created with the given archive.
*/
static void mapToArchive(Archive &archive, std::vector<std::shared_ptr<const FileTreeEntry>> const& entries);
protected:
using IFileTree::IFileTree;
};
#endif
+8 -1
View File
@@ -246,7 +246,14 @@ QString convertToHTML(const QString &inputParam)
if ((pos < (input.size() - 1)) && (input.at(pos + 1) == '/')) {
// skip invalid end tag
int tagEnd = input.indexOf(']', pos) + 1;
pos = tagEnd;
if (tagEnd == 0) {
//no closing tag found
//move the pos up one so that the opening bracket is ignored next iteration
pos++;
}
else {
pos = tagEnd;
}
} else {
// convert the tag and content if necessary
int length = -1;
+59 -58
View File
@@ -113,7 +113,7 @@ void CategoryFactory::reset()
// 43 = Savegames (makes no sense to install them through MO)
// 45 = Videos and trailers
// 87 = Miscelanous
addCategory(0, "None", MakeVector<int>(4, 28, 43, 45, 87), 0);
addCategory(0, "None", { 4, 28, 43, 45, 87 }, 0);
}
@@ -206,63 +206,63 @@ void CategoryFactory::loadDefaultCategories()
{
// the order here is relevant as it defines the order in which the
// mods appear in the combo box
addCategory(1, "Animations", MakeVector<int>(2, 4, 51), 0);
addCategory(52, "Poses", MakeVector<int>(1, 29), 1);
addCategory(2, "Armour", MakeVector<int>(2, 5, 54), 0);
addCategory(53, "Power Armor", MakeVector<int>(1, 53), 2);
addCategory(3, "Audio", MakeVector<int>(3, 33, 35, 106), 0);
addCategory(38, "Music", MakeVector<int>(2, 34, 61), 0);
addCategory(39, "Voice", MakeVector<int>(2, 36, 107), 0);
addCategory(5, "Clothing", MakeVector<int>(2, 9, 60), 0);
addCategory(41, "Jewelry", MakeVector<int>(1, 102), 5);
addCategory(42, "Backpacks", MakeVector<int>(1, 49), 5);
addCategory(6, "Collectables", MakeVector<int>(2, 10, 92), 0);
addCategory(28, "Companions", MakeVector<int>(3, 11, 66, 96), 0);
addCategory(7, "Creatures, Mounts, & Vehicles", MakeVector<int>(4, 12, 65, 83, 101), 0);
addCategory(8, "Factions", MakeVector<int>(2, 16, 25), 0);
addCategory(9, "Gameplay", MakeVector<int>(2, 15, 24), 0);
addCategory(27, "Combat", MakeVector<int>(1, 77), 9);
addCategory(43, "Crafting", MakeVector<int>(2, 50, 100), 9);
addCategory(48, "Overhauls", MakeVector<int>(2, 24, 79), 9);
addCategory(49, "Perks", MakeVector<int>(1, 27), 9);
addCategory(54, "Radio", MakeVector<int>(1, 31), 9);
addCategory(55, "Shouts", MakeVector<int>(1, 104), 9);
addCategory(22, "Skills & Levelling", MakeVector<int>(2, 46, 73), 9);
addCategory(58, "Weather & Lighting", MakeVector<int>(1, 56), 9);
addCategory(44, "Equipment", MakeVector<int>(1, 44), 43);
addCategory(45, "Home/Settlement", MakeVector<int>(1, 45), 43);
addCategory(10, "Body, Face, & Hair", MakeVector<int>(2, 17, 26), 0);
addCategory(39, "Tattoos", MakeVector<int>(1, 57), 10);
addCategory(40, "Character Presets", MakeVector<int>(1, 58), 0);
addCategory(11, "Items", MakeVector<int>(2, 27, 85), 0);
addCategory(32, "Mercantile", MakeVector<int>(2, 23, 69), 0);
addCategory(37, "Ammo", MakeVector<int>(1, 3), 11);
addCategory(19, "Weapons", MakeVector<int>(2, 41, 55), 11);
addCategory(36, "Weapon & Armour Sets", MakeVector<int>(1, 42), 11);
addCategory(23, "Player Homes", MakeVector<int>(2, 28, 67), 0);
addCategory(25, "Castles & Mansions", MakeVector<int>(1, 68), 23);
addCategory(51, "Settlements", MakeVector<int>(1, 48), 23);
addCategory(12, "Locations", MakeVector<int>(10, 20, 21, 22, 30, 47, 70, 88, 89, 90, 91), 0);
addCategory(4, "Cities", MakeVector<int>(1, 53), 12);
addCategory(31, "Landscape Changes", MakeVector<int>(1, 58), 0);
addCategory(29, "Environment", MakeVector<int>(2, 14, 74), 0);
addCategory(30, "Immersion", MakeVector<int>(2, 51, 78), 0);
addCategory(20, "Magic", MakeVector<int>(3, 75, 93, 94), 0);
addCategory(21, "Models & Textures", MakeVector<int>(2, 19, 29), 0);
addCategory(33, "Modders resources", MakeVector<int>(2, 18, 82), 0);
addCategory(13, "NPCs", MakeVector<int>(3, 22, 33, 99), 0);
addCategory(24, "Bugfixes", MakeVector<int>(2, 6, 95), 0);
addCategory(14, "Patches", MakeVector<int>(2, 25, 84), 24);
addCategory(35, "Utilities", MakeVector<int>(2, 38, 39), 0);
addCategory(26, "Cheats", MakeVector<int>(1, 8), 0);
addCategory(15, "Quests", MakeVector<int>(2, 30, 35), 0);
addCategory(16, "Races & Classes", MakeVector<int>(1, 34), 0);
addCategory(34, "Stealth", MakeVector<int>(1, 76), 0);
addCategory(17, "UI", MakeVector<int>(2, 37, 42), 0);
addCategory(18, "Visuals", MakeVector<int>(2, 40, 62), 0);
addCategory(50, "Pip-Boy", MakeVector<int>(1, 52), 18);
addCategory(46, "Shader Presets", MakeVector<int>(3, 13, 97, 105), 0);
addCategory(47, "Miscellaneous", MakeVector<int>(2, 2, 28), 0);
addCategory(1, "Animations", { 2, 4, 51 }, 0);
addCategory(52, "Poses", { 1, 29 }, 1);
addCategory(2, "Armour", { 2, 5, 54 }, 0);
addCategory(53, "Power Armor", { 1, 53 }, 2);
addCategory(3, "Audio", { 3, 33, 35, 106 }, 0);
addCategory(38, "Music", { 2, 34, 61 }, 0);
addCategory(39, "Voice", { 2, 36, 107 }, 0);
addCategory(5, "Clothing", { 2, 9, 60 }, 0);
addCategory(41, "Jewelry", { 1, 102 }, 5);
addCategory(42, "Backpacks", { 1, 49 }, 5);
addCategory(6, "Collectables", { 2, 10, 92 }, 0);
addCategory(28, "Companions", { 3, 11, 66, 96 }, 0);
addCategory(7, "Creatures, Mounts, & Vehicles", { 4, 12, 65, 83, 101 }, 0);
addCategory(8, "Factions", { 2, 16, 25 }, 0);
addCategory(9, "Gameplay", { 2, 15, 24 }, 0);
addCategory(27, "Combat", { 1, 77 }, 9);
addCategory(43, "Crafting", { 2, 50, 100 }, 9);
addCategory(48, "Overhauls", { 2, 24, 79 }, 9);
addCategory(49, "Perks", { 1, 27 }, 9);
addCategory(54, "Radio", { 1, 31 }, 9);
addCategory(55, "Shouts", { 1, 104 }, 9);
addCategory(22, "Skills & Levelling", { 2, 46, 73 }, 9);
addCategory(58, "Weather & Lighting", { 1, 56 }, 9);
addCategory(44, "Equipment", { 1, 44 }, 43);
addCategory(45, "Home/Settlement", { 1, 45 }, 43);
addCategory(10, "Body, Face, & Hair", { 2, 17, 26 }, 0);
addCategory(39, "Tattoos", { 1, 57 }, 10);
addCategory(40, "Character Presets", { 1, 58 }, 0);
addCategory(11, "Items", { 2, 27, 85 }, 0);
addCategory(32, "Mercantile", { 2, 23, 69 }, 0);
addCategory(37, "Ammo", { 1, 3 }, 11);
addCategory(19, "Weapons", { 2, 41, 55 }, 11);
addCategory(36, "Weapon & Armour Sets", { 1, 42 }, 11);
addCategory(23, "Player Homes", { 2, 28, 67 }, 0);
addCategory(25, "Castles & Mansions", { 1, 68 }, 23);
addCategory(51, "Settlements", { 1, 48 }, 23);
addCategory(12, "Locations", { 10, 20, 21, 22, 30, 47, 70, 88, 89, 90, 91 }, 0);
addCategory(4, "Cities", { 1, 53 }, 12);
addCategory(31, "Landscape Changes", { 1, 58 }, 0);
addCategory(29, "Environment", { 2, 14, 74 }, 0);
addCategory(30, "Immersion", { 2, 51, 78 }, 0);
addCategory(20, "Magic", { 3, 75, 93, 94 }, 0);
addCategory(21, "Models & Textures", { 2, 19, 29 }, 0);
addCategory(33, "Modders resources", { 2, 18, 82 }, 0);
addCategory(13, "NPCs", { 3, 22, 33, 99 }, 0);
addCategory(24, "Bugfixes", { 2, 6, 95 }, 0);
addCategory(14, "Patches", { 2, 25, 84 }, 24);
addCategory(35, "Utilities", { 2, 38, 39 }, 0);
addCategory(26, "Cheats", { 1, 8 }, 0);
addCategory(15, "Quests", { 2, 30, 35 }, 0);
addCategory(16, "Races & Classes", { 1, 34 }, 0);
addCategory(34, "Stealth", { 1, 76 }, 0);
addCategory(17, "UI", { 2, 37, 42 }, 0);
addCategory(18, "Visuals", { 2, 40, 62 }, 0);
addCategory(50, "Pip-Boy", { 1, 52 }, 18);
addCategory(46, "Shader Presets", { 3, 13, 97, 105 }, 0);
addCategory(47, "Miscellaneous", { 2, 2, 28 }, 0);
}
@@ -329,6 +329,7 @@ QString CategoryFactory::getSpecialCategoryName(SpecialCategories type) const
case UpdateAvailable: label = QObject::tr("Update available"); break;
case HasCategory: label = QObject::tr("Has category"); break;
case Conflict: label = QObject::tr("Conflicted"); break;
case HasHiddenFiles: label = QObject::tr("Has hidden files"); break;
case Endorsed: label = QObject::tr("Endorsed"); break;
case Backup: label = QObject::tr("Has backup"); break;
case Managed: label = QObject::tr("Managed"); break;
+1
View File
@@ -43,6 +43,7 @@ public:
UpdateAvailable,
HasCategory,
Conflict,
HasHiddenFiles,
Endorsed,
Backup,
Managed,
+153
View File
@@ -0,0 +1,153 @@
#include "datatab.h"
#include "ui_mainwindow.h"
#include "settings.h"
#include "organizercore.h"
#include "messagedialog.h"
#include "filetree.h"
#include "filetreemodel.h"
#include <log.h>
#include <report.h>
using namespace MOShared;
using namespace MOBase;
// in mainwindow.cpp
QString UnmanagedModName();
DataTab::DataTab(
OrganizerCore& core, PluginContainer& pc,
QWidget* parent, Ui::MainWindow* mwui) :
m_core(core), m_pluginContainer(pc), m_parent(parent),
ui{
mwui->dataTabRefresh, mwui->dataTree,
mwui->dataTabShowOnlyConflicts, mwui->dataTabShowFromArchives},
m_firstActivation(true)
{
m_filetree.reset(new FileTree(core, m_pluginContainer, ui.tree));
m_filter.setUseSourceSort(true);
m_filter.setFilterColumn(FileTreeModel::FileName);
m_filter.setEdit(mwui->dataTabFilter);
m_filter.setList(mwui->dataTree);
m_filter.setUpdateDelay(true);
if (auto* m=m_filter.proxyModel()) {
m->setDynamicSortFilter(false);
}
connect(
&m_filter, &FilterWidget::aboutToChange,
[&]{ ensureFullyLoaded(); });
connect(
ui.refresh, &QPushButton::clicked,
[&]{ onRefresh(); });
connect(
ui.conflicts, &QCheckBox::toggled,
[&]{ onConflicts(); });
connect(
ui.archives, &QCheckBox::toggled,
[&]{ onArchives(); });
connect(
m_filetree.get(), &FileTree::executablesChanged,
this, &DataTab::executablesChanged);
connect(
m_filetree.get(), &FileTree::originModified,
this, &DataTab::originModified);
connect(
m_filetree.get(), &FileTree::displayModInformation,
this, &DataTab::displayModInformation);
}
void DataTab::saveState(Settings& s) const
{
s.geometry().saveState(ui.tree->header());
s.widgets().saveChecked(ui.conflicts);
s.widgets().saveChecked(ui.archives);
}
void DataTab::restoreState(const Settings& s)
{
s.geometry().restoreState(ui.tree->header());
// prior to 2.3, the list was not sortable, and this remembered in the
// widget state, for whatever reason
ui.tree->setSortingEnabled(true);
s.widgets().restoreChecked(ui.conflicts);
s.widgets().restoreChecked(ui.archives);
}
void DataTab::activated()
{
if (m_firstActivation) {
m_firstActivation = false;
updateTree();
}
}
void DataTab::onRefresh()
{
if (QGuiApplication::keyboardModifiers() & Qt::ShiftModifier) {
m_filetree->model()->setEnabled(false);
m_filetree->clear();
}
m_core.refreshDirectoryStructure();
}
void DataTab::updateTree()
{
m_filetree->model()->setEnabled(true);
m_filetree->refresh();
if (!m_filter.empty()) {
ensureFullyLoaded();
if (auto* m=m_filter.proxyModel()) {
m->invalidate();
}
}
}
void DataTab::ensureFullyLoaded()
{
if (!m_filetree->fullyLoaded()) {
m_filter.setFilteringEnabled(false);
m_filetree->ensureFullyLoaded();
m_filter.setFilteringEnabled(true);
}
}
void DataTab::onConflicts()
{
updateOptions();
}
void DataTab::onArchives()
{
updateOptions();
}
void DataTab::updateOptions()
{
using M = FileTreeModel;
M::Flags flags = M::NoFlags;
if (ui.conflicts->isChecked()) {
flags |= M::ConflictsOnly | M::PruneDirectories;
}
if (ui.archives->isChecked()) {
flags |= M::Archives;
}
m_filetree->model()->setFlags(flags);
updateTree();
}
+60
View File
@@ -0,0 +1,60 @@
#include "modinfodialogfwd.h"
#include "modinfo.h"
#include <filterwidget.h>
#include <QPushButton>
#include <QTreeWidget>
#include <QCheckBox>
namespace Ui { class MainWindow; }
class OrganizerCore;
class Settings;
class PluginContainer;
class FileTree;
namespace MOShared { class DirectoryEntry; }
class DataTab : public QObject
{
Q_OBJECT;
public:
DataTab(
OrganizerCore& core, PluginContainer& pc,
QWidget* parent, Ui::MainWindow* ui);
void saveState(Settings& s) const;
void restoreState(const Settings& s);
void activated();
void updateTree();
signals:
void executablesChanged();
void originModified(int originID);
void displayModInformation(ModInfo::Ptr m, unsigned int i, ModInfoTabIDs tab);
private:
struct DataTabUi
{
QPushButton* refresh;
QTreeView* tree;
QCheckBox* conflicts;
QCheckBox* archives;
};
OrganizerCore& m_core;
PluginContainer& m_pluginContainer;
QWidget* m_parent;
DataTabUi ui;
std::unique_ptr<FileTree> m_filetree;
std::vector<QTreeWidgetItem*> m_removeLater;
MOBase::FilterWidget m_filter;
bool m_firstActivation;
void onRefresh();
void onItemExpanded(QTreeWidgetItem* item);
void onConflicts();
void onArchives();
void updateOptions();
void ensureFullyLoaded();
};
File diff suppressed because it is too large Load Diff
+95 -29
View File
@@ -20,15 +20,14 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#ifndef DIRECTORYREFRESHER_H
#define DIRECTORYREFRESHER_H
#include <directoryentry.h>
#include "shared/fileregisterfwd.h"
#include "profile.h"
#include <QObject>
#include <QMutex>
#include <QStringList>
#include <vector>
#include <set>
#include <tuple>
#include "profile.h"
/**
* @brief used to asynchronously generate the virtual view of the combined data directory
@@ -39,24 +38,37 @@ class DirectoryRefresher : public QObject
Q_OBJECT
public:
struct EntryInfo
{
EntryInfo(const QString &modName, const QString &absolutePath,
const QStringList &stealFiles, const QStringList &archives, int priority)
: modName(modName), absolutePath(absolutePath), stealFiles(stealFiles)
, archives(archives), priority(priority)
{
}
/**
* @brief constructor
*
**/
DirectoryRefresher();
QString modName;
QString absolutePath;
QStringList stealFiles;
QStringList archives;
int priority;
};
~DirectoryRefresher();
DirectoryRefresher(std::size_t threadCount);
// noncopyable
DirectoryRefresher(const DirectoryRefresher&) = delete;
DirectoryRefresher& operator=(const DirectoryRefresher&) = delete;
/**
* @brief retrieve the updated directory structure
*
* returns a pointer to the updated directory structure. DirectoryRefresher
* deletes its own pointer and the caller takes custody of the pointer
*
*
* @return updated directory structure
**/
MOShared::DirectoryEntry *getDirectoryStructure();
MOShared::DirectoryEntry* stealDirectoryStructure();
/**
* @brief sets up the mods to be included in the directory structure
@@ -107,7 +119,16 @@ public:
* @param directory
* @param stealFiles
*/
void addModFilesToStructure(MOShared::DirectoryEntry *directoryStructure, const QString &modName, int priority, const QString &directory, const QStringList &stealFiles);
void addModFilesToStructure(
MOShared::DirectoryEntry *directoryStructure, const QString &modName,
int priority, const QString &directory, const QStringList &stealFiles);
void addMultipleModsFilesToStructure(
MOShared::DirectoryEntry *directoryStructure,
const std::vector<EntryInfo>& entries,
DirectoryRefreshProgress* progress=nullptr);
void updateProgress(const DirectoryRefreshProgress* p);
public slots:
@@ -118,31 +139,76 @@ public slots:
signals:
void progress(int progress);
void progress(const DirectoryRefreshProgress* p);
void error(const QString &error);
void refreshed();
private:
struct EntryInfo {
EntryInfo(const QString &modName, const QString &absolutePath,
const QStringList &stealFiles, const QStringList &archives, int priority)
: modName(modName), absolutePath(absolutePath), stealFiles(stealFiles)
, archives(archives), priority(priority) {}
QString modName;
QString absolutePath;
QStringList stealFiles;
QStringList archives;
int priority;
};
private:
std::vector<EntryInfo> m_Mods;
std::set<QString> m_EnabledArchives;
MOShared::DirectoryEntry *m_DirectoryStructure;
std::unique_ptr<MOShared::DirectoryEntry> m_Root;
QMutex m_RefreshLock;
std::size_t m_threadCount;
std::size_t m_lastFileCount;
void stealModFilesIntoStructure(
MOShared::DirectoryEntry *directoryStructure, const QString &modName,
int priority, const QString &directory, const QStringList &stealFiles);
};
class DirectoryRefreshProgress : QObject
{
Q_OBJECT;
public:
DirectoryRefreshProgress(DirectoryRefresher* r) :
QObject(r), m_refresher(r), m_modCount(0), m_modDone(0), m_finished(false)
{
}
void start(std::size_t modCount)
{
m_modCount = modCount;
m_modDone = 0;
m_finished = false;
}
bool finished() const
{
return m_finished;
}
int percentDone() const
{
int percent = 100;
if (m_modCount > 0) {
const double d = static_cast<double>(m_modDone) / m_modCount;
percent = static_cast<int>(d * 100);
}
return percent;
}
void finish()
{
m_finished = true;
}
void addDone()
{
++m_modDone;
m_refresher->updateProgress(this);
}
private:
DirectoryRefresher* m_refresher;
std::size_t m_modCount;
std::atomic<std::size_t> m_modDone;
bool m_finished;
};
#endif // DIRECTORYREFRESHER_H
+3 -1
View File
@@ -14,11 +14,13 @@
<file name="Qt5Positioning.dll"/>
<file name="Qt5PrintSupport.dll"/>
<file name="Qt5Qml.dll"/>
<file name="Qt5QmlModels.dll"/>
<file name="Qt5QmlWorkerScript.dll"/>
<file name="Qt5Quick.dll"/>
<file name="Qt5QuickWidgets.dll"/>
<file name="Qt5WebChannel.dll"/>
<file name="Qt5SerialPort.dll"/>
<file name="Qt5Svg.dll"/>
<file name="Qt5WebChannel.dll"/>
<file name="Qt5WebEngineCore.dll"/>
<file name="Qt5WebEngineWidgets.dll"/>
<file name="Qt5WebSockets.dll"/>

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