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); +});