aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml2
-rw-r--r--launcher/Application.cpp3
-rw-r--r--launcher/CMakeLists.txt13
-rw-r--r--launcher/meta/Version.cpp5
-rw-r--r--launcher/meta/Version.h3
-rw-r--r--launcher/minecraft/PackProfile.cpp2
-rw-r--r--launcher/modplatform/ModIndex.h2
-rw-r--r--launcher/modplatform/flame/FlameAPI.h2
-rw-r--r--launcher/modplatform/modrinth/ModrinthAPI.h4
-rw-r--r--launcher/ui/MainWindow.cpp1
-rw-r--r--launcher/ui/dialogs/ResourceDownloadDialog.cpp79
-rw-r--r--launcher/ui/dialogs/ResourceDownloadDialog.h60
-rw-r--r--launcher/ui/pages/instance/ResourcePackPage.cpp104
-rw-r--r--launcher/ui/pages/instance/ResourcePackPage.h24
-rw-r--r--launcher/ui/pages/instance/ShaderPackPage.cpp98
-rw-r--r--launcher/ui/pages/instance/ShaderPackPage.h25
-rw-r--r--launcher/ui/pages/instance/TexturePackPage.cpp106
-rw-r--r--launcher/ui/pages/instance/TexturePackPage.h25
-rw-r--r--launcher/ui/pages/modplatform/ResourceModel.h2
-rw-r--r--launcher/ui/pages/modplatform/ResourcePackModel.cpp46
-rw-r--r--launcher/ui/pages/modplatform/ResourcePackModel.h43
-rw-r--r--launcher/ui/pages/modplatform/ResourcePackPage.cpp46
-rw-r--r--launcher/ui/pages/modplatform/ResourcePackPage.h52
-rw-r--r--launcher/ui/pages/modplatform/ShaderPackModel.cpp46
-rw-r--r--launcher/ui/pages/modplatform/ShaderPackModel.h43
-rw-r--r--launcher/ui/pages/modplatform/ShaderPackPage.cpp54
-rw-r--r--launcher/ui/pages/modplatform/ShaderPackPage.h54
-rw-r--r--launcher/ui/pages/modplatform/TexturePackModel.cpp84
-rw-r--r--launcher/ui/pages/modplatform/TexturePackModel.h27
-rw-r--r--launcher/ui/pages/modplatform/TexturePackPage.h50
-rw-r--r--launcher/ui/pages/modplatform/flame/FlameResourceModels.cpp82
-rw-r--r--launcher/ui/pages/modplatform/flame/FlameResourceModels.h40
-rw-r--r--launcher/ui/pages/modplatform/flame/FlameResourcePages.cpp97
-rw-r--r--launcher/ui/pages/modplatform/flame/FlameResourcePages.h56
-rw-r--r--launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.cpp66
-rw-r--r--launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.h57
-rw-r--r--launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.cpp57
-rw-r--r--launcher/ui/pages/modplatform/modrinth/ModrinthResourcePages.h72
38 files changed, 1570 insertions, 62 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8934f584..41eb5eb7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -608,7 +608,7 @@ jobs:
submodules: 'true'
- name: Install nix
if: inputs.build_type == 'Debug'
- uses: cachix/install-nix-action@v19
+ uses: cachix/install-nix-action@v20
with:
install_url: https://nixos.org/nix/install
extra_nix_config: |
diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index d6de6236..321f944b 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -612,6 +612,9 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
m_settings->registerSetting("UpdateDialogGeometry", "");
m_settings->registerSetting("ModDownloadGeometry", "");
+ m_settings->registerSetting("RPDownloadGeometry", "");
+ m_settings->registerSetting("TPDownloadGeometry", "");
+ m_settings->registerSetting("ShaderDownloadGeometry", "");
// HACK: This code feels so stupid is there a less stupid way of doing this?
{
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 1bfe9cbc..202e633c 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -720,8 +720,11 @@ SET(LAUNCHER_SOURCES
ui/pages/instance/ManagedPackPage.cpp
ui/pages/instance/ManagedPackPage.h
ui/pages/instance/TexturePackPage.h
+ ui/pages/instance/TexturePackPage.cpp
ui/pages/instance/ResourcePackPage.h
+ ui/pages/instance/ResourcePackPage.cpp
ui/pages/instance/ShaderPackPage.h
+ ui/pages/instance/ShaderPackPage.cpp
ui/pages/instance/ModFolderPage.cpp
ui/pages/instance/ModFolderPage.h
ui/pages/instance/NotesPage.cpp
@@ -773,6 +776,16 @@ SET(LAUNCHER_SOURCES
ui/pages/modplatform/ModModel.cpp
ui/pages/modplatform/ModModel.h
+ ui/pages/modplatform/ResourcePackPage.cpp
+ ui/pages/modplatform/ResourcePackModel.cpp
+
+ # Needed for MOC to find them without a corresponding .cpp
+ ui/pages/modplatform/TexturePackPage.h
+ ui/pages/modplatform/TexturePackModel.cpp
+
+ ui/pages/modplatform/ShaderPackPage.cpp
+ ui/pages/modplatform/ShaderPackModel.cpp
+
ui/pages/modplatform/atlauncher/AtlFilterModel.cpp
ui/pages/modplatform/atlauncher/AtlFilterModel.h
ui/pages/modplatform/atlauncher/AtlListModel.cpp
diff --git a/launcher/meta/Version.cpp b/launcher/meta/Version.cpp
index 68cfa55c..e617abf8 100644
--- a/launcher/meta/Version.cpp
+++ b/launcher/meta/Version.cpp
@@ -99,6 +99,11 @@ QString Meta::Version::localFilename() const
return m_uid + '/' + m_version + ".json";
}
+::Version Meta::Version::toComparableVersion() const
+{
+ return { const_cast<Meta::Version*>(this)->descriptor() };
+}
+
void Meta::Version::setType(const QString &type)
{
m_type = type;
diff --git a/launcher/meta/Version.h b/launcher/meta/Version.h
index 7228fa36..78156193 100644
--- a/launcher/meta/Version.h
+++ b/launcher/meta/Version.h
@@ -16,6 +16,7 @@
#pragma once
#include "BaseVersion.h"
+#include "../Version.h"
#include <QJsonObject>
#include <QStringList>
@@ -85,6 +86,8 @@ public:
QString localFilename() const override;
+ [[nodiscard]] ::Version toComparableVersion() const;
+
public: // for usage by format parsers only
void setType(const QString &type);
void setTime(const qint64 time);
diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp
index 13da57d9..aff05dbc 100644
--- a/launcher/minecraft/PackProfile.cpp
+++ b/launcher/minecraft/PackProfile.cpp
@@ -763,7 +763,7 @@ bool PackProfile::installComponents(QStringList selectedFiles)
continue;
}
- appendComponent(new Component(this, versionFile->uid, versionFile));
+ appendComponent(makeShared<Component>(this, versionFile->uid, versionFile));
}
scheduleSave();
diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h
index b1f8050d..40f1efc4 100644
--- a/launcher/modplatform/ModIndex.h
+++ b/launcher/modplatform/ModIndex.h
@@ -30,7 +30,7 @@ namespace ModPlatform {
enum class ResourceProvider { MODRINTH, FLAME };
-enum class ResourceType { MOD, RESOURCE_PACK };
+enum class ResourceType { MOD, RESOURCE_PACK, SHADER_PACK };
class ProviderCapabilities {
public:
diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h
index 06d749e6..5811d717 100644
--- a/launcher/modplatform/flame/FlameAPI.h
+++ b/launcher/modplatform/flame/FlameAPI.h
@@ -27,6 +27,8 @@ class FlameAPI : public NetworkResourceAPI {
default:
case ModPlatform::ResourceType::MOD:
return 6;
+ case ModPlatform::ResourceType::RESOURCE_PACK:
+ return 12;
}
}
diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h
index dda27303..b91ac5c1 100644
--- a/launcher/modplatform/modrinth/ModrinthAPI.h
+++ b/launcher/modplatform/modrinth/ModrinthAPI.h
@@ -68,6 +68,10 @@ class ModrinthAPI : public NetworkResourceAPI {
switch (type) {
case ModPlatform::ResourceType::MOD:
return "mod";
+ case ModPlatform::ResourceType::RESOURCE_PACK:
+ return "resourcepack";
+ case ModPlatform::ResourceType::SHADER_PACK:
+ return "shader";
default:
qWarning() << "Invalid resource type for Modrinth API!";
break;
diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp
index 6d21f5ed..8490b292 100644
--- a/launcher/ui/MainWindow.cpp
+++ b/launcher/ui/MainWindow.cpp
@@ -113,6 +113,7 @@
#include "minecraft/mod/tasks/LocalResourceParse.h"
#include "minecraft/mod/ModFolderModel.h"
+#include "minecraft/mod/ShaderPackFolderModel.h"
#include "minecraft/WorldList.h"
#include "KonamiCode.h"
diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp
index fa829bfb..edb7d063 100644
--- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp
+++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp
@@ -25,6 +25,9 @@
#include "ResourceDownloadTask.h"
#include "minecraft/mod/ModFolderModel.h"
+#include "minecraft/mod/ResourcePackFolderModel.h"
+#include "minecraft/mod/TexturePackFolderModel.h"
+#include "minecraft/mod/ShaderPackFolderModel.h"
#include "ui/dialogs/ReviewMessageBox.h"
@@ -229,4 +232,80 @@ QList<BasePage*> ModDownloadDialog::getPages()
return pages;
}
+
+ResourcePackDownloadDialog::ResourcePackDownloadDialog(QWidget* parent,
+ const std::shared_ptr<ResourcePackFolderModel>& resource_packs,
+ BaseInstance* instance)
+ : ResourceDownloadDialog(parent, resource_packs), m_instance(instance)
+{
+ setWindowTitle(dialogTitle());
+
+ initializeContainer();
+ connectButtons();
+
+ if (!geometrySaveKey().isEmpty())
+ restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get(geometrySaveKey()).toByteArray()));
+}
+
+QList<BasePage*> ResourcePackDownloadDialog::getPages()
+{
+ QList<BasePage*> pages;
+
+ pages.append(ModrinthResourcePackPage::create(this, *m_instance));
+ if (APPLICATION->capabilities() & Application::SupportsFlame)
+ pages.append(FlameResourcePackPage::create(this, *m_instance));
+
+ return pages;
+}
+
+
+TexturePackDownloadDialog::TexturePackDownloadDialog(QWidget* parent,
+ const std::shared_ptr<TexturePackFolderModel>& resource_packs,
+ BaseInstance* instance)
+ : ResourceDownloadDialog(parent, resource_packs), m_instance(instance)
+{
+ setWindowTitle(dialogTitle());
+
+ initializeContainer();
+ connectButtons();
+
+ if (!geometrySaveKey().isEmpty())
+ restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get(geometrySaveKey()).toByteArray()));
+}
+
+QList<BasePage*> TexturePackDownloadDialog::getPages()
+{
+ QList<BasePage*> pages;
+
+ pages.append(ModrinthTexturePackPage::create(this, *m_instance));
+ if (APPLICATION->capabilities() & Application::SupportsFlame)
+ pages.append(FlameTexturePackPage::create(this, *m_instance));
+
+ return pages;
+}
+
+
+ShaderPackDownloadDialog::ShaderPackDownloadDialog(QWidget* parent,
+ const std::shared_ptr<ShaderPackFolderModel>& shaders,
+ BaseInstance* instance)
+ : ResourceDownloadDialog(parent, shaders), m_instance(instance)
+{
+ setWindowTitle(dialogTitle());
+
+ initializeContainer();
+ connectButtons();
+
+ if (!geometrySaveKey().isEmpty())
+ restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get(geometrySaveKey()).toByteArray()));
+}
+
+QList<BasePage*> ShaderPackDownloadDialog::getPages()
+{
+ QList<BasePage*> pages;
+
+ pages.append(ModrinthShaderPackPage::create(this, *m_instance));
+
+ return pages;
+}
+
} // namespace ResourceDownload
diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.h b/launcher/ui/dialogs/ResourceDownloadDialog.h
index 19843532..5678dc8b 100644
--- a/launcher/ui/dialogs/ResourceDownloadDialog.h
+++ b/launcher/ui/dialogs/ResourceDownloadDialog.h
@@ -35,6 +35,9 @@ class QVBoxLayout;
class QDialogButtonBox;
class ResourceDownloadTask;
class ResourceFolderModel;
+class ResourcePackFolderModel;
+class TexturePackFolderModel;
+class ShaderPackFolderModel;
namespace ResourceDownload {
@@ -108,4 +111,61 @@ class ModDownloadDialog final : public ResourceDownloadDialog {
BaseInstance* m_instance;
};
+class ResourcePackDownloadDialog final : public ResourceDownloadDialog {
+ Q_OBJECT
+
+ public:
+ explicit ResourcePackDownloadDialog(QWidget* parent,
+ const std::shared_ptr<ResourcePackFolderModel>& resource_packs,
+ BaseInstance* instance);
+ ~ResourcePackDownloadDialog() override = default;
+
+ //: String that gets appended to the resource pack download dialog title ("Download " + resourcesString())
+ [[nodiscard]] QString resourcesString() const override { return tr("resource packs"); }
+ [[nodiscard]] QString geometrySaveKey() const override { return "RPDownloadGeometry"; }
+
+ QList<BasePage*> getPages() override;
+
+ private:
+ BaseInstance* m_instance;
+};
+
+class TexturePackDownloadDialog final : public ResourceDownloadDialog {
+ Q_OBJECT
+
+ public:
+ explicit TexturePackDownloadDialog(QWidget* parent,
+ const std::shared_ptr<TexturePackFolderModel>& resource_packs,
+ BaseInstance* instance);
+ ~TexturePackDownloadDialog() override = default;
+
+ //: String that gets appended to the texture pack download dialog title ("Download " + resourcesString())
+ [[nodiscard]] QString resourcesString() const override { return tr("texture packs"); }
+ [[nodiscard]] QString geometrySaveKey() const override { return "TPDownloadGeometry"; }
+
+ QList<BasePage*> getPages() override;
+
+ private:
+ BaseInstance* m_instance;
+};
+
+class ShaderPackDownloadDialog final : public ResourceDownloadDialog {
+ Q_OBJECT
+
+ public:
+ explicit ShaderPackDownloadDialog(QWidget* parent,
+ const std::shared_ptr<ShaderPackFolderModel>& shader_packs,
+ BaseInstance* instance);
+ ~ShaderPackDownloadDialog() override = default;
+
+ //: String that gets appended to the shader pack download dialog title ("Download " + resourcesString())
+ [[nodiscard]] QString resourcesString() const override { return tr("shader packs"); }
+ [[nodiscard]] QString geometrySaveKey() const override { return "ShaderDownloadGeometry"; }
+
+ QList<BasePage*> getPages() override;
+
+ private:
+ BaseInstance* m_instance;
+};
+
} // namespace ResourceDownload
diff --git a/launcher/ui/pages/instance/ResourcePackPage.cpp b/launcher/ui/pages/instance/ResourcePackPage.cpp
new file mode 100644
index 00000000..24bfb38d
--- /dev/null
+++ b/launcher/ui/pages/instance/ResourcePackPage.cpp
@@ -0,0 +1,104 @@
+// SPDX-FileCopyrightText: 2023 flowln <flowlnlnln@gmail.com>
+//
+// SPDX-License-Identifier: GPL-3.0-only AND Apache-2.0
+/*
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * This file incorporates work covered by the following copyright and
+ * permission notice:
+ *
+ * Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ResourcePackPage.h"
+
+#include "ResourceDownloadTask.h"
+
+#include "ui/dialogs/CustomMessageBox.h"
+#include "ui/dialogs/ProgressDialog.h"
+#include "ui/dialogs/ResourceDownloadDialog.h"
+
+ResourcePackPage::ResourcePackPage(MinecraftInstance* instance, std::shared_ptr<ResourcePackFolderModel> model, QWidget* parent)
+ : ExternalResourcesPage(instance, model, parent)
+{
+ ui->actionDownloadItem->setText(tr("Download packs"));
+ ui->actionDownloadItem->setToolTip(tr("Download resource packs from online platforms"));
+ ui->actionDownloadItem->setEnabled(true);
+ connect(ui->actionDownloadItem, &QAction::triggered, this, &ResourcePackPage::downloadRPs);
+ ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem);
+
+ ui->actionViewConfigs->setVisible(false);
+}
+
+bool ResourcePackPage::onSelectionChanged(const QModelIndex& current, const QModelIndex& previous)
+{
+ auto sourceCurrent = m_filterModel->mapToSource(current);
+ int row = sourceCurrent.row();
+ auto& rp = static_cast<ResourcePack&>(m_model->at(row));
+ ui->frame->updateWithResourcePack(rp);
+
+ return true;
+}
+
+void ResourcePackPage::downloadRPs()
+{
+ if (!m_controlsEnabled)
+ return;
+ if (m_instance->typeName() != "Minecraft")
+ return; // this is a null instance or a legacy instance
+
+ ResourceDownload::ResourcePackDownloadDialog mdownload(this, std::static_pointer_cast<ResourcePackFolderModel>(m_model), m_instance);
+ if (mdownload.exec()) {
+ auto tasks = new ConcurrentTask(this);
+ 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();
+
+ tasks->deleteLater();
+ });
+
+ for (auto& task : mdownload.getTasks()) {
+ tasks->addTask(task);
+ }
+
+ ProgressDialog loadDialog(this);
+ loadDialog.setSkipButton(true, tr("Abort"));
+ loadDialog.execWithTask(tasks);
+
+ m_model->update();
+ }
+}
diff --git a/launcher/ui/pages/instance/ResourcePackPage.h b/launcher/ui/pages/instance/ResourcePackPage.h
index db8af0c5..b04aa2e9 100644
--- a/launcher/ui/pages/instance/ResourcePackPage.h
+++ b/launcher/ui/pages/instance/ResourcePackPage.h
@@ -1,6 +1,8 @@
-// SPDX-License-Identifier: GPL-3.0-only
+// SPDX-FileCopyrightText: 2023 flowln <flowlnlnln@gmail.com>
+//
+// SPDX-License-Identifier: GPL-3.0-only AND Apache-2.0
/*
- * PolyMC - Minecraft Launcher
+ * Prism Launcher - Minecraft Launcher
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
*
* This program is free software: you can redistribute it and/or modify
@@ -44,12 +46,7 @@ class ResourcePackPage : public ExternalResourcesPage
{
Q_OBJECT
public:
- explicit ResourcePackPage(MinecraftInstance *instance, std::shared_ptr<ResourcePackFolderModel> model, QWidget *parent = 0)
- : ExternalResourcesPage(instance, model, parent)
- {
- ui->actionViewConfigs->setVisible(false);
- }
- virtual ~ResourcePackPage() {}
+ explicit ResourcePackPage(MinecraftInstance *instance, std::shared_ptr<ResourcePackFolderModel> model, QWidget *parent = 0);
QString displayName() const override { return tr("Resource packs"); }
QIcon icon() const override { return APPLICATION->getThemedIcon("resourcepacks"); }
@@ -63,14 +60,7 @@ public:
}
public slots:
- bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override
- {
- auto sourceCurrent = m_filterModel->mapToSource(current);
- int row = sourceCurrent.row();
- auto& rp = static_cast<ResourcePack&>(m_model->at(row));
- ui->frame->updateWithResourcePack(rp);
-
- return true;
- }
+ bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override;
+ void downloadRPs();
};
diff --git a/launcher/ui/pages/instance/ShaderPackPage.cpp b/launcher/ui/pages/instance/ShaderPackPage.cpp
new file mode 100644
index 00000000..2d0c10aa
--- /dev/null
+++ b/launcher/ui/pages/instance/ShaderPackPage.cpp
@@ -0,0 +1,98 @@
+// SPDX-FileCopyrightText: 2023 flowln <flowlnlnln@gmail.com>
+//
+// SPDX-License-Identifier: GPL-3.0-only AND Apache-2.0
+/*
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * This file incorporates work covered by the following copyright and
+ * permission notice:
+ *
+ * Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ShaderPackPage.h"
+#include "ui_ExternalResourcesPage.h"
+
+#include "ResourceDownloadTask.h"
+
+#include "minecraft/mod/ShaderPackFolderModel.h"
+
+#include "ui/dialogs/CustomMessageBox.h"
+#include "ui/dialogs/ProgressDialog.h"
+#include "ui/dialogs/ResourceDownloadDialog.h"
+
+
+ShaderPackPage::ShaderPackPage(MinecraftInstance* instance, std::shared_ptr<ShaderPackFolderModel> model, QWidget* parent)
+ : ExternalResourcesPage(instance, model, parent)
+{
+ ui->actionDownloadItem->setText(tr("Download shaders"));
+ ui->actionDownloadItem->setToolTip(tr("Download shaders from online platforms"));
+ ui->actionDownloadItem->setEnabled(true);
+ connect(ui->actionDownloadItem, &QAction::triggered, this, &ShaderPackPage::downloadShaders);
+ ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem);
+
+ ui->actionViewConfigs->setVisible(false);
+}
+
+void ShaderPackPage::downloadShaders()
+{
+ if (!m_controlsEnabled)
+ return;
+ if (m_instance->typeName() != "Minecraft")
+ return; // this is a null instance or a legacy instance
+
+ ResourceDownload::ShaderPackDownloadDialog mdownload(this, std::static_pointer_cast<ShaderPackFolderModel>(m_model), m_instance);
+ if (mdownload.exec()) {
+ auto tasks = new ConcurrentTask(this);
+ 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();
+
+ tasks->deleteLater();
+ });
+
+ for (auto& task : mdownload.getTasks()) {
+ tasks->addTask(task);
+ }
+
+ ProgressDialog loadDialog(this);
+ loadDialog.setSkipButton(true, tr("Abort"));
+ loadDialog.execWithTask(tasks);
+
+ m_model->update();
+ }
+}
diff --git a/launcher/ui/pages/instance/ShaderPackPage.h b/launcher/ui/pages/instance/ShaderPackPage.h
index 7f7ff8c1..a779fd8c 100644
--- a/launcher/ui/pages/instance/ShaderPackPage.h
+++ b/launcher/ui/pages/instance/ShaderPackPage.h
@@ -1,6 +1,8 @@
-// SPDX-License-Identifier: GPL-3.0-only
+// SPDX-FileCopyrightText: 2023 flowln <flowlnlnln@gmail.com>
+//
+// SPDX-License-Identifier: GPL-3.0-only AND Apache-2.0
/*
- * PolyMC - Minecraft Launcher
+ * Prism Launcher - Minecraft Launcher
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
*
* This program is free software: you can redistribute it and/or modify
@@ -36,28 +38,21 @@
#pragma once
#include "ExternalResourcesPage.h"
-#include "ui_ExternalResourcesPage.h"
-
-#include "minecraft/mod/ShaderPackFolderModel.h"
class ShaderPackPage : public ExternalResourcesPage
{
Q_OBJECT
public:
- explicit ShaderPackPage(MinecraftInstance *instance, std::shared_ptr<ShaderPackFolderModel> model, QWidget *parent = 0)
- : ExternalResourcesPage(instance, model, parent)
- {
- ui->actionViewConfigs->setVisible(false);
- }
- virtual ~ShaderPackPage() {}