aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/minecraft/mod/tasks/BasicFolderLoadTask.h')
-rw-r--r--launcher/minecraft/mod/tasks/BasicFolderLoadTask.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h
new file mode 100644
index 00000000..cc02a9b9
--- /dev/null
+++ b/launcher/minecraft/mod/tasks/BasicFolderLoadTask.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#include <QDir>
+#include <QMap>
+#include <QObject>
+
+#include <memory>
+
+#include "minecraft/mod/Resource.h"
+
+#include "tasks/Task.h"
+
+/** Very simple task that just loads a folder's contents directly.
+ */
+class BasicFolderLoadTask : public Task
+{
+ Q_OBJECT
+public:
+ struct Result {
+ QMap<QString, Resource::Ptr> resources;
+ };
+ using ResultPtr = std::shared_ptr<Result>;
+
+ [[nodiscard]] ResultPtr result() const {
+ return m_result;
+ }
+
+public:
+ BasicFolderLoadTask(QDir dir) : Task(nullptr, false), m_dir(dir), m_result(new Result) {}
+
+ [[nodiscard]] bool canAbort() const override { return true; }
+ bool abort() override { m_aborted = true; return true; }
+
+ void executeTask() override
+ {
+ m_dir.refresh();
+ for (auto entry : m_dir.entryInfoList()) {
+ auto resource = new Resource(entry);
+ m_result->resources.insert(resource->internal_id(), resource);
+ }
+
+ if (m_aborted)
+ emitAborted();
+ else
+ emitSucceeded();
+ }
+
+private:
+ QDir m_dir;
+ ResultPtr m_result;
+
+ bool m_aborted = false;
+};