From d0ccd110a15c31e3bb03454518ea2c78fe38a07c Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sat, 19 Apr 2025 06:16:57 -0700 Subject: [PATCH 1/2] fix: use after free begone! Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/Application.cpp | 2 +- launcher/qtlogging.ini | 3 +++ launcher/ui/pages/instance/ModFolderPage.cpp | 24 ++++++++++++++----- launcher/ui/pages/instance/ModFolderPage.h | 4 ++++ .../ui/pages/instance/ResourcePackPage.cpp | 24 +++++++++++++------ launcher/ui/pages/instance/ResourcePackPage.h | 5 ++++ launcher/ui/pages/instance/ShaderPackPage.cpp | 21 +++++++++++----- launcher/ui/pages/instance/ShaderPackPage.h | 4 ++++ .../ui/pages/instance/TexturePackPage.cpp | 20 +++++++++++----- launcher/ui/pages/instance/TexturePackPage.h | 5 ++++ 10 files changed, 86 insertions(+), 26 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index cfe028279..33d700772 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -96,6 +96,7 @@ #include #include #include +#include #include #include #include @@ -125,7 +126,6 @@ #include #include -#include #include #include #include "SysInfo.h" diff --git a/launcher/qtlogging.ini b/launcher/qtlogging.ini index c12d1e109..10f724163 100644 --- a/launcher/qtlogging.ini +++ b/launcher/qtlogging.ini @@ -3,6 +3,9 @@ # prevent log spam and strange bugs # qt.qpa.drawing in particular causes theme artifacts on MacOS qt.*.debug=false +# supress image format noise +kf.imageformats.plugins.hdr=false +kf.imageformats.plugins.xcf=false # don't log credentials by default launcher.auth.credentials.debug=false # remove the debug lines, other log levels still get through diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 026f0c140..8508e7908 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include "Application.h" @@ -145,10 +146,17 @@ void ModFolderPage::downloadMods() QMessageBox::critical(this, tr("Error"), tr("Please install a mod loader first!")); return; } - auto mdownload = new ResourceDownload::ModDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - if (mdownload->exec()) { + + m_downloadDialog = new ResourceDownload::ModDownloadDialog(this, m_model, m_instance); + m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &ModFolderPage::downloadDialogFinished); + m_downloadDialog->open(); +} + +void ModFolderPage::downloadDialogFinished(int result) +{ + if (result) { auto tasks = new ConcurrentTask(tr("Download Mods"), APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); @@ -166,8 +174,12 @@ void ModFolderPage::downloadMods() tasks->deleteLater(); }); - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); + if (m_downloadDialog) { + for (auto& task : m_downloadDialog->getTasks()) { + tasks->addTask(task); + } + } else { + qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!"; } ProgressDialog loadDialog(this); diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h index a7d078f50..8996b1615 100644 --- a/launcher/ui/pages/instance/ModFolderPage.h +++ b/launcher/ui/pages/instance/ModFolderPage.h @@ -38,7 +38,9 @@ #pragma once +#include #include "ExternalResourcesPage.h" +#include "ui/dialogs/ResourceDownloadDialog.h" class ModFolderPage : public ExternalResourcesPage { Q_OBJECT @@ -63,6 +65,7 @@ class ModFolderPage : public ExternalResourcesPage { void removeItems(const QItemSelection& selection) override; void downloadMods(); + void downloadDialogFinished(int result); void updateMods(bool includeDeps = false); void deleteModMetadata(); void exportModMetadata(); @@ -70,6 +73,7 @@ class ModFolderPage : public ExternalResourcesPage { protected: std::shared_ptr m_model; + QPointer m_downloadDialog; }; class CoreModFolderPage : public ModFolderPage { diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp index ae5eb8fac..0d9e643b1 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.cpp +++ b/launcher/ui/pages/instance/ResourcePackPage.cpp @@ -84,10 +84,16 @@ void ResourcePackPage::downloadResourcePacks() if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance - auto mdownload = new ResourceDownload::ResourcePackDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - if (mdownload->exec()) { + m_downloadDialog = new ResourceDownload::ResourcePackDownloadDialog(this, m_model, m_instance); + m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &ResourcePackPage::downloadDialogFinished); + m_downloadDialog->open(); +} + +void ResourcePackPage::downloadDialogFinished(int result) +{ + if (result) { auto tasks = new ConcurrentTask("Download Resource Pack", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); @@ -105,8 +111,12 @@ void ResourcePackPage::downloadResourcePacks() tasks->deleteLater(); }); - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); + if (m_downloadDialog) { + for (auto& task : m_downloadDialog->getTasks()) { + tasks->addTask(task); + } + } else { + qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!"; } ProgressDialog loadDialog(this); @@ -269,4 +279,4 @@ void ResourcePackPage::changeResourcePackVersion() m_model->update(); } -} \ No newline at end of file +} diff --git a/launcher/ui/pages/instance/ResourcePackPage.h b/launcher/ui/pages/instance/ResourcePackPage.h index 55abe007c..e39d417c9 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.h +++ b/launcher/ui/pages/instance/ResourcePackPage.h @@ -37,7 +37,10 @@ #pragma once +#include + #include "ExternalResourcesPage.h" +#include "ui/dialogs/ResourceDownloadDialog.h" #include "ui_ExternalResourcesPage.h" #include "minecraft/mod/ResourcePackFolderModel.h" @@ -62,10 +65,12 @@ class ResourcePackPage : public ExternalResourcesPage { private slots: void downloadResourcePacks(); + void downloadDialogFinished(int result); void updateResourcePacks(); void deleteResourcePackMetadata(); void changeResourcePackVersion(); protected: std::shared_ptr m_model; + QPointer m_downloadDialog; }; diff --git a/launcher/ui/pages/instance/ShaderPackPage.cpp b/launcher/ui/pages/instance/ShaderPackPage.cpp index 45bb02030..829a75a72 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.cpp +++ b/launcher/ui/pages/instance/ShaderPackPage.cpp @@ -81,10 +81,15 @@ void ShaderPackPage::downloadShaderPack() if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance - auto mdownload = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - if (mdownload->exec()) { + m_downloadDialog = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance); + m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &ShaderPackPage::downloadDialogFinished); + m_downloadDialog->open(); +} + +void ShaderPackPage::downloadDialogFinished(int result) { + if (result) { auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); @@ -102,8 +107,12 @@ void ShaderPackPage::downloadShaderPack() tasks->deleteLater(); }); - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); + if (m_downloadDialog) { + for (auto& task : m_downloadDialog->getTasks()) { + tasks->addTask(task); + } + } else { + qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!"; } ProgressDialog loadDialog(this); diff --git a/launcher/ui/pages/instance/ShaderPackPage.h b/launcher/ui/pages/instance/ShaderPackPage.h index ebf7f1d58..f2b141329 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.h +++ b/launcher/ui/pages/instance/ShaderPackPage.h @@ -37,7 +37,9 @@ #pragma once +#include #include "ExternalResourcesPage.h" +#include "ui/dialogs/ResourceDownloadDialog.h" class ShaderPackPage : public ExternalResourcesPage { Q_OBJECT @@ -54,10 +56,12 @@ class ShaderPackPage : public ExternalResourcesPage { public slots: void downloadShaderPack(); + void downloadDialogFinished(int result); void updateShaderPacks(); void deleteShaderPackMetadata(); void changeShaderPackVersion(); private: std::shared_ptr m_model; + QPointer m_downloadDialog; }; diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index 6d000a486..ada29d94b 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -90,10 +90,14 @@ void TexturePackPage::downloadTexturePacks() if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance - auto mdownload = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - if (mdownload->exec()) { + auto m_downloadDialog = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance); + m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); +} + +void TexturePackPage::downloadDialogFinished(int result) +{ + if (result) { auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); @@ -111,8 +115,12 @@ void TexturePackPage::downloadTexturePacks() tasks->deleteLater(); }); - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); + if (m_downloadDialog) { + for (auto& task : m_downloadDialog->getTasks()) { + tasks->addTask(task); + } + } else { + qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!"; } ProgressDialog loadDialog(this); diff --git a/launcher/ui/pages/instance/TexturePackPage.h b/launcher/ui/pages/instance/TexturePackPage.h index 28d7ba209..3ebca3e87 100644 --- a/launcher/ui/pages/instance/TexturePackPage.h +++ b/launcher/ui/pages/instance/TexturePackPage.h @@ -37,7 +37,10 @@ #pragma once +#include + #include "ExternalResourcesPage.h" +#include "ui/dialogs/ResourceDownloadDialog.h" #include "ui_ExternalResourcesPage.h" #include "minecraft/mod/TexturePackFolderModel.h" @@ -57,10 +60,12 @@ class TexturePackPage : public ExternalResourcesPage { public slots: void updateFrame(const QModelIndex& current, const QModelIndex& previous) override; void downloadTexturePacks(); + void downloadDialogFinished(int result); void updateTexturePacks(); void deleteTexturePackMetadata(); void changeTexturePackVersion(); private: std::shared_ptr m_model; + QPointer m_downloadDialog; }; From 07a6606c9c549b70ce91225303abe90982973a72 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sat, 19 Apr 2025 06:48:04 -0700 Subject: [PATCH 2/2] fix: cover both usages of the download dialog Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/pages/instance/ModFolderPage.cpp | 42 ++++-------------- .../ui/pages/instance/ResourcePackPage.cpp | 40 ++++------------- launcher/ui/pages/instance/ShaderPackPage.cpp | 43 +++++-------------- .../ui/pages/instance/TexturePackPage.cpp | 43 +++++-------------- 4 files changed, 37 insertions(+), 131 deletions(-) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 8508e7908..dad2da8a4 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -146,11 +146,11 @@ void ModFolderPage::downloadMods() QMessageBox::critical(this, tr("Error"), tr("Please install a mod loader first!")); return; } - + m_downloadDialog = new ResourceDownload::ModDownloadDialog(this, m_model, m_instance); - m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); connect(m_downloadDialog, &QDialog::finished, this, &ModFolderPage::downloadDialogFinished); + m_downloadDialog->open(); } @@ -188,6 +188,8 @@ void ModFolderPage::downloadDialogFinished(int result) m_model->update(); } + if (m_downloadDialog) + m_downloadDialog->deleteLater(); } void ModFolderPage::updateMods(bool includeDeps) @@ -313,38 +315,12 @@ void ModFolderPage::changeModVersion() if (mods_list.length() != 1 || mods_list[0]->metadata() == nullptr) return; - auto mdownload = new ResourceDownload::ModDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - mdownload->setResourceMetadata((*mods_list.begin())->metadata()); - if (mdownload->exec()) { - auto tasks = new ConcurrentTask("Download Mods", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); - connect(tasks, &Task::failed, [this, tasks](QString reason) { - CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::aborted, [this, tasks]() { - CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::succeeded, [this, tasks]() { - QStringList warnings = tasks->warnings(); - if (warnings.count()) - CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + m_downloadDialog = new ResourceDownload::ModDownloadDialog(this, m_model, m_instance); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &ModFolderPage::downloadDialogFinished); - tasks->deleteLater(); - }); - - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); - } - - ProgressDialog loadDialog(this); - loadDialog.setSkipButton(true, tr("Abort")); - loadDialog.execWithTask(tasks); - - m_model->update(); - } + m_downloadDialog->setResourceMetadata((*mods_list.begin())->metadata()); + m_downloadDialog->open(); } void ModFolderPage::exportModMetadata() diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp index 0d9e643b1..f37b3baf9 100644 --- a/launcher/ui/pages/instance/ResourcePackPage.cpp +++ b/launcher/ui/pages/instance/ResourcePackPage.cpp @@ -85,9 +85,9 @@ void ResourcePackPage::downloadResourcePacks() return; // this is a null instance or a legacy instance m_downloadDialog = new ResourceDownload::ResourcePackDownloadDialog(this, m_model, m_instance); - m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); connect(m_downloadDialog, &QDialog::finished, this, &ResourcePackPage::downloadDialogFinished); + m_downloadDialog->open(); } @@ -125,6 +125,8 @@ void ResourcePackPage::downloadDialogFinished(int result) m_model->update(); } + if (m_downloadDialog) + m_downloadDialog->deleteLater(); } void ResourcePackPage::updateResourcePacks() @@ -247,36 +249,10 @@ void ResourcePackPage::changeResourcePackVersion() if (resource.metadata() == nullptr) return; - auto mdownload = new ResourceDownload::ResourcePackDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - mdownload->setResourceMetadata(resource.metadata()); - if (mdownload->exec()) { - auto tasks = new ConcurrentTask("Download Resource Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); - connect(tasks, &Task::failed, [this, tasks](QString reason) { - CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::aborted, [this, tasks]() { - CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::succeeded, [this, tasks]() { - QStringList warnings = tasks->warnings(); - if (warnings.count()) - CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + m_downloadDialog = new ResourceDownload::ResourcePackDownloadDialog(this, m_model, m_instance); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &ResourcePackPage::downloadDialogFinished); - tasks->deleteLater(); - }); - - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); - } - - ProgressDialog loadDialog(this); - loadDialog.setSkipButton(true, tr("Abort")); - loadDialog.execWithTask(tasks); - - m_model->update(); - } + m_downloadDialog->setResourceMetadata(resource.metadata()); + m_downloadDialog->open(); } diff --git a/launcher/ui/pages/instance/ShaderPackPage.cpp b/launcher/ui/pages/instance/ShaderPackPage.cpp index 829a75a72..930b0b9da 100644 --- a/launcher/ui/pages/instance/ShaderPackPage.cpp +++ b/launcher/ui/pages/instance/ShaderPackPage.cpp @@ -82,13 +82,14 @@ void ShaderPackPage::downloadShaderPack() return; // this is a null instance or a legacy instance m_downloadDialog = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance); - m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); connect(m_downloadDialog, &QDialog::finished, this, &ShaderPackPage::downloadDialogFinished); + m_downloadDialog->open(); } -void ShaderPackPage::downloadDialogFinished(int result) { +void ShaderPackPage::downloadDialogFinished(int result) +{ if (result) { auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); connect(tasks, &Task::failed, [this, tasks](QString reason) { @@ -121,6 +122,8 @@ void ShaderPackPage::downloadDialogFinished(int result) { m_model->update(); } + if (m_downloadDialog) + m_downloadDialog->deleteLater(); } void ShaderPackPage::updateShaderPacks() @@ -243,36 +246,10 @@ void ShaderPackPage::changeShaderPackVersion() if (resource.metadata() == nullptr) return; - auto mdownload = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - mdownload->setResourceMetadata(resource.metadata()); - if (mdownload->exec()) { - auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); - connect(tasks, &Task::failed, [this, tasks](QString reason) { - CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::aborted, [this, tasks]() { - CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::succeeded, [this, tasks]() { - QStringList warnings = tasks->warnings(); - if (warnings.count()) - CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + m_downloadDialog = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &ShaderPackPage::downloadDialogFinished); - tasks->deleteLater(); - }); - - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); - } - - ProgressDialog loadDialog(this); - loadDialog.setSkipButton(true, tr("Abort")); - loadDialog.execWithTask(tasks); - - m_model->update(); - } + m_downloadDialog->setResourceMetadata(resource.metadata()); + m_downloadDialog->open(); } diff --git a/launcher/ui/pages/instance/TexturePackPage.cpp b/launcher/ui/pages/instance/TexturePackPage.cpp index ada29d94b..2886decb4 100644 --- a/launcher/ui/pages/instance/TexturePackPage.cpp +++ b/launcher/ui/pages/instance/TexturePackPage.cpp @@ -90,9 +90,10 @@ void TexturePackPage::downloadTexturePacks() if (m_instance->typeName() != "Minecraft") return; // this is a null instance or a legacy instance - auto m_downloadDialog = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance); - m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose); + m_downloadDialog = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance); connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &TexturePackPage::downloadDialogFinished); + m_downloadDialog->open(); } void TexturePackPage::downloadDialogFinished(int result) @@ -129,6 +130,8 @@ void TexturePackPage::downloadDialogFinished(int result) m_model->update(); } + if (m_downloadDialog) + m_downloadDialog->deleteLater(); } void TexturePackPage::updateTexturePacks() @@ -251,36 +254,10 @@ void TexturePackPage::changeTexturePackVersion() if (resource.metadata() == nullptr) return; - auto mdownload = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance); - mdownload->setAttribute(Qt::WA_DeleteOnClose); - connect(this, &QObject::destroyed, mdownload, &QDialog::close); - mdownload->setResourceMetadata(resource.metadata()); - if (mdownload->exec()) { - auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); - connect(tasks, &Task::failed, [this, tasks](QString reason) { - CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::aborted, [this, tasks]() { - CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show(); - tasks->deleteLater(); - }); - connect(tasks, &Task::succeeded, [this, tasks]() { - QStringList warnings = tasks->warnings(); - if (warnings.count()) - CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + m_downloadDialog = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance); + connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close); + connect(m_downloadDialog, &QDialog::finished, this, &TexturePackPage::downloadDialogFinished); - tasks->deleteLater(); - }); - - for (auto& task : mdownload->getTasks()) { - tasks->addTask(task); - } - - ProgressDialog loadDialog(this); - loadDialog.setSkipButton(true, tr("Abort")); - loadDialog.execWithTask(tasks); - - m_model->update(); - } + m_downloadDialog->setResourceMetadata(resource.metadata()); + m_downloadDialog->open(); }