Compare commits

...
112 Commits
Author SHA1 Message Date
pre-commit-ci[bot] efe2a02d5d [pre-commit.ci] Pre-commit autoupdate. (#2421)
updates:
- [github.com/pre-commit/mirrors-clang-format: v22.1.2 → v22.1.5](https://github.com/pre-commit/mirrors-clang-format/compare/v22.1.2...v22.1.5)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-08 15:58:05 +02:00
Mikaël Capelle a931277b2b Update VCPKG registries to use 7z 26.01. (#2413) 2026-06-22 20:20:18 +02:00
Mikaël Capelle 4907704797 Send local saves to recycle bin when switching from global to local saves instead of deleting them directly. (#2401) 2026-06-06 09:28:12 +02:00
Jonathan Feenstra c097670b09 Update about dialog (#2400) 2026-05-23 10:28:27 -05:00
Jeremy Rimpo a329ce59ac Translation file updates 2026-05-21 23:53:44 -05:00
Jeremy Rimpo 7a4bb3652e Restore tutorials 2026-05-17 02:29:21 -05:00
Jonathan Feenstra ab38cf0e05 Improve code for reading text files line-by-line 2026-05-17 02:28:30 -05:00
Jeremy Rimpo 0c95bf22e6 Add app.manifest to set longPathAware 2026-05-17 02:25:59 -05:00
Jonathan Feenstra 55de581ee9 Add setting to show notifications when downloads complete or fail (#2338) 2026-05-15 02:23:09 -05:00
Jeremy Rimpo 6748953d35 Use new Nexus Tools location for MO2 2026-05-15 02:00:05 -05:00
Jonathan Feenstra 22b1695701 Install manager metadata updates
* Fix missing author and uploader when installing mods
* Refactor doInstall parameters into a struct
2026-05-14 01:43:46 -05:00
3efaf7c946 Migrating to OAuth Authentication (#2374)
Co-authored-by: aglowinthefield <146008217+aglowinthefield@users.noreply.github.com>
Co-authored-by: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com>
2026-05-12 13:50:45 -05:00
Jeremy Rimpo 41ffb25c03 Use filesystem paths with BSATK input / output (#2391) 2026-05-07 15:46:47 -05:00
9c6f48a440 Stable DownloadId refactor (#2375)
* Encapsulate the downloads directory watcher in DirWatcherManager

QFileSystemWatcher suppression currently relies on public static start/end
methods and a static counter. Seven call sites pair them raw, one of them
outside the class. Any exception between a pair permanently disables the
watcher, and the static counter implies a singleton DownloadManager.

A new DirWatcherManager owns the watcher, the counter (now an instance
member), and the filtering. The only way to suspend is an RAII Guard
obtained via a scopedGuard() factory. All raw pairs migrate to guards. A
TODO flags the existing processEvents() in the dtor as a known reentrancy
hazard worth replacing later.

* Replace aboutToUpdate/update(int) with ModelResetGuard

Replace the fragile two-signal protocol with a refcounted RAII
ModelResetGuard. Split update(int) into aboutToResetModel/modelReset
(guard only) and rowChanged(int); notifyRowChanged() is suppressed while
a reset is active.

Fixes "beginResetModel without endResetModel" warnings from three sites
in downloadFinished/removeDownload that were pairing reset with a row
update. removePending only opens a guard when an actual match is removed.

* Centralize row notifications in setState and fix missed emits

setState emits notifyRowChanged itself, uses indexByInfo (-1 when
untracked), and re-looks up the row at each use so reply->abort() and
plugin callbacks that re-enter and erase info don't produce stale
signals.

Remove the trailing emit loop from createMetaFile and the now-redundant
notifyRowChanged calls scattered after setState. Add the two missing
emits in restoreDownload (after m_Hidden) and metaDataChanged (after
rename). Guard downloadFinished with a top-level DirWatcherGuard to
prevent filesystem events from its writes racing with model updates.

* Fix comma operator in addNXMDownload pending-dedup check

The game-name comparison result was discarded by the comma operator,
so the dedup only matched modId/fileId across all games.

* Fix lost finished() signal on fast downloads

Hoist the file-exists prompt out of startDownload so setup is straight-line.
Connect finished() last and dispatch manually if the reply already finished.

* Fix memory leak in DownloadInfo::createFromMeta

Move the allocation past the early-return checks so path-mismatch and
hidden-skip paths no longer leak a fresh DownloadInfo.

* Sanitize suffix path in getDownloadFileName

The collision-avoidance branch was using the raw baseName, so invalid
characters sanitized out of the initial path leaked into the suffixed one.

* [pre-commit.ci] Auto fixes from pre-commit.com hooks.

* Remove unused alphabetical translation vector

m_AlphabeticalTranslation was written but never read; drop it along with
refreshAlphabeticalTranslation, ByName, and the LessThanWrapper helper.

* Address PR feedback: fix redundant check and move refresh outside try catch.

* Coalesce the removeDownload reset with the following refreshList

Moves the ModelResetGuard out of the try-catch so it also wraps the
refreshList() call below. Without this, one reset fires when the guard
destructs at the end of the try block and another fires from
refreshList's own guard, producing two resets where one is sufficient.

* Guard the .meta creation in openMetaFile against the directory watcher

openMetaFile creates the .meta file via QSettings when one does not
exist; the disk write fires directoryChanged and triggers a spurious
refreshList. Wrap it in a DirWatcherManager::Guard like the other
meta-file editing paths.

* Extract getValidGameShortName method in download manager (#2380)

* Add stable download id index and PendingDownload struct

Replace the (game, mod, file) tuple backing m_PendingDownloads with a
named struct, and add m_ByID as an O(1) m_DownloadID-to-info index kept
in sync with every m_ActiveDownloads mutation. Encapsulate the id
counter behind DownloadInfo::newDownloadID(), the only supported way to
consume from s_NextDownloadID.

Infrastructure only; external behaviour is unchanged.

* Return stable ids from the plugin-facing download API

startDownloadURLs / startDownloadNexusFile / addNXMDownload now reserve
and return m_DownloadID instead of a stale index. Plugin callbacks fire
with m_DownloadID; downloadPath looks up via m_ByID. nxmDownloadURLsAvailable
threads the reserved id into the materializing DownloadInfo, and Nexus
API failures wake waiting plugins via notifyPendingDownloadFailed.

Incidental: startDownload now returns bool and frees newDownload on
output-open failure; createMetaFile is deferred past that check so
failed starts no longer leave an orphan .meta.

* Split downloadFinished into onReplyFinished slot and finishDownload

The old dual-use downloadFinished(int = 0) took either an explicit index
or relied on sender() when called as a slot. Split into a sender-resolved
slot and an id-based direct call, removing the ambiguous index-zero path.

* Introduce DownloadID alias and row/id accessors

Add a DownloadID type alias for the stable per-download handle and two
public accessors (downloadIDAtRow, rowForDownloadID) so callers can
translate between the view's row vocabulary and the model's id
vocabulary without reaching into the manager's internals. DownloadList
now embeds the DownloadID in QModelIndex::internalId() so any code
holding an index can identify the download directly.

* Convert cancel/pause/resume action methods to take DownloadID

The four methods (cancel, pause, resume, resumeDownloadInt) now accept
a DownloadID, resolve through m_ByID, and no longer care about row
positions. Internal callers iterate DownloadInfo* or look up via id;
DownloadsTab translates row -> id at the connect boundary so the
view's int-shaped signals keep working unchanged.

Also switches the remaining unsigned int signatures that refer to the
download id (finishDownload, downloadInfoByID, PendingDownload::reservedID,
m_ByID, newDownloadID, s_NextDownloadID) to the DownloadID alias.

Drive-by fix: finishDownload's retry branch could read info->m_Tries
after info had been deleted in the CANCELED/retries-exhausted branch
above; now re-resolves via m_ByID.value(id) before touching any fields.

* [pre-commit.ci] Auto fixes from pre-commit.com hooks.

* fix warnings about unused variables and size_t types

* cleanup dead code

* avoid calling processEvents when releasing the DirWatcherGuard

* [pre-commit.ci] Auto fixes from pre-commit.com hooks.

* use QEventLoop instead of manual ProcessEvents

* don't call processEvents in download started and defer handling finish state in event loop

* Cleanup pending download in case of failure.

* Add missing notifyPendingDownloadFailed if user cancels

* [pre-commit.ci] Auto fixes from pre-commit.com hooks.

* Refactor pending download failure handling and cover rename failures

* fix rebase bug, addNXMDownload not returning the correct type

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com>
2026-05-07 17:38:51 +02:00
Jonathan Feenstra 3070a60ab7 Don't apply LOOT-sorted load order until user clicks "Apply" (#2382)
* Add sorted plugin list to LOOT dialog (markdown and button)
* Prefix plugins with checkboxes to show whether they're enabled
2026-05-06 12:51:17 -05:00
Jeremy Rimpo 6d02ef2b75 Defer second nxmhandler call (#2390)
- Calls run in parallel leading to extraneous setup dialogs
- This only calls the nxm schema registration after modl is done
2026-05-06 11:08:57 -05:00
Jeremy Rimpo f5d89ad625 Download command: Add game instance check (#2388)
* Add game instance check
- Should be ignored if not passed to command
- Functions much like NXM game check
2026-05-04 16:40:32 -05:00
Al ca7a149874 Improve mod update check accuracy (#2385)
* Index API response into lookup maps

* extract new findLatestActiveSuccessor method from update check function

* extract method to check if a file is active

* use new isActiveFileStatus in modInfoRegular

* fix bug when merging during mod install

* remember ordering of installed nexus file ids

* refactor update check logic to prioritize Nexus file IDs over filenames

* refactor nxmUpdatesAvailable to simplify update checking logic

* refactor update check logic to find Nexus file IDs by filename and streamline successor retrieval

* refactor update checking to streamline version resolution and improve successor retrieval
2026-05-03 21:47:20 -05:00
Jeremy Rimpo ef7499aade Extended MODL / direct download handling (#2384)
* Extended MODL / direct download handling
- name, modname, version, and source options added to download command
- nxmhandler init adds schemas and MODL entry with default launch args
- Add MODL register button to general tab
- On window display, call meta function to trigger both registrations
2026-05-03 03:04:49 -05:00
Jeremy Rimpo 2e393aa3cc Handle Nexus collections links (#2383)
- Pops up dialog when the NXM link is a collection
- Collection link data available, though still unsupported
2026-05-02 10:45:09 -05:00
Mick dc420a258a Change IconDelegate::paintIcons to only execute when iconWidth > 0 (#2362) 2026-04-27 08:58:17 +02:00
Jonathan Feenstra 49da80c2a4 Make command-line arguments -i "" launch the portable instance (#2341) 2026-04-27 08:57:00 +02:00
Al f80ad0435c fix crash when CWD is not set to app directory (#2379) 2026-04-26 21:43:16 -05:00
Jeremy Rimpo 925bade315 Disabling tutorials (#2366) 2026-04-17 10:17:59 +02:00
Jonathan Feenstra 9deaf71362 Add more contributors to the about dialog (#2369) 2026-04-17 10:17:11 +02:00
Jeremy Rimpo 3a5140bb8f Starfield: Updated blueprint / blueprint prefix support (#2368)
* Add blueprint handling with blueprintships

* Blueprint changes
- Add tooltips
- Add warnings
- Handle blueprint prefixes properly

* Make sure we're assigning the property
2026-04-16 10:20:50 -05:00
Jeremy Rimpo 05593c0347 Update libloot dll name in sanity check (#2370) 2026-04-16 10:17:13 -05:00
Jeremy Rimpo ca4e81ca86 Removing references to openssl (#2367) 2026-04-16 14:09:53 +02:00
Jeremy Rimpo 6bd8bcc239 Update vcpkg targets (#2365) 2026-04-15 09:59:11 +02:00
Mick 7528d023c4 fix header guard typos (#2364) 2026-04-15 09:27:38 +02:00
pre-commit-ci[bot] 662f033295 [pre-commit.ci] Pre-commit autoupdate. (#2357)
* [pre-commit.ci] Pre-commit autoupdate.

updates:
- [github.com/pre-commit/mirrors-clang-format: v21.1.8 → v22.1.2](https://github.com/pre-commit/mirrors-clang-format/compare/v21.1.8...v22.1.2)

* [pre-commit.ci] Auto fixes from pre-commit.com hooks.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-04-09 13:16:16 +02:00
Jonathan Feenstra 2043d9931c Remove "Categories: " tooltips when there are no categories (#2339) 2026-02-18 19:48:12 +01:00
Jonathan Feenstra 4da0bffeee Add instance manager to plugin API (#2335) 2026-02-08 10:08:10 +01:00
Jonathan Feenstra a394f02e97 Add executables list to plugin API (#2327) 2026-01-31 16:49:46 +01:00
Jonathan Feenstra aa44561e86 Change IOrganizer::profile return type to a shared_ptr (#2322) 2026-01-11 17:31:26 +01:00
Jonathan Feenstra 717b5ac389 Add instanceName and profiles methods to plugin API (#2321) 2026-01-11 12:36:07 +01:00
pre-commit-ci[bot] 1505519ecd [pre-commit.ci] Pre-commit autoupdate. (#2320)
updates:
- [github.com/pre-commit/mirrors-clang-format: v21.1.2 → v21.1.8](https://github.com/pre-commit/mirrors-clang-format/compare/v21.1.2...v21.1.8)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-01-05 19:38:47 +01:00
Jonathan Feenstra e5ac1cc82d Add executable setting to minimize MO2 to the system tray while running (#2313) 2026-01-03 15:48:06 +01:00
Mikaël Capelle d5bd9603c6 Add missing Qt dependencies in CI. (#2317) 2026-01-03 14:49:24 +01:00
pre-commit-ci[bot] cc78137eb5 [pre-commit.ci] Pre-commit autoupdate. (#2295)
updates:
- [github.com/pre-commit/pre-commit-hooks: v5.0.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v5.0.0...v6.0.0)
- [github.com/pre-commit/mirrors-clang-format: v20.1.7 → v21.1.2](https://github.com/pre-commit/mirrors-clang-format/compare/v20.1.7...v21.1.2)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-10-07 15:01:47 +02:00
itch 8016e77723 fix(qt): remove obsolete call to AA_EnableHighDpiScaling (#2283) 2025-09-15 09:40:50 +02:00
Mikaël Capelle b77b2722b7 Fix an issue with implementation of CombinedModDataContent. (#2278) 2025-09-03 10:13:06 +02:00
Jonathan Feenstra d52fcccb83 Add author and uploader columns to mod list (#2269) 2025-08-18 07:55:52 +02:00
Mikaël Capelle 6c64236e2e Allow non-cache build in CI when Azure variables are not available. (#2270) 2025-08-17 12:32:23 +02:00
pre-commit-ci[bot] 95b9ab2e45 [pre-commit.ci] Pre-commit autoupdate. (#2258)
updates:
- [github.com/pre-commit/mirrors-clang-format: v19.1.5 → v20.1.7](https://github.com/pre-commit/mirrors-clang-format/compare/v19.1.5...v20.1.7)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-07-08 07:50:31 +02:00
Mikaël Capelle 28e712c8a3 Add version of MO2 plugin loaded in logs. (#2252) 2025-06-06 15:06:11 +02:00
Mikaël Capelle 87d0f2eeb6 Fix registry for 2.5.3-beta.2. (#2250) 2025-05-29 14:24:52 +02:00
Mikaël Capelle 455b5075f1 Update registry for 2.5.3-beta.2. (#2249) 2025-05-29 13:06:12 +02:00
Mikaël Capelle 39210af3e5 Move to VCPKG (#2068)
* Remove SConscript related files.
* Force-load translations from uibase and gamebryo/creation.
* Bring githubpp here and add a standalone preset.
* Switch VersionInfo -> Version for ModOrganizer2. (#2063)
* Add pre-commit hook.
* Use 7zip build from VCPKG registry.
* Use archive.dll from the bin folder instead of dlls.
2025-05-29 11:04:36 +02:00
Jeremy RimpoandMikaël Capelle 3a8ea3ccce Oblivion Remastered Meta PR (#2241)
* Allow for mod directory maps
- Set main data files based on game
- Mapped mod directories to VFS
- Update overwrite setup

* Skip if mod contains no 'data' dir

* More mod directory compatibility fixes

* Workaround for Obl:Rem save location
- SLocalSavePath does nothing yet MO2 wants to use it to override the default save location
- This only applies to BGS games anyway, we should move this logic

* First pass for overwrite mod directory support

* More overwrite move / delete restrictions

* Fix issue with moving directories that are not required

* Formatting pass

* More modDataDirectory updates

* Formatting

---------

Co-authored-by: Mikaël Capelle <capelle.mikael@gmail.com>
2025-05-23 14:08:01 -05:00
5d766e94a7 Mass Metadata Parsing: Prevent re-querying and manual prompts to enter missing data (#2135)
* Add a button to "Query Info" of every download in the list

---------

Co-authored-by: Deewens <dudonadrien@gmail.com>
Co-authored-by: KenJyn76 <liambonilla@gmail.com>
Co-authored-by: Al <26797547+Al12rs@users.noreply.github.com>
2025-05-23 09:24:23 +02:00
Jonathan Feenstra a823d2aa88 Ignore conflicts between hidden files (#2148)
* Ignore conflicts between hidden files
* Optimize checks for .mohidden extension
2025-05-23 09:23:36 +02:00
RJandRJ b531bbff39 Update following SafeWriteFile changes (#2218)
Co-authored-by: RJ <Liderate@users.noreply.github.com>
2025-05-23 09:18:03 +02:00
RJandRJ 3ef0db4cca Speedup refresh when archive parsing is enabled and updateBSAList (#2239)
* Precompute load order for ModThreads
* Precompute file infos for plugin association check

---------

Co-authored-by: RJ <Liderate@users.noreply.github.com>
2025-05-23 09:15:43 +02:00
Jeremy Rimpo 15f3d2ba05 Fix an error when filters hide highlighted rows (#2245)
- Crash caused by dataChanged triggering selectionChanged in loop
- Repaint accomplishes what we need
2025-05-22 14:35:48 -05:00
Jeremy Rimpo 48f1f600de Update copyrights (#2246) 2025-05-22 20:51:49 +02:00
Mikaël Capelle a41028fafc Update following USVFS move to VCPKG. (#2244) 2025-05-22 19:35:44 +02:00
Jeremy Rimpo eddc30a47f Dependency Updates Meta PR (#2242)
* Update dll manifests
* Fixes for emit / model refresh issues
2025-05-22 10:38:39 +02:00
RJandRJ 52b37a760c Store integer instead of QString in categories table ID columns (#2230)
Co-authored-by: RJ <Liderate@users.noreply.github.com>
2025-04-12 14:46:03 +02:00
RJandRJ bff386d277 Do not sort categories table while adding rows (#2229)
Co-authored-by: RJ <Liderate@users.noreply.github.com>
2025-04-01 13:33:52 +02:00
Jonathan Feenstra d2832ec9c3 Add new contributors to the about dialog (#2175) 2025-03-01 11:49:18 +01:00
Chris Djali 62ccbb1d02 Write BOM if original file used one (#2213)
Important for UTF-16 as lots of things can't detect or read UTF-16 without a BOM
2025-02-28 19:52:49 +01:00
Jonathan Feenstra 6299be28e1 Add form and header versions to plugin list tool tips and plugin API and add more columns (#2200) 2025-01-31 20:07:41 +01:00
Jonathan Feenstra 9049e65c5e Add startDownloadNexusFileForGame (#2181) 2025-01-02 14:10:53 +01:00
Jonathan Feenstra f8340e1620 Highlight mods that contain selected files in data tab (#2179) 2025-01-02 08:52:38 +01:00
Jonathan Feenstra 110014bf5e Update readme (#2180) 2024-12-25 11:22:19 +01:00
Jonathan Feenstra 91912f5fef (Un-)endorse & (un-)track mods from the same source (#2141) 2024-10-30 16:20:39 +01:00
Jonathan Feenstra f42a9f1cef Fix error message showing even though instance is already selected (#2154) 2024-10-30 15:20:04 +01:00
Jonathan Feenstra 61ef16d08d Hide hidden folders if "show hidden files" is unchecked in data tab (#2146) 2024-10-16 08:36:12 +02:00
Jonathan Feenstra c44ee31e9f Prevent crash when opening NXM link before selecting instance (#2144) 2024-10-15 11:02:56 +02:00
Jonathan Feenstra 08fc25d641 Show blueprint master count in plugin counter tooltip and hide unsupported plugin types (#2143) 2024-10-13 13:24:43 +02:00
Jonathan Feenstra f305502c5d Match capitilization of "Hidden files" in data tab with downloads tab (#2142) 2024-10-13 12:42:01 +02:00
Jonathan Feenstra b6de58f2d3 Highlight masters of selected plugins (#2140) 2024-10-12 13:37:58 +02:00
Jonathan Feenstra 75e24cd926 Rename Optional ESPs tab to Optional Plugins and improve wording (#2134) 2024-10-10 13:50:24 +02:00
Jonathan Feenstra bafc058b7f Add filter checkbox to data tab to show/hide hidden files (#2136) 2024-10-10 13:49:31 +02:00
Jonathan Feenstra 71434efaa9 Include notes in search when filtering mods if the column is enabled (#2139) 2024-10-10 13:45:40 +02:00
Jonathan Feenstra 8f1dbe9f35 Resize columns to contents in notifications window (#2128) 2024-10-03 09:48:50 +02:00
Jeremy RimpoandJonathan Feenstra 19fae10b2b Starfield Updates: Shattered Space & Blueprint Support (#2131)
---------

Co-authored-by: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com>
2024-10-03 09:46:53 +02:00
Jonathan Feenstra 7ed06a77c1 Add author and description methods to IPluginList (#2118) 2024-09-28 19:58:29 +02:00
Mikaël Capelle 9c130cbf2f Bump version to 2.5.2. (#2090) 2024-08-04 09:58:53 +02:00
Mikaël Capelle ea38fdc6ce Replace chopped by mid in download list. (#2089) 2024-08-03 13:37:39 +02:00
Mikaël Capelle 89f39ef200 Bump version to 2.5.2rc2. (#2084) 2024-08-01 10:58:31 +02:00
Mikaël Capelle acd201157d Move slot connections to avoid issue when starting MO2 to download a NXM link. (#2082)
* Move slot connections to avoid issue when starting MO2 to download a NXM link.
2024-08-01 10:40:44 +02:00
Mikaël Capelle f11925ab88 Fix FIXABLE status for ModDataChecker. (#2080)
* Fix FIXABLE status for ModDataChecker.
* Fix issue with registerFeature() without games.
2024-07-28 14:39:20 +02:00
Mikaël Capelle 2395c13c25 Bump version to 2.5.2rc1. (#2078) 2024-07-21 16:49:38 +02:00
Mikaël Capelle cc92f6cf88 Set default style to 'windowsvista' and allow stylesheet to modify base style (#2072)
* Set 'windowsvista' as the default style.
* Allow stylesheet to modify base style.
2024-07-19 09:49:53 +02:00
Jeremy Rimpo 193442e773 Archive preview support (#2056)
* Support for archive file previews
- Should account for alternates
- Extracts files and requests preview from plugins that claim support
2024-07-11 16:46:29 +02:00
Jeremy Rimpo a4f6298111 Parse unmanaged file location when creating ModInfoForeign (#2053)
* Parse unmanaged file location when creating ModInfoForeign
- Fixes issues with secondaryDataDirectories
* Revert SF memory address changes
- CCC implementation prevents the need to determine core plugin LO by dependency chains
* The light flag wins over the medium flag
- I had expected the opposite, but apparently the light flag still wins if both are set. This shouldn't really happen but it's possible, even with the CK
* Update display to account for multi-flagged plugins
- Show both icons, warn if both set
2024-06-22 08:31:26 +02:00
Twinki d3b647ab2b Use new Skip File & Skip Directory in usvfs (#2033)
* Use new Skip File & Skip Directory in usvfs.

# Motivations
https://github.com/ModOrganizer2/usvfs/pull/61 Highlights some reasons why the ability to skip files & directories would be beneficial

# Modifications
- Add two new settings, `skip_file_suffixes` and `skip_directories`
- Wire the two new settings up to usvfs
- Add two new buttons to the `Workarounds` dialog, one to adjust Skip File Suffixes and another for Skip Directories, both buttons act nearly identical to the Executable Blacklist button
- Add a new grouping in the `Workarounds` dialog box that contains the usvfs buttons to keep the dialog a tad organized
2024-06-15 18:51:47 +02:00
Jeremy Rimpo 6d08d434a8 Add medium plugin support (Starfield) (#2048)
* Add medium plugin support (Starfield)
- Coopt the overlay support for the new 'medium' / ESH plugin flag
- Update various displays to include ESH info
* Rework address display for SF weirdness
* Fix core ESH display
2024-06-13 17:51:09 +02:00
Mikaël Capelle 3d8bfdd1d4 Fix manifest for debug mode. (#2047) 2024-06-10 20:46:00 +02:00
RJ fff03d34e2 PluginList::refresh speedup (#2046)
* Move loadOrderMechanism out of loop
* PluginList::refresh reduce number of loops
2024-06-10 15:55:32 +02:00
Mikaël Capelle 88c386d74d Refactoring of game features for better management. (#2043) 2024-06-09 12:18:17 +02:00
Mikaël Capelle c43535f5bc Update for new USVFS function scheme. (#2044)
* Update for new USVFS function scheme.
* Fix call to usvfsVersionString().
* Move USVFS to mo2 dependencies instead of third party in CI.
2024-06-09 11:00:13 +02:00
Jeroen Ruigrok van der Werven 3d18f0cd38 Only list instance directory with a MO INI file (#1965) 2024-06-08 07:56:25 +02:00
Mikaël Capelle a11617ff65 Use MO2 formatting action. (#2032) 2024-05-26 12:20:02 +02:00
Mikaël CapelleandTwinki 1871f32a8d Use lootGameName() and displayGameName() in initial places. (#2030)
* Use `displayGameName()` in create instance dialogs & the main window, this doesn't cover all places `gameName()` was being used for purely display reasons, but it covers the bulk.
* Use `lootGameName()` instead of `gameShortName()` for LOOT cli initiation.
* Use game display name in status bar.

---------

Co-authored-by: Twinki <Twinki@users.noreply.github.com>
2024-05-26 11:12:08 +02:00
Mikaël Capelle fa82d1cca1 Switch from fmtlib to std::format. (#2031)
* Switch from fmtlib to std::format.
* Remove libffi from dependencies in Github action.
2024-05-25 13:14:46 +02:00
Jeremy Rimpo 9ee4c5afe1 Disable ESLs when no ESL support (#2026)
* Show ESL plugins but disable and warn if unsupported
2024-05-19 09:40:47 +02:00
RJandLiderate a1d199134d Fixes for stylesheets that use transparent backgrounds (#2029)
* Remove uneeded "Fix" text

* Don't set Qt::WA_OpaquePaintEvent when imagesThumbnails has transparent base

---------

Co-authored-by: Liderate <Liderate@users.noreply.github.com>
2024-05-19 09:40:17 +02:00
RJandLiderate 16423b2682 Directly open logs and crashDumps folders from diagnostics settings (#2028)
Co-authored-by: Liderate <Liderate@users.noreply.github.com>
2024-05-19 09:15:50 +02:00
Mikaël Capelle 5adb1ec43d Merge pull request #1962 from ashemedai/ignore_cache_instance
Ignore Qt-created 'cache' directory in list of instances.
2024-01-01 12:47:18 +01:00
Jeroen Ruigrok van der Werven 4472df8656 Ignore Qt-created 'cache' directory 2023-12-31 13:35:26 +01:00
Jeremy Rimpo 45c017de2f Merge pull request #1959 from ModOrganizer2/category_alternate_source
Use primary game source for categories if defined
2023-12-28 15:03:35 -06:00
Jeremy Rimpo b350afee9e Use primary game source for categories if defined 2023-12-28 03:26:39 -06:00
Jeremy Rimpo b3d27472cf Merge pull request #1949 from ModOrganizer2/251rc1
Update version to 2.5.1 RC 1
2023-12-16 16:47:18 -06:00
Jeremy Rimpo e1932b34ea Update version to 2.5.1 RC 1 2023-12-16 16:46:39 -06:00
Jeremy Rimpo 70a41a9b27 Merge pull request #1941 from ModOrganizer2/dummy-display-tweak
Change recordless plugin display to flag icon
2023-12-16 16:30:32 -06:00
Jeremy Rimpo 20aa98b511 Change recordless plugin display to flag icon 2023-12-05 19:23:09 -06:00
Mikaël Capelle 783c05478f Merge pull request #1937 from ModOrganizer2/null-category-fix
Null category fix
2023-12-03 09:04:41 +01:00
Jeremy Rimpo 0315a88bd8 Rename sort button to match UI 2023-12-02 15:53:29 -06:00
Jeremy Rimpo 026fec4468 Fix crash if no Nexus category is assigned 2023-12-02 15:52:25 -06:00
212 changed files with 10700 additions and 12730 deletions
@@ -7,7 +7,7 @@ assignees: ''
---
**This template is useful to add basic support using https://github.com/ModOrganizer2/modorganizer-basic_games.**
**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.**
+20 -7
View File
@@ -2,19 +2,32 @@ name: Build ModOrganizer 2
on:
push:
branches: master
branches: [master]
pull_request:
types: [opened, synchronize, reopened]
env:
VCPKG_BINARY_SOURCES: ${{ vars.AZ_BLOB_VCPKG_URL != '' && format('clear;x-azblob,{0},{1},readwrite', vars.AZ_BLOB_VCPKG_URL, secrets.AZ_BLOB_SAS) || '' }}
jobs:
build:
runs-on: windows-2022
steps:
- name: Build ModOrganizer 2
- name: Build ModOrganizer
id: build-modorganizer
uses: ModOrganizer2/build-with-mob-action@master
with:
qt-modules: qtpositioning qtwebchannel qtwebengine qtwebsockets
mo2-third-parties:
7z zlib fmt gtest libbsarch libloot openssl libffi bzip2 python lz4 spdlog
boost boost-di sip pyqt pybind11 ss licenses explorerpp usvfs
mo2-dependencies: cmake_common uibase githubpp bsatk esptk archive lootcli game_gamebryo
qt-modules: qtpositioning qtwebchannel qtwebengine qtwebsockets qtnetworkauth
mo2-dependencies: usvfs uibase bsatk esptk archive lootcli
- name: Install ModOrganizer
shell: pwsh
run: |
cmake --install vsbuild --config RelWithDebInfo
working-directory: ./build/${{ github.event.repository.name }}
- name: Package ModOrganizer
uses: actions/upload-artifact@master
with:
name: modorganizer
path: ./install/bin
+3 -3
View File
@@ -10,8 +10,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run clang-format
uses: jidicula/clang-format-action@v4.11.0
- name: Check format
uses: ModOrganizer2/check-formatting-action@master
with:
clang-format-version: "15"
check-path: "."
exclude-regex: "third-party"
+4 -1
View File
@@ -8,9 +8,12 @@ src/*.bak
CMakeLists.txt.user
edit
/CMakeFiles
.idea
.idea/*
!.idea/filetypes/
!.idea/filetypes/qt-translations.xml
/msbuild.log
/*std*.log
/*build
/src/version.aps
.idea/
-46
View File
@@ -1,46 +0,0 @@
syntax: glob
scons_configure.py
scons-ModOrganizer-*
ModOrganizer-build-desktop*
outputd/*
output/*
build-ModOrganizer-*
source/NCC/*/bin
source/NCC/*/obj
source/NCC/bin
*.orig
source/plugins/proxyPython/build
staging/*
source - Copy/*
ModOrganizer-build-*
pdbs/*
source/NCC/BossDummy.x/*
*.ts
staging_prepare/*
staging_trans/*
tools/python_zip/*
Makefile
html
*.vcxproj
*.pdb
*.dll
*.exp
*.tlog
*.user
*.obj
*.suo
*.sln
*.log
*.filters
*.lib
source/organizer/resources/contents/icons
source/plugins/build-*
*/GeneratedFiles/*
translations/*
source/LocalPaths.pri
source/*/Win32/Debug/*
source/plugins/*/Win32/Debug/*
*~
syntax: regexp
Makefile\.(Debug|Release)
source/.*/debug/.*
+20
View File
@@ -0,0 +1,20 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-merge-conflict
- id: check-case-conflict
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v22.1.5
hooks:
- id: clang-format
'types_or': [c++, c]
ci:
autofix_commit_msg: "[pre-commit.ci] Auto fixes from pre-commit.com hooks."
autofix_prs: true
autoupdate_commit_msg: "[pre-commit.ci] Pre-commit autoupdate."
autoupdate_schedule: quarterly
submodules: false
+15 -10
View File
@@ -1,16 +1,21 @@
cmake_minimum_required(VERSION 3.16)
# TODO: move these to cmake_common?
set(OPENSSL_USE_STATIC_LIBS FALSE CACHE STRING "" FORCE)
set(MySQL_INCLUDE_DIRS CACHE STRING "" FORCE)
if(DEFINED DEPENDENCIES_DIR)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/mo2.cmake)
else()
include(${CMAKE_CURRENT_LIST_DIR}/../cmake_common/mo2.cmake)
endif()
# TODO: clean include directives
set(MO2_CMAKE_DEPRECATED_UIBASE_INCLUDE ON)
project(organizer)
# if MO2_INSTALL_IS_BIN is set, this means that we should install directly into the
# installation prefix, without the bin/ subfolder, typically for a standalone build
# to update an existing install
if (MO2_INSTALL_IS_BIN)
set(_bin ".")
else()
set(_bin bin)
endif()
add_subdirectory(src)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dump_running_process.bat DESTINATION bin)
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT organizer)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dump_running_process.bat DESTINATION ${_bin})
+71
View File
@@ -0,0 +1,71 @@
{
"configurePresets": [
{
"errors": {
"deprecated": true
},
"hidden": true,
"name": "cmake-dev",
"warnings": {
"deprecated": true,
"dev": true
}
},
{
"cacheVariables": {
"VCPKG_MANIFEST_NO_DEFAULT_FEATURES": {
"type": "BOOL",
"value": "ON"
}
},
"toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"hidden": true,
"name": "vcpkg"
},
{
"binaryDir": "${sourceDir}/vsbuild",
"architecture": {
"strategy": "set",
"value": "x64"
},
"cacheVariables": {
"CMAKE_CXX_FLAGS": "/EHsc /MP /W4",
"VCPKG_TARGET_TRIPLET": {
"type": "STRING",
"value": "x64-windows-static-md"
}
},
"generator": "Visual Studio 17 2022",
"inherits": ["cmake-dev", "vcpkg"],
"name": "vs2022-windows",
"toolset": "v143"
},
{
"cacheVariables": {
"VCPKG_MANIFEST_FEATURES": {
"type": "STRING",
"value": "standalone"
},
"MO2_INSTALL_IS_BIN": {
"type": "BOOL",
"value": "ON"
}
},
"inherits": "vs2022-windows",
"name": "vs2022-windows-standalone"
}
],
"buildPresets": [
{
"name": "vs2022-windows",
"resolvePackageReferences": "on",
"configurePreset": "vs2022-windows"
},
{
"name": "vs2022-windows-standalone",
"resolvePackageReferences": "on",
"configurePreset": "vs2022-windows-standalone"
}
],
"version": 4
}
+1 -1
View File
@@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
-713
View File
File diff suppressed because it is too large Load Diff
-77
View File
@@ -1,77 +0,0 @@
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/az082G9OIN1EC1VaKiI9iefpxhBavJ6Al6CzIZvQ+3pxnLqjmNgA7cDc22wcj2kB4hSG5qhbTI8wGa8jLQ5L65nuRZ3vrIqghBz9G3GLglgZkg6eqH9r3Kqc6UzcpCGzxxPOqm550nRcIiUU=
MO_VERSION: 2.4.0
VER_STUB_NORMAL: dev-appveyor-
VER_STUB_NIGHTLY: dev-nightly-
build_script:
- pwsh: >-
# Maintenance comments:
# APPVEYOR_BUILD_FOLDER= "c:\projects\modorganizer-slug"
# -Need to update py3 version used to invoke unimake.py once in a while.
# -Need update MO_VERSION env variable after each release.
# -Always clones umbrella master
# -Will checkout all the branches matching the one that triggered the build on the main repo.
# End comments.
$ErrorActionPreference = 'Stop'
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 ${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\ModOrganizer.exe'
name: Mod.Organizer-$(APPVEYOR_BUILD_VERSION)
- path: '\modorganizer-build\install\pdb\ModOrganizer.pdb'
name: PDB-Mod.Organizer-$(APPVEYOR_BUILD_VERSION)
deploy: off
on_success:
- ps: >-
Set-Location -Path $env:APPVEYOR_BUILD_FOLDER
Invoke-RestMethod https://raw.githubusercontent.com/DiscordHooks/appveyor-discord-webhook/master/send.ps1 -o send.ps1
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
if($env:APPVEYOR_SCHEDULED_BUILD -ne 'True'){
./send.ps1 failure $env:WEBHOOK_URL
}
-30
View File
@@ -1,30 +0,0 @@
[
# for boost???
# These are probably correct but might need a revisit as if you look at the boost documentation pages, it
# can give you huge lists of alternate includes...
{ symbol: [ "BOOST_FOREACH", "private", "<boost/foreach.hpp>", "public" ] },
{ include: [ "@\"boost/bind/.*\"", "private", "<boost/bind.hpp>", "public" ] },
{ include: [ "@\"boost/algorithm/string/.*\"", "private", "<boost/algorithm/string.hpp>", "public" ] },
{ include: [ "@\"boost/assign/.*\"", "private", "<boost/assign.hpp>", "public" ] },
{ include: [ "@\"boost/filesystem/.*\"", "private", "<boost/filesystem.hpp>", "public" ] },
{ include: [ "@\"boost/format/.*\"", "private", "<boost/format.hpp>", "public" ] },
{ include: [ "@\"boost/function/.*\"", "private", "<boost/function.hpp>", "public" ] },
{ include: [ "@\"boost/local/.*\"", "private", "<boost/locale.hpp>", "public" ] },
{ include: [ "@\"boost/python/.*\"", "private", "<boost/python.hpp>", "public" ] },
{ include: [ "@\"boost/signals2/.*\"", "private", "<boost/signals2.hpp>", "public" ] },
{ include: [ "\"boost/smart_ptr/scoped_array.hpp\"", "private", "<boost/scoped_array.hpp>", "public" ] },
{ include: [ "\"boost/smart_ptr/shared_ptr.hpp\"", "private", "<boost/shared_ptr.hpp>", "public" ] },
# this appears to be excessive
#{ include: [ "@\"boost/thread/.*\"", "private", "<boost/thread.hpp>", "public" ] },
# And this is specific to us
{ include: [ "\"appconfig.inc\"", "private", "\"appconfig.h\"", "public" ] },
]
# Ones I don't yet know how to deal with
#include "boost/fusion/container/vector/vector10_fwd.hpp" // for fusion
#include "boost/iterator/iterator_facade.hpp" // for operator!=
#include "boost/iterator/iterator_facade.hpp"
-2478
View File
File diff suppressed because it is too large Load Diff
+7 -8
View File
@@ -1,5 +1,3 @@
[![Build status](https://ci.appveyor.com/api/projects/status/hxenwxmpaob5xung?svg=true)](https://ci.appveyor.com/project/ModOrganizer2/modorganizer-736bd)
# Mod Organizer
Mod Organizer (MO) is a tool for managing mod collections of arbitrary size. It is specifically designed for people who like to experiment with mods and thus need an easy and reliable way to install and uninstall them.
@@ -12,22 +10,22 @@ 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: [Mod Organizer 2](https://discord.gg/ewUVAqyrQX)
If you want to help translate MO2 to your language you should join the discord server too and head to the #translation channel.
To have more information, please join the open MO2 Development Discord server: [Mod Organizer 2](https://discord.gg/ewUVAqyrQX)
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 [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: [Mod Organizer 2](https://discord.gg/ewUVAqyrQX). 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/ewUVAqyrQX). 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, isa, Holt59 and many others for the development.
Credits to Tannin, LePresidente, Silarn, erasmux, AL12, LostDragonist, AnyOldName3, isa, Holt59, Project579, przester, Qudix, RJ, Jonathan Feenstra and many others for the development.
## Download Location
* on [GitHub.com](https://github.com/Modorganizer2/modorganizer/releases)
* on [NexusMods.com](https://www.nexusmods.com/skyrimspecialedition/mods/6194)
* on [NexusMods.com](https://www.nexusmods.com/site/mods/6)
## Old Download Location
@@ -39,7 +37,7 @@ Please refer to [Modorganizer2/mob](https://github.com/modorganizer2/mob) for bu
## Other Repositories
MO2 consists of multiple repositories on github. The mob 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
@@ -67,6 +65,7 @@ Here is a complete list:
* https://github.com/ModOrganizer2/modorganizer-game_skyrim
* https://github.com/ModOrganizer2/modorganizer-game_skyrimSE
* https://github.com/ModOrganizer2/modorganizer-game_skyrimVR
* https://github.com/ModOrganizer2/modorganizer-game_starfield
* https://github.com/ModOrganizer2/modorganizer-game_ttw
* https://github.com/ModOrganizer2/modorganizer-installer_bain
* https://github.com/ModOrganizer2/modorganizer-installer_wizard
-33
View File
@@ -1,33 +0,0 @@
# This python script contains the configuration for scons
# Copy this to scons_configure.py and adjust to taste.
# Path to your boost install - it should have a boost/ subdirectory and a stage/
# subdirectory. The scons script will use stage/lib if there, or the appropriate
# version for your compiler, if you installed the multiple-build version
BOOSTPATH = r"C:\Apps\boost_1_55_0"
# Version of Visual Studio to use, if you wish to use a specific version. If you
# don't specify a version, the latest will be picked.. See the scons manual for
# supported values.
#MSVC_VERSION = '10.0Exp'
# Path to your python install
# You don't really need to set this up but you might if (say) you have a 32- and
# 64-bit python install and scons has been installed for the 64 bit version
#PYTHONPATH=r"C:\Apps\Python"
# Path to your QT install. This might constrain the version of MSVC you can use.
# This seems to be set by QTCreator
#QTDIR = r"C:\Apps\Qt\4.8.6"
# Path to 7-zip sources
SEVENZIPPATH = r"C:\Apps\7-Zip\7z920"
# Path to zlib. Please read the README file for more information about how this
# needs to be set up
ZLIBPATH = r"C:\Apps\zlib-1.2.8"
# Source control programs. Sadly I can't get this information from qt, even
# though you have to set it up in the configuration
GIT = r"C:\Program Files\git\bin\git.exe"
MERCURIAL = r"C:\Program Files\TortoiseHg\hg.exe"
+104 -20
View File
@@ -1,30 +1,105 @@
cmake_minimum_required(VERSION 3.16)
add_executable(organizer)
set_target_properties(organizer PROPERTIES OUTPUT_NAME "ModOrganizer")
mo2_configure_executable(organizer
WARNINGS OFF
EXTRA_TRANSLATIONS ${MO2_SUPER_PATH}/game_gamebryo/src ${MO2_UIBASE_PATH}/src
PRIVATE_DEPENDS
uibase githubpp bsatk esptk archive usvfs lootcli boost::program_options
Qt::WebEngineWidgets Qt::WebSockets)
target_link_libraries(organizer PUBLIC Shlwapi)
mo2_install_target(organizer)
find_package(mo2-cmake CONFIG REQUIRED)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.qt5"
DESTINATION bin/dlls
find_package(usvfs CONFIG REQUIRED)
find_package(mo2-uibase CONFIG REQUIRED)
find_package(mo2-archive CONFIG REQUIRED)
find_package(mo2-lootcli-header CONFIG REQUIRED)
find_package(mo2-bsatk CONFIG REQUIRED)
find_package(mo2-esptk CONFIG REQUIRED)
find_package(mo2-dds-header CONFIG REQUIRED)
find_package(mo2-libbsarch CONFIG REQUIRED)
find_package(Qt6 REQUIRED COMPONENTS WebEngineWidgets WebSockets NetworkAuth)
find_package(Boost CONFIG REQUIRED COMPONENTS program_options thread interprocess signals2 uuid accumulators)
find_package(7zip CONFIG REQUIRED)
find_package(lz4 CONFIG REQUIRED)
find_package(ZLIB REQUIRED)
add_executable(organizer)
set_target_properties(organizer PROPERTIES
OUTPUT_NAME "ModOrganizer"
WIN32_EXECUTABLE TRUE)
# disable translations because we want to be able to install somewhere else if
# required
mo2_configure_target(organizer WARNINGS 4 TRANSLATIONS OFF)
# we add translations "manually" to handle MO2_INSTALL_IS_BIN
mo2_add_translations(organizer
INSTALL_RELEASE
INSTALL_DIRECTORY "${_bin}/translations"
SOURCES ${CMAKE_CURRENT_SOURCE_DIR})
mo2_set_project_to_run_from_install(
organizer EXECUTABLE ${CMAKE_INSTALL_PREFIX}/${_bin}/ModOrganizer.exe)
target_link_libraries(organizer PRIVATE
Shlwapi Bcrypt
usvfs::usvfs mo2::uibase mo2::archive mo2::libbsarch
mo2::bsatk mo2::esptk mo2::lootcli-header
Boost::program_options Boost::signals2 Boost::uuid Boost::accumulators
Qt6::WebEngineWidgets Qt6::WebSockets Qt6::NetworkAuth Version Dbghelp)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.qt6"
DESTINATION ${_bin}/dlls
CONFIGURATIONS Release RelWithDebInfo
RENAME dlls.manifest)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/dlls.manifest.debug.qt6"
DESTINATION ${_bin}/dlls
CONFIGURATIONS Debug
RENAME dlls.manifest)
install(DIRECTORY
"${CMAKE_CURRENT_SOURCE_DIR}/stylesheets"
"${CMAKE_CURRENT_SOURCE_DIR}/tutorials"
DESTINATION bin)
if (NOT MO2_SKIP_STYLESHEETS_INSTALL)
install(
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/stylesheets"
DESTINATION ${_bin})
endif()
if (NOT MO2_SKIP_TUTORIALS_INSTALL)
install(
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/tutorials"
DESTINATION ${_bin})
endif()
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/resources/markdown.html"
DESTINATION bin/resources)
DESTINATION ${_bin}/resources)
mo2_deploy_qt(BINARIES ModOrganizer.exe uibase.dll plugins/bsa_packer.dll)
# install ModOrganizer.exe itself
install(FILES $<TARGET_FILE:organizer> DESTINATION ${_bin})
# install dependencies DLLs
install(FILES $<TARGET_FILE:mo2::libbsarch> DESTINATION ${_bin}/dlls)
install(FILES $<TARGET_FILE:7zip::7zip> DESTINATION ${_bin}/dlls)
# this may copy over the ones from uibase/usvfs
# - when building with mob, this should not matter as the files should be identical
# - when building standalone, this should help having matching USVFS DLL between the
# build and the installation
# - this may cause issue with uibase in standalone mode if the installed version does
# not match the one used for the build, but there would be other issue anyway (e.g.
# different uibase.dll between modorganizer and plugins)
#
install(FILES
$<TARGET_FILE:mo2::uibase>
$<TARGET_FILE:usvfs_x64::usvfs_dll>
$<TARGET_FILE:usvfs_x86::usvfs_dll>
$<TARGET_FILE:usvfs_x64::usvfs_proxy>
$<TARGET_FILE:usvfs_x86::usvfs_proxy>
DESTINATION ${_bin})
# do not install PDB if CMAKE_INSTALL_PREFIX is "bin"
if (NOT MO2_INSTALL_IS_BIN)
install(FILES $<TARGET_PDB_FILE:organizer> DESTINATION pdb)
endif()
mo2_deploy_qt(
DIRECTORY ${_bin}
BINARIES ModOrganizer.exe $<TARGET_FILE_NAME:mo2::uibase>)
# set source groups for VS
mo2_add_filter(NAME src/application GROUPS
iuserinterface
commandline
@@ -34,6 +109,7 @@ mo2_add_filter(NAME src/application GROUPS
multiprocess
sanitychecks
selfupdater
systemtraymanager
updatedialog
)
@@ -43,18 +119,23 @@ mo2_add_filter(NAME src/browser GROUPS
)
mo2_add_filter(NAME src/categories GROUPS
categories
categories
categoriestable
categoriesdialog
categoriesdialog
categoryimportdialog
)
mo2_add_filter(NAME src/core GROUPS
archivefiletree
githubpp
installationmanager
nexusinterface
nexusoauthlogin
nexusoauthtokens
nexusoauthconfig
nxmaccessmanager
organizercore
game_features
plugincontainer
apiuseraccount
processrunner
@@ -196,6 +277,9 @@ mo2_add_filter(NAME src/profiles GROUPS
mo2_add_filter(NAME src/proxies GROUPS
downloadmanagerproxy
executableslistproxy
gamefeaturesproxy
instancemanagerproxy
modlistproxy
organizerproxy
pluginlistproxy
-2331
View File
File diff suppressed because it is too large Load Diff
-60
View File
@@ -1,60 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = bsatk \
shared \
uibase \
esptk \
organizer \
hookdll \
archive \
helper \
plugins \
nxmhandler \
BossDummy \
pythonRunner \
loot_cli
pythonRunner.depends = uibase
plugins.depends = pythonRunner uibase
hookdll.depends = shared
organizer.depends = shared uibase plugins
CONFIG(debug, debug|release) {
DESTDIR = $$PWD/../outputd
} else {
DESTDIR = $$PWD/../output
}
STATICDATAPATH = $${DESTDIR}\\..\\tools\\static_data\\dlls
DLLSPATH = $${DESTDIR}\\dlls
otherlibs.path = $$DLLSPATH
otherlibs.files += $${STATICDATAPATH}\\7z.dll \
$${BOOSTPATH}\\stage\\lib\\boost_python-vc*-mt-1*.dll
qtlibs.path = $$DLLSPATH
greaterThan(QT_MAJOR_VERSION, 4) {
QTLIBNAMES += Core Gui Network OpenGL Script Sql Svg Qml Quick Webkit Widgets Xml XmlPatterns
} else {
QTLIBNAMES += Core Declarative Gui Network OpenGL Script Sql Svg Webkit Xml XmlPatterns
}
greaterThan(QT_MAJOR_VERSION, 5) {
QTLIBNAMES += OpenGLWidgets
}
QTLIBSUFFIX = $${QT_MAJOR_VERSION}.dll
CONFIG(debug, debug|release): QTLIBSUFFIX = "d$${QTLIBSUFFIX}" # Can't use Debug: .. here, it ignores the line - no idea why, as it works in BossDummy.pro
for(QTNAME, QTLIBNAMES) {
QTFILE = Qt$${QTNAME}
qtlibs.files += $$[QT_INSTALL_BINS]\\$${QTFILE}$${QTLIBSUFFIX}
}
INSTALLS += qtlibs otherlibs
OTHER_FILES +=\
../SConstruct\
../scons_configure.py\
SConscript
-179
View File
@@ -1,179 +0,0 @@
import ctypes
import os
import subprocess
def resolve_name(source):
# Get the actual name of the file, after reparse points and symlinks are
# taken into account.
GENERIC_READ = 0x80000000
FILE_SHARE_READ = 0x1
OPEN_EXISTING = 0x3
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
handle = ctypes.windll.kernel32.CreateFileA(source,
GENERIC_READ,
FILE_SHARE_READ,
None,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
None)
# get the target
FILE_NAME_NORMALIZED = 0x0
FILE_NAME_OPENED = 0x8
buff = ctypes.create_string_buffer(1024)
res = ctypes.windll.kernel32.GetFinalPathNameByHandleA(handle,
buff,
ctypes.sizeof(buff),
FILE_NAME_NORMALIZED)
target = buff.value
ctypes.windll.kernel32.CloseHandle(handle)
return target
def search_up(path, target):
while True:
if os.path.exists(os.path.join(path, target)):
return True
npath = os.path.dirname(path)
if npath == path:
break
path = npath
return False
Import('qt_env')
env = qt_env.Clone()
modules = [
'Core',
'Gui',
'Network',
'Script',
'Sql',
'WebKit',
'Xml',
'XmlPatterns',
'Declarative'
]
if env['QT_MAJOR_VERSION'] > 4:
modules += [
'Widgets',
'Qml',
'WebKitWidgets'
]
env.EnableQtModules(*modules)
env.Uic(env.Glob('*.ui'))
env.RequireLibraries('uibase', 'shared', 'bsatk', 'esptk')
env.AppendUnique(LIBS = [
'shell32',
'user32',
'ole32',
'advapi32',
'gdi32',
'shlwapi',
'Psapi',
'Version'
])
# We have to 'persuade' moc to generate certain other targets and inject them
# into the list of cpps
other_sources = env.AddExtraMoc(env.Glob('*.h'))
for file in env.Glob('*.rc'):
other_sources.append(env.RES(file))
# Note the order of this is important, or you can pick up the wrong report.h...
# Doing appendunique seems to throw the moc code into a tizzy
env['CPPPATH'] += [
'../archive',
'../plugins/gamefeatures',
'.', # Why is this necessary?
'${LOOTPATH}',
'${BOOSTPATH}',
]
#########################FUDGE###############################
env['CPPPATH'] += [
'../plugins/gameGamebryo',
]
#############################################################
env.AppendUnique(CPPDEFINES = [
'_UNICODE',
'_CRT_SECURE_NO_WARNINGS',
'_SCL_SECURE_NO_WARNINGS',
'BOOST_DISABLE_ASSERTS',
'NDEBUG',
'QT_MESSAGELOGCONTEXT'
])
# Boost produces very long names with msvc truncates. Doesn't seem to cause
# problems.
# Also note to remove the -wd4100 I hacked the boost headers (tagged_argument.hpp)
# appropriately.
env.AppendUnique(CPPFLAGS = [ '-wd4503' ])
env.AppendUnique(LINKFLAGS = [
'/SUBSYSTEM:WINDOWS',
'${EXE_MANIFEST_DEPENDENCY}'
])
# modeltest is optional and it doesn't compile anyway...
cpp_files = [
x for x in env.Glob('*.cpp', source = True)
if x.name != 'modeltest.cpp' and x.name != 'aboutdialog.cpp' and \
not x.name.startswith('moc_') # I think this is a strange bug
]
about_env = env.Clone()
# This is somewhat of a hack until I can work out a way of setting up a build
# with all the repos without using millions of junction points
try:
target = resolve_name(Dir('.').srcnode().abspath)
if search_up(target, '.hg'):
hgid = subprocess.check_output([env['MERCURIAL'], 'id', '-i']).rstrip()
elif search_up(target, '.git'):
hgid = subprocess.check_output([env['GIT'], '-C', target, 'describe',
'--tag']).rstrip()
else:
hgid = "Unknown"
except:
hgid = "Problem determining version"
# FIXME: It'd be much easier to stringify this in the source code
about_env.AppendUnique(CPPDEFINES = [ 'HGID=\\"%s\\"' % hgid ])
other_sources.append(about_env.StaticObject('aboutdialog.cpp'))
env.AppendUnique(LIBPATH = "${ZLIBPATH}/build")
env.AppendUnique(LIBS = 'zlibstatic')
prog = env.Program('ModOrganizer',
cpp_files + env.Glob('*.qrc') + other_sources)
env.InstallModule(prog)
for subdir in ('tutorials', 'stylesheets'):
env.Install(os.path.join(env['INSTALL_PATH'], subdir),
env.Glob(os.path.join(subdir, '*')))
# FIXME Sort the translations. Except they don't exist on the 1.2 branch
res = env['QT_USED_MODULES']
Return('res')
"""
CONFIG(debug, debug|release) {
} else {
QMAKE_CXXFLAGS += /Zi /GL
QMAKE_LFLAGS += /DEBUG /LTCG /OPT:REF /OPT:ICF
}
TRANSLATIONS = organizer_en.ts
QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\*.qm) $$quote($$DSTDIR)\\translations $$escape_expand(\\n)
"""
-2
View File
@@ -45,7 +45,6 @@ AboutDialog::AboutDialog(const QString& version, QWidget* parent)
m_LicenseFiles[LICENSE_CCBY3] = "BY-SA-v3.0.txt";
m_LicenseFiles[LICENSE_ZLIB] = "zlib.txt";
m_LicenseFiles[LICENSE_PYTHON] = "python.txt";
m_LicenseFiles[LICENSE_SSL] = "openssl.txt";
m_LicenseFiles[LICENSE_CPPTOML] = "cpptoml.txt";
m_LicenseFiles[LICENSE_UDIS] = "udis86.txt";
m_LicenseFiles[LICENSE_SPDLOG] = "spdlog.txt";
@@ -69,7 +68,6 @@ AboutDialog::AboutDialog(const QString& version, QWidget* parent)
addLicense("ANTLR", LICENSE_ANTLR);
addLicense("LOOT", LICENSE_GPL3);
addLicense("Python", LICENSE_PYTHON);
addLicense("OpenSSL", LICENSE_SSL);
addLicense("cpptoml", LICENSE_CPPTOML);
addLicense("Udis86", LICENSE_UDIS);
addLicense("spdlog", LICENSE_SPDLOG);

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