From c1ab97eb15eee0b188ca79f2657eb9600e6c6c47 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 5 Apr 2024 14:19:02 +0300 Subject: [PATCH] Task interface --- src/files/WorldConverter.cpp | 7 ++++- src/files/WorldConverter.h | 31 +++++++++++++++++--- src/frontend/menu/menu.cpp | 55 +++++++++++++++++++++++------------- src/interfaces/Task.h | 19 +++++++++++++ src/util/ThreadPool.h | 18 ++++++++++-- 5 files changed, 102 insertions(+), 28 deletions(-) create mode 100644 src/interfaces/Task.h diff --git a/src/files/WorldConverter.cpp b/src/files/WorldConverter.cpp index ba30f7bf..9588aad0 100644 --- a/src/files/WorldConverter.cpp +++ b/src/files/WorldConverter.cpp @@ -77,6 +77,7 @@ void WorldConverter::convertNext() { } convert_task task = tasks.front(); tasks.pop(); + tasksDone++; if (!fs::is_regular_file(task.file)) return; @@ -95,6 +96,10 @@ void WorldConverter::write() { wfile->write(nullptr, content); } -uint WorldConverter::getTotalTasks() const { +uint WorldConverter::getWorkRemaining() const { return tasks.size(); } + +uint WorldConverter::getWorkDone() const { + return tasksDone; +} diff --git a/src/files/WorldConverter.h b/src/files/WorldConverter.h index 031b69cd..0a34a9e5 100644 --- a/src/files/WorldConverter.h +++ b/src/files/WorldConverter.h @@ -4,7 +4,10 @@ #include #include #include + #include "../typedefs.h" +#include "../delegates.h" +#include "../interfaces/Task.h" namespace fs = std::filesystem; @@ -21,25 +24,45 @@ struct convert_task { fs::path file; }; -class WorldConverter { +class WorldConverter : public Task { WorldFiles* wfile; std::shared_ptr const lut; const Content* const content; std::queue tasks; + runnable onComplete; + uint tasksDone = 0; void convertPlayer(fs::path file); void convertRegion(fs::path file); public: - WorldConverter(fs::path folder, const Content* content, - std::shared_ptr lut); + WorldConverter( + fs::path folder, const Content* content, + std::shared_ptr lut + ); ~WorldConverter(); bool hasNext() const; void convertNext(); + void setOnComplete(runnable callback) { + this->onComplete = callback; + } + + void update() override { + convertNext(); + if (onComplete && !hasNext()) { + onComplete(); + } + } + + void terminate() override { + tasks = {}; + } + void write(); - uint getTotalTasks() const; + uint getWorkRemaining() const override; + uint getWorkDone() const override; }; #endif // FILES_WORLD_CONVERTER_H_ diff --git a/src/frontend/menu/menu.cpp b/src/frontend/menu/menu.cpp index 401619dd..72fe1c76 100644 --- a/src/frontend/menu/menu.cpp +++ b/src/frontend/menu/menu.cpp @@ -8,6 +8,7 @@ #include #include +#include "../../interfaces/Task.h" #include "../../graphics/ui/GUI.h" #include "../../graphics/ui/gui_util.h" #include "../../graphics/ui/elements/containers.h" @@ -104,35 +105,27 @@ static void show_content_missing( menu->setPage("missing-content"); } -void show_process_panel(Engine* engine, std::shared_ptr converter, runnable postRunnable) { +void show_process_panel(Engine* engine, std::shared_ptr task, std::wstring text=L"") { auto menu = engine->getGUI()->getMenu(); auto panel = menus::create_page(engine, "process", 400, 0.5f, 1); - panel->add(std::make_shared