From 92a1403c09e727ab067901b9e5d98c7f70fe9ff3 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 8 May 2026 00:38:09 +0300 Subject: [PATCH] refactor VanillaCreationTask Signed-off-by: Trial97 --- launcher/InstanceCreationTask.cpp | 62 +-------------- launcher/InstanceCreationTask.h | 11 +-- launcher/InstanceImportTask.cpp | 6 +- launcher/InstanceTask.cpp | 79 ++++++++++++++++++- launcher/InstanceTask.h | 15 +++- .../minecraft/VanillaInstanceCreationTask.cpp | 30 ++++--- .../minecraft/VanillaInstanceCreationTask.h | 17 ++-- 7 files changed, 128 insertions(+), 92 deletions(-) diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index e58926660..f254ec249 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -15,9 +15,6 @@ bool InstanceCreationTask::abort() } m_abort = true; - if (m_gameFilesTask) { - return m_gameFilesTask->abort(); - } return InstanceTask::abort(); } @@ -37,8 +34,8 @@ void InstanceCreationTask::executeTask() return; } - m_instance = createInstance(); - if (!m_instance) { + auto instance = createInstance(); + if (!instance) { if (m_abort) { return; } @@ -84,59 +81,6 @@ void InstanceCreationTask::executeTask() } if (!m_abort) { - if (!APPLICATION->settings()->get("DownloadGameFilesDuringInstanceCreation").toBool()) { - emitSucceeded(); - return; - } - setAbortable(true); - setAbortButtonText(tr("Skip")); - qDebug() << "Downloading game files"; - - auto updateTasks = m_instance->createUpdateTask(); - if (updateTasks.isEmpty()) { - emitSucceeded(); - return; - } - auto task = makeShared(); - task->addTask(makeShared(m_instance.get(), Net::Mode::Online)); - for (const auto& t : updateTasks) { - task->addTask(t); - } - connect(task.get(), &Task::finished, this, [this, task] { - if (task->wasSuccessful() || m_abort) { - emitSucceeded(); - } else { - emitFailed(tr("Could not download game files: %1").arg(task->failReason())); - } - }); - propagateFromOther(task.get()); - setDetails(tr("Downloading game files")); - - m_gameFilesTask = task; - m_gameFilesTask->start(); - } -} - -void InstanceCreationTask::scheduleToDelete(QWidget* parent, const QDir& dir, const QString& path, bool checkDisabled) -{ - if (path.isEmpty()) { - return; - } - if (path.startsWith("saves/")) { - if (m_shouldDeleteSaves == ShouldDeleteSaves::NotAsked) { - m_shouldDeleteSaves = askIfShouldDeleteSaves(parent); - } - if (m_shouldDeleteSaves == ShouldDeleteSaves::No) { - return; - } - } - qDebug() << "Scheduling" << path << "for removal"; - m_filesToRemove.append(dir.absoluteFilePath(path)); - if (checkDisabled) { - if (path.endsWith(".disabled")) { // remove it if it was enabled/disabled by user - m_filesToRemove.append(dir.absoluteFilePath(path.chopped(9))); - } else { - m_filesToRemove.append(dir.absoluteFilePath(path + ".disabled")); - } + downloadFiles(instance.get()); } } diff --git a/launcher/InstanceCreationTask.h b/launcher/InstanceCreationTask.h index 39acaf8b2..2ab787b51 100644 --- a/launcher/InstanceCreationTask.h +++ b/launcher/InstanceCreationTask.h @@ -1,6 +1,5 @@ #pragma once -#include "BaseVersion.h" #include "InstanceTask.h" #include "minecraft/MinecraftInstance.h" @@ -8,12 +7,12 @@ class InstanceCreationTask : public InstanceTask { Q_OBJECT public: InstanceCreationTask() = default; - virtual ~InstanceCreationTask() = default; + ~InstanceCreationTask() override = default; bool abort() override; protected: - void executeTask() final override; + void executeTask() final; /** * Tries to update an already existing instance. @@ -38,16 +37,10 @@ class InstanceCreationTask : public InstanceTask { protected: void setError(const QString& message) { m_error_message = message; }; - void scheduleToDelete(QWidget* parent, const QDir& dir, const QString& path, bool checkDisabled = false); protected: bool m_abort = false; - QStringList m_filesToRemove; - ShouldDeleteSaves m_shouldDeleteSaves; - private: QString m_error_message; - std::unique_ptr m_instance; - Task::Ptr m_gameFilesTask; }; diff --git a/launcher/InstanceImportTask.cpp b/launcher/InstanceImportTask.cpp index 9b04f99b6..381c7b826 100644 --- a/launcher/InstanceImportTask.cpp +++ b/launcher/InstanceImportTask.cpp @@ -294,7 +294,8 @@ void InstanceImportTask::processFlame() inst_creation_task = makeShared(m_stagingPath, m_globalSettings, m_parent, QString(), QString()); } - inst_creation_task->setName(*this); + inst_creation_task->setName(modifiedName()); + inst_creation_task->setOriginalName(originalName(), version()); // if the icon was specified by user, use that. otherwise pull icon from the pack if (m_instIcon == "default") { auto iconKey = QString("Flame_%1_Icon").arg(name()); @@ -394,7 +395,8 @@ void InstanceImportTask::processModrinth() inst_creation_task = makeShared(m_stagingPath, m_globalSettings, m_parent, pack_id); } - inst_creation_task->setName(*this); + inst_creation_task->setName(modifiedName()); + inst_creation_task->setOriginalName(originalName(), version()); // if the icon was specified by user, use that. otherwise pull icon from the pack if (m_instIcon == "default") { auto iconKey = QString("Modrinth_%1_Icon").arg(name()); diff --git a/launcher/InstanceTask.cpp b/launcher/InstanceTask.cpp index f83779d9c..a66aeb9c3 100644 --- a/launcher/InstanceTask.cpp +++ b/launcher/InstanceTask.cpp @@ -2,7 +2,10 @@ #include #include "Application.h" +#include "minecraft/MinecraftInstance.h" +#include "minecraft/MinecraftLoadAndCheck.h" #include "settings/SettingsObject.h" +#include "tasks/SequentialTask.h" #include "ui/dialogs/CustomMessageBox.h" #include @@ -24,7 +27,7 @@ InstanceNameChange askForChangingInstanceName(QWidget* parent, const QString& ol return InstanceNameChange::ShouldKeep; } -ShouldUpdate askIfShouldUpdate(QWidget* parent, QString originalVersionName) +ShouldUpdate askIfShouldUpdate(QWidget* parent, const QString& originalVersionName) { if (APPLICATION->settings()->get("SkipModpackUpdatePrompt").toBool()) { return ShouldUpdate::SkipUpdating; @@ -104,3 +107,77 @@ ShouldDeleteSaves askIfShouldDeleteSaves(QWidget* parent) auto result = dialog->exec(); return result == QMessageBox::Yes ? ShouldDeleteSaves::Yes : ShouldDeleteSaves::No; } + +void InstanceTask::scheduleToDelete(QWidget* parent, const QDir& dir, const QString& path, bool checkDisabled) +{ + if (path.isEmpty()) { + return; + } + if (path.startsWith("saves/")) { + if (m_shouldDeleteSaves == ShouldDeleteSaves::NotAsked) { + m_shouldDeleteSaves = askIfShouldDeleteSaves(parent); + } + if (m_shouldDeleteSaves == ShouldDeleteSaves::No) { + return; + } + } + qDebug() << "Scheduling" << path << "for removal"; + m_filesToRemove.append(dir.absoluteFilePath(path)); + if (checkDisabled) { + if (path.endsWith(".disabled")) { // remove it if it was enabled/disabled by user + m_filesToRemove.append(dir.absoluteFilePath(path.chopped(9))); + } else { + m_filesToRemove.append(dir.absoluteFilePath(path + ".disabled")); + } + } +} + +void InstanceTask::downloadFiles(MinecraftInstance* inst) +{ + if (!APPLICATION->settings()->get("DownloadGameFilesDuringInstanceCreation").toBool()) { + emitSucceeded(); + return; + } + setAbortable(true); + setAbortButtonText(tr("Skip")); + qDebug() << "Downloading game files"; + + auto updateTasks = inst->createUpdateTask(); + if (updateTasks.isEmpty()) { + emitSucceeded(); + return; + } + auto task = makeShared(); + task->addTask(makeShared(inst, Net::Mode::Online)); + for (const auto& t : updateTasks) { + task->addTask(t); + } + connect(task.get(), &Task::finished, this, [this, task] { + if (isRunning()) { + return; + } + if (task->wasSuccessful()) { + emitSucceeded(); + } else { + emitFailed(tr("Could not download game files: %1").arg(task->failReason())); + } + }); + propagateFromOther(task.get()); + setDetails(tr("Downloading game files")); + + m_gameFilesTask = task; + m_gameFilesTask->start(); +} + +bool InstanceTask::abort() +{ + if (!canAbort()) { + return false; + } + + if (m_gameFilesTask) { + return m_gameFilesTask->abort(); + } + + return Task::abort(); +} diff --git a/launcher/InstanceTask.h b/launcher/InstanceTask.h index 8cb5826f4..1394b1973 100644 --- a/launcher/InstanceTask.h +++ b/launcher/InstanceTask.h @@ -4,11 +4,13 @@ #include "settings/SettingsObject.h" #include "tasks/Task.h" +class MinecraftInstance; + /* Helpers */ enum class InstanceNameChange : std::uint8_t { ShouldChange, ShouldKeep }; [[nodiscard]] InstanceNameChange askForChangingInstanceName(QWidget* parent, const QString& oldName, const QString& newName); enum class ShouldUpdate : std::uint8_t { Update, SkipUpdating, Cancel }; -[[nodiscard]] ShouldUpdate askIfShouldUpdate(QWidget* parent, QString originalVersionName); +[[nodiscard]] ShouldUpdate askIfShouldUpdate(QWidget* parent, const QString& originalVersionName); enum class ShouldDeleteSaves : std::uint8_t { NotAsked, Yes, No }; [[nodiscard]] ShouldDeleteSaves askIfShouldDeleteSaves(QWidget* parent); @@ -45,6 +47,12 @@ class InstanceTask : public Task { protected: void setOverride(bool override, const QString& instanceIdToOverride = {}); + void scheduleToDelete(QWidget* parent, const QDir& dir, const QString& path, bool checkDisabled = false); + void downloadFiles(MinecraftInstance* inst); + + public slots: + bool abort() override; + protected: /* data */ SettingsObject* m_globalSettings{}; QString m_instIcon; @@ -60,4 +68,9 @@ class InstanceTask : public Task { QString m_originalVersion; QString m_modifiedName; + + QStringList m_filesToRemove; + ShouldDeleteSaves m_shouldDeleteSaves{}; + + Task::Ptr m_gameFilesTask; }; diff --git a/launcher/minecraft/VanillaInstanceCreationTask.cpp b/launcher/minecraft/VanillaInstanceCreationTask.cpp index e646e2c52..83fa6c9ba 100644 --- a/launcher/minecraft/VanillaInstanceCreationTask.cpp +++ b/launcher/minecraft/VanillaInstanceCreationTask.cpp @@ -8,26 +8,30 @@ #include "settings/INISettingsObject.h" VanillaCreationTask::VanillaCreationTask(BaseVersion::Ptr version, QString loader, BaseVersion::Ptr loaderVersion) - : m_version(std::move(version)), m_using_loader(true), m_loader(std::move(loader)), m_loader_version(std::move(loaderVersion)) + : m_version(std::move(version)), m_usingLoader(true), m_loader(std::move(loader)), m_loaderVersion(std::move(loaderVersion)) {} -std::unique_ptr VanillaCreationTask::createInstance() +void VanillaCreationTask::executeTask() { setStatus(tr("Creating instance from version %1").arg(m_version->name())); - auto inst = std::make_unique( + m_instance = std::make_unique( m_globalSettings, std::make_unique(FS::PathCombine(m_stagingPath, "instance.cfg")), m_stagingPath); - SettingsObject::Lock lock(inst->settings()); + { + SettingsObject::Lock lock(m_instance->settings()); - auto* components = inst->getPackProfile(); - components->buildingFromScratch(); - components->setComponentVersion("net.minecraft", m_version->descriptor(), true); - if (m_using_loader) { - components->setComponentVersion(m_loader, m_loader_version->descriptor()); + auto* components = m_instance->getPackProfile(); + components->buildingFromScratch(); + components->setComponentVersion("net.minecraft", m_version->descriptor(), true); + if (m_usingLoader) { + components->setComponentVersion(m_loader, m_loaderVersion->descriptor()); + } + + m_instance->setName(name()); + m_instance->setIconKey(m_instIcon); + + components->saveNow(); } - inst->setName(name()); - inst->setIconKey(m_instIcon); - components->saveNow(); - return inst; + downloadFiles(m_instance.get()); } diff --git a/launcher/minecraft/VanillaInstanceCreationTask.h b/launcher/minecraft/VanillaInstanceCreationTask.h index c1a69ab62..4e8b26da7 100644 --- a/launcher/minecraft/VanillaInstanceCreationTask.h +++ b/launcher/minecraft/VanillaInstanceCreationTask.h @@ -1,22 +1,25 @@ #pragma once -#include "InstanceCreationTask.h" +#include +#include "BaseVersion.h" +#include "InstanceTask.h" +#include "minecraft/MinecraftInstance.h" -#include - -class VanillaCreationTask final : public InstanceCreationTask { +class VanillaCreationTask final : public InstanceTask { Q_OBJECT public: explicit VanillaCreationTask(BaseVersion::Ptr version) : m_version(std::move(version)) {} VanillaCreationTask(BaseVersion::Ptr version, QString loader, BaseVersion::Ptr loaderVersion); - std::unique_ptr createInstance() override; + void executeTask() override; private: + std::unique_ptr m_instance; + // Version to update to / create of the instance. BaseVersion::Ptr m_version; - bool m_using_loader = false; + bool m_usingLoader = false; QString m_loader; - BaseVersion::Ptr m_loader_version; + BaseVersion::Ptr m_loaderVersion; };