From c6e9cbeddac375e88fb106c6b8a9eb9e1e6969b0 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Tue, 14 Oct 2025 23:20:56 +0100 Subject: [PATCH] feat: report on unlinking progress --- src/ModMan/Context/FastFileContext.cpp | 6 +-- src/ModMan/Web/Binds/UnlinkingBinds.cpp | 45 +++++++++++++++---- src/ModMan/Web/Binds/UnlinkingBinds.h | 2 + src/ModManUi/src/App.vue | 6 ++- src/ModManUi/src/native/UnlinkingBinds.ts | 9 ++++ src/ModManUi/src/native/index.ts | 4 +- src/ObjWriting/Dumping/AbstractAssetDumper.h | 39 +++++++++------- .../Dumping/AssetDumpingContext.cpp | 33 ++++++++++++-- src/ObjWriting/Dumping/AssetDumpingContext.h | 14 +++++- src/ObjWriting/Dumping/IAssetDumper.h | 3 +- .../Game/IW3/Image/ImageDumperIW3.cpp | 11 ++--- .../Game/IW3/Image/ImageDumperIW3.h | 3 +- .../Game/IW3/Localize/LocalizeDumperIW3.cpp | 13 ++++-- .../Game/IW3/Localize/LocalizeDumperIW3.h | 3 +- .../Game/IW3/Maps/MapEntsDumperIW3.cpp | 11 ++--- .../Game/IW3/Maps/MapEntsDumperIW3.h | 3 +- src/ObjWriting/Game/IW3/ObjWriterIW3.cpp | 15 ++++++- .../Game/IW3/RawFile/RawFileDumperIW3.cpp | 11 ++--- .../Game/IW3/RawFile/RawFileDumperIW3.h | 3 +- .../Game/IW3/Sound/LoadedSoundDumperIW3.cpp | 11 ++--- .../Game/IW3/Sound/LoadedSoundDumperIW3.h | 3 +- .../IW3/StringTable/StringTableDumperIW3.cpp | 11 ++--- .../IW3/StringTable/StringTableDumperIW3.h | 3 +- .../Game/IW4/Image/ImageDumperIW4.cpp | 11 ++--- .../Game/IW4/Image/ImageDumperIW4.h | 3 +- .../Leaderboard/LeaderboardJsonDumperIW4.cpp | 11 ++--- .../Leaderboard/LeaderboardJsonDumperIW4.h | 3 +- .../Game/IW4/LightDef/LightDefDumperIW4.cpp | 13 ++---- .../Game/IW4/LightDef/LightDefDumperIW4.h | 3 +- .../Game/IW4/Localize/LocalizeDumperIW4.cpp | 14 ++++-- .../Game/IW4/Localize/LocalizeDumperIW4.h | 3 +- .../Game/IW4/Maps/AddonMapEntsDumperIW4.cpp | 11 ++--- .../Game/IW4/Maps/AddonMapEntsDumperIW4.h | 3 +- .../Material/MaterialDecompilingDumperIW4.cpp | 9 +--- .../Material/MaterialDecompilingDumperIW4.h | 3 +- .../Game/IW4/Menu/MenuDumperIW4.cpp | 17 +++---- src/ObjWriting/Game/IW4/Menu/MenuDumperIW4.h | 3 +- .../Game/IW4/Menu/MenuListDumperIW4.cpp | 15 +++---- .../Game/IW4/Menu/MenuListDumperIW4.h | 9 ++-- src/ObjWriting/Game/IW4/ObjWriterIW4.cpp | 15 ++++++- .../IW4/PhysCollmap/PhysCollmapDumperIW4.cpp | 11 ++--- .../IW4/PhysCollmap/PhysCollmapDumperIW4.h | 3 +- .../PhysPresetInfoStringDumperIW4.cpp | 21 ++++----- .../PhysPresetInfoStringDumperIW4.h | 3 +- .../Game/IW4/RawFile/RawFileDumperIW4.cpp | 11 ++--- .../Game/IW4/RawFile/RawFileDumperIW4.h | 3 +- .../Game/IW4/Shader/PixelShaderDumperIW4.cpp | 11 ++--- .../Game/IW4/Shader/PixelShaderDumperIW4.h | 3 +- .../Game/IW4/Shader/VertexShaderDumperIW4.cpp | 11 ++--- .../Game/IW4/Shader/VertexShaderDumperIW4.h | 3 +- .../Game/IW4/Sound/LoadedSoundDumperIW4.cpp | 11 ++--- .../Game/IW4/Sound/LoadedSoundDumperIW4.h | 3 +- .../Game/IW4/Sound/SndCurveDumperIW4.cpp | 11 +---- .../Game/IW4/Sound/SndCurveDumperIW4.h | 3 +- .../IW4/StringTable/StringTableDumperIW4.cpp | 11 ++--- .../IW4/StringTable/StringTableDumperIW4.h | 3 +- .../StructuredDataDefDumperIW4.cpp | 11 ++--- .../StructuredDataDefDumperIW4.h | 3 +- .../Game/IW4/Techset/TechsetDumperIW4.cpp | 9 +--- .../Game/IW4/Techset/TechsetDumperIW4.h | 3 +- .../Game/IW4/Tracer/TracerDumperIW4.cpp | 21 ++++----- .../Game/IW4/Tracer/TracerDumperIW4.h | 3 +- .../Game/IW4/Vehicle/VehicleDumperIW4.cpp | 21 ++++----- .../Game/IW4/Vehicle/VehicleDumperIW4.h | 3 +- .../Game/IW4/Weapon/WeaponDumperIW4.cpp | 25 +++++------ .../Game/IW4/Weapon/WeaponDumperIW4.h | 3 +- .../Game/IW5/Image/ImageDumperIW5.cpp | 11 ++--- .../Game/IW5/Image/ImageDumperIW5.h | 3 +- .../Leaderboard/LeaderboardJsonDumperIW5.cpp | 11 ++--- .../Leaderboard/LeaderboardJsonDumperIW5.h | 3 +- .../Game/IW5/Localize/LocalizeDumperIW5.cpp | 13 ++++-- .../Game/IW5/Localize/LocalizeDumperIW5.h | 3 +- .../Game/IW5/Maps/AddonMapEntsDumperIW5.cpp | 11 ++--- .../Game/IW5/Maps/AddonMapEntsDumperIW5.h | 3 +- .../Game/IW5/Menu/MenuDumperIW5.cpp | 21 ++++----- src/ObjWriting/Game/IW5/Menu/MenuDumperIW5.h | 3 +- .../Game/IW5/Menu/MenuListDumperIW5.cpp | 11 ++--- .../Game/IW5/Menu/MenuListDumperIW5.h | 3 +- src/ObjWriting/Game/IW5/ObjWriterIW5.cpp | 16 ++++++- .../Game/IW5/RawFile/RawFileDumperIW5.cpp | 11 ++--- .../Game/IW5/RawFile/RawFileDumperIW5.h | 3 +- .../Game/IW5/Script/ScriptDumperIW5.cpp | 19 +++----- .../Game/IW5/Script/ScriptDumperIW5.h | 3 +- .../Game/IW5/Sound/LoadedSoundDumperIW5.cpp | 11 ++--- .../Game/IW5/Sound/LoadedSoundDumperIW5.h | 3 +- .../IW5/StringTable/StringTableDumperIW5.cpp | 11 ++--- .../IW5/StringTable/StringTableDumperIW5.h | 3 +- .../IW5/Weapon/AttachmentJsonDumperIW5.cpp | 11 ++--- .../Game/IW5/Weapon/AttachmentJsonDumperIW5.h | 3 +- .../Game/IW5/Weapon/WeaponDumperIW5.cpp | 25 +++++------ .../Game/IW5/Weapon/WeaponDumperIW5.h | 3 +- .../Game/T5/Image/ImageDumperT5.cpp | 11 ++--- src/ObjWriting/Game/T5/Image/ImageDumperT5.h | 3 +- .../Game/T5/Localize/LocalizeDumperT5.cpp | 13 ++++-- .../Game/T5/Localize/LocalizeDumperT5.h | 3 +- src/ObjWriting/Game/T5/ObjWriterT5.cpp | 15 ++++++- .../Game/T5/RawFile/RawFileDumperT5.cpp | 15 +++---- .../Game/T5/RawFile/RawFileDumperT5.h | 3 +- .../T5/StringTable/StringTableDumperT5.cpp | 11 ++--- .../Game/T5/StringTable/StringTableDumperT5.h | 3 +- .../Game/T6/FontIcon/FontIconCsvDumperT6.cpp | 11 ++--- .../Game/T6/FontIcon/FontIconCsvDumperT6.h | 3 +- .../Game/T6/FontIcon/FontIconJsonDumperT6.cpp | 11 ++--- .../Game/T6/FontIcon/FontIconJsonDumperT6.h | 3 +- .../Game/T6/Image/ImageDumperT6.cpp | 11 ++--- src/ObjWriting/Game/T6/Image/ImageDumperT6.h | 3 +- .../Leaderboard/LeaderboardJsonDumperT6.cpp | 11 ++--- .../T6/Leaderboard/LeaderboardJsonDumperT6.h | 3 +- .../Game/T6/Localize/LocalizeDumperT6.cpp | 13 ++++-- .../Game/T6/Localize/LocalizeDumperT6.h | 3 +- .../Game/T6/Maps/MapEntsDumperT6.cpp | 9 +--- src/ObjWriting/Game/T6/Maps/MapEntsDumperT6.h | 3 +- src/ObjWriting/Game/T6/ObjWriterT6.cpp | 27 +++++++++-- .../PhysConstraintsInfoStringDumperT6.cpp | 23 ++++------ .../PhysConstraintsInfoStringDumperT6.h | 3 +- .../PhysPresetInfoStringDumperT6.cpp | 21 ++++----- .../PhysPreset/PhysPresetInfoStringDumperT6.h | 3 +- src/ObjWriting/Game/T6/Qdb/QdbDumperT6.cpp | 11 ++--- src/ObjWriting/Game/T6/Qdb/QdbDumperT6.h | 3 +- .../Game/T6/RawFile/RawFileDumperT6.cpp | 15 +++---- .../Game/T6/RawFile/RawFileDumperT6.h | 3 +- .../Game/T6/Script/ScriptDumperT6.cpp | 11 ++--- .../Game/T6/Script/ScriptDumperT6.h | 3 +- src/ObjWriting/Game/T6/Slug/SlugDumperT6.cpp | 11 ++--- src/ObjWriting/Game/T6/Slug/SlugDumperT6.h | 3 +- .../Game/T6/Sound/SndBankDumperT6.cpp | 11 ++++- .../Game/T6/Sound/SndBankDumperT6.h | 3 +- .../T6/Sound/SndDriverGlobalsDumperT6.cpp | 13 ++++-- .../Game/T6/Sound/SndDriverGlobalsDumperT6.h | 3 +- .../T6/StringTable/StringTableDumperT6.cpp | 11 ++--- .../Game/T6/StringTable/StringTableDumperT6.h | 3 +- .../Game/T6/Techset/TechsetDumperT6.cpp | 9 +--- .../Game/T6/Techset/TechsetDumperT6.h | 3 +- .../Game/T6/Tracer/TracerDumperT6.cpp | 21 ++++----- .../Game/T6/Tracer/TracerDumperT6.h | 3 +- .../Game/T6/Vehicle/VehicleDumperT6.cpp | 21 ++++----- .../Game/T6/Vehicle/VehicleDumperT6.h | 3 +- .../Game/T6/Weapon/AttachmentDumperT6.cpp | 21 ++++----- .../Game/T6/Weapon/AttachmentDumperT6.h | 3 +- .../T6/Weapon/AttachmentUniqueDumperT6.cpp | 21 ++++----- .../Game/T6/Weapon/AttachmentUniqueDumperT6.h | 3 +- .../Game/T6/Weapon/CamoJsonDumperT6.cpp | 11 ++--- .../Game/T6/Weapon/CamoJsonDumperT6.h | 3 +- .../Game/T6/Weapon/WeaponDumperT6.cpp | 25 +++++------ .../Game/T6/Weapon/WeaponDumperT6.h | 3 +- .../Game/T6/ZBarrier/ZBarrierDumperT6.cpp | 21 ++++----- .../Game/T6/ZBarrier/ZBarrierDumperT6.h | 3 +- .../Material/MaterialJsonDumper.cpp.template | 13 ++---- .../Material/MaterialJsonDumper.h.template | 5 +-- .../XModel/XModelDumper.cpp.template | 39 +++++++--------- src/ObjWriting/XModel/XModelDumper.h.template | 3 +- src/Unlinker/Unlinker.cpp | 2 +- src/ZoneCommon/Pool/AssetPool.h | 36 +++++++++++++++ .../Material/MaterialJsonDumperIW3Test.cpp | 4 +- .../Material/MaterialJsonDumperIW4Test.cpp | 4 +- .../Material/MaterialJsonDumperIW5Test.cpp | 4 +- .../T5/Material/MaterialJsonDumperT5Test.cpp | 4 +- .../T6/FontIcon/FontIconJsonDumperT6Test.cpp | 4 +- .../T6/Material/MaterialJsonDumperT6Test.cpp | 4 +- 159 files changed, 686 insertions(+), 802 deletions(-) diff --git a/src/ModMan/Context/FastFileContext.cpp b/src/ModMan/Context/FastFileContext.cpp index 5392cdae..2a5f8112 100644 --- a/src/ModMan/Context/FastFileContext.cpp +++ b/src/ModMan/Context/FastFileContext.cpp @@ -12,10 +12,10 @@ namespace { constexpr double MIN_PROGRESS_TO_REPORT = 0.005; - class EventProgressReporter : public ProgressCallback + class LoadingEventProgressReporter : public ProgressCallback { public: - explicit EventProgressReporter(std::string zoneName) + explicit LoadingEventProgressReporter(std::string zoneName) : m_zone_name(std::move(zoneName)), m_last_progress(0) { @@ -46,7 +46,7 @@ void FastFileContext::Destroy() result::Expected FastFileContext::LoadFastFile(const std::string& path) { - auto zone = ZoneLoading::LoadZone(path, std::make_unique(fs::path(path).filename().replace_extension().string())); + auto zone = ZoneLoading::LoadZone(path, std::make_unique(fs::path(path).filename().replace_extension().string())); if (!zone) return result::Unexpected(std::move(zone.error())); diff --git a/src/ModMan/Web/Binds/UnlinkingBinds.cpp b/src/ModMan/Web/Binds/UnlinkingBinds.cpp index bc281dcf..82d9d9b2 100644 --- a/src/ModMan/Web/Binds/UnlinkingBinds.cpp +++ b/src/ModMan/Web/Binds/UnlinkingBinds.cpp @@ -14,22 +14,41 @@ namespace fs = std::filesystem; namespace { - class ZoneLoadedDto + class ZoneUnlinkProgressDto { public: std::string zoneName; - std::string filePath; + double percentage; }; - NLOHMANN_DEFINE_TYPE_EXTENSION(ZoneLoadedDto, zoneName, filePath); + NLOHMANN_DEFINE_TYPE_EXTENSION(ZoneUnlinkProgressDto, zoneName, percentage); - class ZoneUnloadedDto + constexpr double MIN_PROGRESS_TO_REPORT = 0.005; + + class UnlinkingEventProgressReporter : public ProgressCallback { public: - std::string zoneName; - }; + explicit UnlinkingEventProgressReporter(std::string zoneName) + : m_zone_name(std::move(zoneName)), + m_last_progress(0) + { + } - NLOHMANN_DEFINE_TYPE_EXTENSION(ZoneUnloadedDto, zoneName); + void OnProgress(const size_t current, const size_t total) override + { + const double percentage = static_cast(current) / static_cast(total); + + if (percentage - m_last_progress >= MIN_PROGRESS_TO_REPORT) + { + m_last_progress = percentage; + ui::NotifyZoneUnlinkProgress(m_zone_name, percentage); + } + } + + private: + std::string m_zone_name; + double m_last_progress; + }; result::Expected UnlinkZoneInDbThread(const std::string& zoneName) { @@ -52,7 +71,8 @@ namespace OutputPathFilesystem outputFolderOutputPath(outputFolderPath); SearchPaths searchPaths; - AssetDumpingContext dumpingContext(zone, outputFolderPathStr, outputFolderOutputPath, searchPaths); + AssetDumpingContext dumpingContext( + zone, outputFolderPathStr, outputFolderOutputPath, searchPaths, std::make_unique(zoneName)); objWriter->DumpZone(dumpingContext); return NoResult(); @@ -81,6 +101,15 @@ namespace namespace ui { + void NotifyZoneUnlinkProgress(std::string zoneName, const double percentage) + { + const ZoneUnlinkProgressDto dto{ + .zoneName = std::move(zoneName), + .percentage = percentage, + }; + Notify(*ModManContext::Get().m_main_webview, "zoneUnlinkProgress", dto); + } + void RegisterUnlinkingBinds(webview::webview& wv) { BindAsync(wv, diff --git a/src/ModMan/Web/Binds/UnlinkingBinds.h b/src/ModMan/Web/Binds/UnlinkingBinds.h index 4169a780..6d2ac0ed 100644 --- a/src/ModMan/Web/Binds/UnlinkingBinds.h +++ b/src/ModMan/Web/Binds/UnlinkingBinds.h @@ -4,5 +4,7 @@ namespace ui { + void NotifyZoneUnlinkProgress(std::string zoneName, double percentage); + void RegisterUnlinkingBinds(webview::webview& wv); } // namespace ui diff --git a/src/ModManUi/src/App.vue b/src/ModManUi/src/App.vue index c74edd92..4d5255fe 100644 --- a/src/ModManUi/src/App.vue +++ b/src/ModManUi/src/App.vue @@ -76,9 +76,13 @@ function onUnloadClicked(zoneName: string) { } webviewAddEventListener("zoneLoadProgress", (dto) => { - console.log(dto); lastPercentage.value = dto.percentage; }); + +webviewAddEventListener("zoneUnlinkProgress", (dto) => { + lastPercentage.value = dto.percentage; + console.log("unlink", dto); +});