feat(RD): add shader pack downloader
Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
		| @@ -611,6 +611,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) | ||||
|  | ||||
|         m_settings->registerSetting("ModDownloadGeometry", ""); | ||||
|         m_settings->registerSetting("RPDownloadGeometry", ""); | ||||
|         m_settings->registerSetting("ShaderDownloadGeometry", ""); | ||||
|  | ||||
|         // HACK: This code feels so stupid is there a less stupid way of doing this? | ||||
|         { | ||||
|   | ||||
| @@ -723,6 +723,7 @@ SET(LAUNCHER_SOURCES | ||||
|     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 | ||||
| @@ -777,6 +778,9 @@ SET(LAUNCHER_SOURCES | ||||
|     ui/pages/modplatform/ResourcePackPage.cpp | ||||
|     ui/pages/modplatform/ResourcePackModel.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 | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
| @@ -70,6 +70,8 @@ class ModrinthAPI : public NetworkResourceAPI { | ||||
|                 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; | ||||
|   | ||||
| @@ -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" | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
|  | ||||
| #include "minecraft/mod/ModFolderModel.h" | ||||
| #include "minecraft/mod/ResourcePackFolderModel.h" | ||||
| #include "minecraft/mod/ShaderPackFolderModel.h" | ||||
|  | ||||
| #include "ui/dialogs/ReviewMessageBox.h" | ||||
|  | ||||
| @@ -256,4 +257,28 @@ QList<BasePage*> ResourcePackDownloadDialog::getPages() | ||||
|     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 | ||||
|   | ||||
| @@ -36,6 +36,7 @@ class QDialogButtonBox; | ||||
| class ResourceDownloadTask; | ||||
| class ResourceFolderModel; | ||||
| class ResourcePackFolderModel; | ||||
| class ShaderPackFolderModel; | ||||
|  | ||||
| namespace ResourceDownload { | ||||
|  | ||||
| @@ -128,4 +129,23 @@ class ResourcePackDownloadDialog final : public ResourceDownloadDialog { | ||||
|     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 | ||||
|   | ||||
							
								
								
									
										96
									
								
								launcher/ui/pages/instance/ShaderPackPage.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								launcher/ui/pages/instance/ShaderPackPage.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| // SPDX-License-Identifier: GPL-3.0-only | ||||
| /* | ||||
|  *  PolyMC - 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(); | ||||
|     } | ||||
| } | ||||
| @@ -36,28 +36,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() {} | ||||
|     explicit ShaderPackPage(MinecraftInstance *instance, std::shared_ptr<ShaderPackFolderModel> model, QWidget *parent = nullptr); | ||||
|     ~ShaderPackPage() override = default; | ||||
|  | ||||
|     QString displayName() const override { return tr("Shader packs"); } | ||||
|     QIcon icon() const override { return APPLICATION->getThemedIcon("shaderpacks"); } | ||||
|     QString id() const override { return "shaderpacks"; } | ||||
|     QString helpPage() const override { return "Resource-packs"; } | ||||
|  | ||||
|     virtual bool shouldDisplay() const override | ||||
|     { | ||||
|         return true; | ||||
|     } | ||||
|     bool shouldDisplay() const override { return true; } | ||||
|  | ||||
|    public slots: | ||||
|     void downloadShaders(); | ||||
| }; | ||||
|   | ||||
							
								
								
									
										42
									
								
								launcher/ui/pages/modplatform/ShaderPackModel.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								launcher/ui/pages/modplatform/ShaderPackModel.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| #include "ShaderPackModel.h" | ||||
|  | ||||
| #include <QMessageBox> | ||||
|  | ||||
| namespace ResourceDownload { | ||||
|  | ||||
| ShaderPackResourceModel::ShaderPackResourceModel(BaseInstance const& base_inst, ResourceAPI* api) | ||||
|     : ResourceModel(api), m_base_instance(base_inst){}; | ||||
|  | ||||
| /******** Make data requests ********/ | ||||
|  | ||||
| ResourceAPI::SearchArgs ShaderPackResourceModel::createSearchArguments() | ||||
| { | ||||
|     auto sort = getCurrentSortingMethodByIndex(); | ||||
|     return { ModPlatform::ResourceType::SHADER_PACK, m_next_search_offset, m_search_term, sort }; | ||||
| } | ||||
|  | ||||
| ResourceAPI::VersionSearchArgs ShaderPackResourceModel::createVersionsArguments(QModelIndex& entry) | ||||
| { | ||||
|     auto& pack = m_packs[entry.row()]; | ||||
|     return { pack }; | ||||
| } | ||||
|  | ||||
| ResourceAPI::ProjectInfoArgs ShaderPackResourceModel::createInfoArguments(QModelIndex& entry) | ||||
| { | ||||
|     auto& pack = m_packs[entry.row()]; | ||||
|     return { pack }; | ||||
| } | ||||
|  | ||||
| void ShaderPackResourceModel::searchWithTerm(const QString& term, unsigned int sort) | ||||
| { | ||||
|     if (m_search_term == term && m_search_term.isNull() == term.isNull() && m_current_sort_index == sort) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     setSearchTerm(term); | ||||
|     m_current_sort_index = sort; | ||||
|  | ||||
|     refresh(); | ||||
| } | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
							
								
								
									
										39
									
								
								launcher/ui/pages/modplatform/ShaderPackModel.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								launcher/ui/pages/modplatform/ShaderPackModel.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <QAbstractListModel> | ||||
|  | ||||
| #include "BaseInstance.h" | ||||
|  | ||||
| #include "modplatform/ModIndex.h" | ||||
|  | ||||
| #include "ui/pages/modplatform/ResourceModel.h" | ||||
|  | ||||
| class Version; | ||||
|  | ||||
| namespace ResourceDownload { | ||||
|  | ||||
| class ShaderPackResourceModel : public ResourceModel { | ||||
|     Q_OBJECT | ||||
|  | ||||
|    public: | ||||
|     ShaderPackResourceModel(BaseInstance const&, ResourceAPI*); | ||||
|  | ||||
|     /* Ask the API for more information */ | ||||
|     void searchWithTerm(const QString& term, unsigned int sort); | ||||
|  | ||||
|     void loadIndexedPack(ModPlatform::IndexedPack&, QJsonObject&) override = 0; | ||||
|     void loadExtraPackInfo(ModPlatform::IndexedPack&, QJsonObject&) override = 0; | ||||
|     void loadIndexedPackVersions(ModPlatform::IndexedPack&, QJsonArray&) override = 0; | ||||
|  | ||||
|    public slots: | ||||
|     ResourceAPI::SearchArgs createSearchArguments() override; | ||||
|     ResourceAPI::VersionSearchArgs createVersionsArguments(QModelIndex&) override; | ||||
|     ResourceAPI::ProjectInfoArgs createInfoArguments(QModelIndex&) override; | ||||
|  | ||||
|    protected: | ||||
|     const BaseInstance& m_base_instance; | ||||
|  | ||||
|     auto documentToArray(QJsonDocument& obj) const -> QJsonArray override = 0; | ||||
| }; | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
							
								
								
									
										50
									
								
								launcher/ui/pages/modplatform/ShaderPackPage.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								launcher/ui/pages/modplatform/ShaderPackPage.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| #include "ShaderPackPage.h" | ||||
| #include "ui_ResourcePage.h" | ||||
|  | ||||
| #include "ShaderPackModel.h" | ||||
|  | ||||
| #include "ui/dialogs/ResourceDownloadDialog.h" | ||||
|  | ||||
| #include <QRegularExpression> | ||||
|  | ||||
| namespace ResourceDownload { | ||||
|  | ||||
| ShaderPackResourcePage::ShaderPackResourcePage(ShaderPackDownloadDialog* dialog, BaseInstance& instance) | ||||
|     : ResourcePage(dialog, instance) | ||||
| { | ||||
|     connect(m_ui->searchButton, &QPushButton::clicked, this, &ShaderPackResourcePage::triggerSearch); | ||||
|     connect(m_ui->packView, &QListView::doubleClicked, this, &ShaderPackResourcePage::onResourceSelected); | ||||
| } | ||||
|  | ||||
| /******** Callbacks to events in the UI (set up in the derived classes) ********/ | ||||
|  | ||||
| void ShaderPackResourcePage::triggerSearch() | ||||
| { | ||||
|     m_ui->packView->clearSelection(); | ||||
|     m_ui->packDescription->clear(); | ||||
|     m_ui->versionSelectionBox->clear(); | ||||
|  | ||||
|     updateSelectionButton(); | ||||
|  | ||||
|     static_cast<ShaderPackResourceModel*>(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt()); | ||||
|     m_fetch_progress.watch(m_model->activeSearchJob().get()); | ||||
| } | ||||
|  | ||||
| QMap<QString, QString> ShaderPackResourcePage::urlHandlers() const | ||||
| { | ||||
|     QMap<QString, QString> map; | ||||
|     map.insert(QRegularExpression::anchoredPattern("(?:www\\.)?modrinth\\.com\\/shaders\\/([^\\/]+)\\/?"), "modrinth"); | ||||
|     map.insert(QRegularExpression::anchoredPattern("(?:www\\.)?curseforge\\.com\\/minecraft\\/customization\\/([^\\/]+)\\/?"), "curseforge"); | ||||
|     map.insert(QRegularExpression::anchoredPattern("minecraft\\.curseforge\\.com\\/projects\\/([^\\/]+)\\/?"), "curseforge"); | ||||
|     return map; | ||||
| } | ||||
|  | ||||
| void ShaderPackResourcePage::addResourceToDialog(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& version) | ||||
| { | ||||
|     if (version.loaders.contains(QStringLiteral("canvas"))) | ||||
|         version.custom_target_folder = QStringLiteral("resourcepacks"); | ||||
|  | ||||
|     m_parent_dialog->addResource(pack, version); | ||||
| } | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
							
								
								
									
										50
									
								
								launcher/ui/pages/modplatform/ShaderPackPage.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								launcher/ui/pages/modplatform/ShaderPackPage.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "ui/pages/modplatform/ResourcePage.h" | ||||
| #include "ui/pages/modplatform/ShaderPackModel.h" | ||||
|  | ||||
| namespace Ui { | ||||
| class ResourcePage; | ||||
| } | ||||
|  | ||||
| namespace ResourceDownload { | ||||
|  | ||||
| class ShaderPackDownloadDialog; | ||||
|  | ||||
| class ShaderPackResourcePage : public ResourcePage { | ||||
|     Q_OBJECT | ||||
|  | ||||
|    public: | ||||
|     template <typename T> | ||||
|     static T* create(ShaderPackDownloadDialog* dialog, BaseInstance& instance) | ||||
|     { | ||||
|         auto page = new T(dialog, instance); | ||||
|         auto model = static_cast<ShaderPackResourceModel*>(page->getModel()); | ||||
|  | ||||
|         connect(model, &ResourceModel::versionListUpdated, page, &ResourcePage::updateVersionList); | ||||
|         connect(model, &ResourceModel::projectInfoUpdated, page, &ResourcePage::updateUi); | ||||
|  | ||||
|         return page; | ||||
|     } | ||||
|  | ||||
|     ~ShaderPackResourcePage() override = default; | ||||
|  | ||||
|     //: The plural version of 'shader pack' | ||||
|     [[nodiscard]] inline QString resourcesString() const override { return tr("shader packs"); } | ||||
|     //: The singular version of 'shader packs' | ||||
|     [[nodiscard]] inline QString resourceString() const override { return tr("shader pack"); } | ||||
|  | ||||
|     [[nodiscard]] bool supportsFiltering() const override { return false; }; | ||||
|  | ||||
|     void addResourceToDialog(ModPlatform::IndexedPack&, ModPlatform::IndexedVersion&) override; | ||||
|  | ||||
|     [[nodiscard]] QMap<QString, QString> urlHandlers() const override; | ||||
|  | ||||
|    protected: | ||||
|     ShaderPackResourcePage(ShaderPackDownloadDialog* dialog, BaseInstance& instance); | ||||
|  | ||||
|    protected slots: | ||||
|     void triggerSearch() override; | ||||
| }; | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
| @@ -44,6 +44,7 @@ | ||||
|  | ||||
| #include "ui/pages/modplatform/ModPage.h" | ||||
| #include "ui/pages/modplatform/ResourcePackPage.h" | ||||
| #include "ui/pages/modplatform/ShaderPackPage.h" | ||||
|  | ||||
| namespace ResourceDownload { | ||||
|  | ||||
|   | ||||
| @@ -69,4 +69,26 @@ auto ModrinthResourcePackModel::documentToArray(QJsonDocument& obj) const -> QJs | ||||
|     return obj.object().value("hits").toArray(); | ||||
| } | ||||
|  | ||||
| ModrinthShaderPackModel::ModrinthShaderPackModel(const BaseInstance& base)  : ShaderPackResourceModel(base, new ModrinthAPI){} | ||||
|  | ||||
| void ModrinthShaderPackModel::loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) | ||||
| { | ||||
|     ::Modrinth::loadIndexedPack(m, obj); | ||||
| } | ||||
|  | ||||
| void ModrinthShaderPackModel::loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj) | ||||
| { | ||||
|     ::Modrinth::loadExtraPackData(m, obj); | ||||
| } | ||||
|  | ||||
| void ModrinthShaderPackModel::loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonArray& arr) | ||||
| { | ||||
|     ::Modrinth::loadIndexedPackVersions(m, arr, APPLICATION->network(), &m_base_instance); | ||||
| } | ||||
|  | ||||
| auto ModrinthShaderPackModel::documentToArray(QJsonDocument& obj) const -> QJsonArray | ||||
| { | ||||
|     return obj.object().value("hits").toArray(); | ||||
| } | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
|   | ||||
| @@ -62,4 +62,22 @@ class ModrinthResourcePackModel : public ResourcePackResourceModel { | ||||
|     auto documentToArray(QJsonDocument& obj) const -> QJsonArray override; | ||||
| }; | ||||
|  | ||||
| class ModrinthShaderPackModel : public ShaderPackResourceModel { | ||||
|     Q_OBJECT | ||||
|  | ||||
|    public: | ||||
|     ModrinthShaderPackModel(const BaseInstance&); | ||||
|     ~ModrinthShaderPackModel() override = default; | ||||
|  | ||||
|    private: | ||||
|     [[nodiscard]] QString debugName() const override { return Modrinth::debugName() + " (Model)"; } | ||||
|     [[nodiscard]] QString metaEntryBase() const override { return Modrinth::metaEntryBase(); } | ||||
|  | ||||
|     void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) override; | ||||
|     void loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj) override; | ||||
|     void loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonArray& arr) override; | ||||
|  | ||||
|     auto documentToArray(QJsonDocument& obj) const -> QJsonArray override; | ||||
| }; | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
|   | ||||
| @@ -100,10 +100,29 @@ ModrinthResourcePackPage::ModrinthResourcePackPage(ResourcePackDownloadDialog* d | ||||
|     m_ui->packDescription->setMetaEntry(metaEntryBase()); | ||||
| } | ||||
|  | ||||
| ModrinthShaderPackPage::ModrinthShaderPackPage(ShaderPackDownloadDialog* dialog, BaseInstance& instance) | ||||
|     : ShaderPackResourcePage(dialog, instance) | ||||
| { | ||||
|     m_model = new ModrinthShaderPackModel(instance); | ||||
|     m_ui->packView->setModel(m_model); | ||||
|  | ||||
|     addSortings(); | ||||
|  | ||||
|     // sometimes Qt just ignores virtual slots and doesn't work as intended it seems, | ||||
|     // so it's best not to connect them in the parent's constructor... | ||||
|     connect(m_ui->sortByBox, SIGNAL(currentIndexChanged(int)), this, SLOT(triggerSearch())); | ||||
|     connect(m_ui->packView->selectionModel(), &QItemSelectionModel::currentChanged, this, &ModrinthShaderPackPage::onSelectionChanged); | ||||
|     connect(m_ui->versionSelectionBox, &QComboBox::currentTextChanged, this, &ModrinthShaderPackPage::onVersionSelectionChanged); | ||||
|     connect(m_ui->resourceSelectionButton, &QPushButton::clicked, this, &ModrinthShaderPackPage::onResourceSelected); | ||||
|  | ||||
|     m_ui->packDescription->setMetaEntry(metaEntryBase()); | ||||
| } | ||||
|  | ||||
| // I don't know why, but doing this on the parent class makes it so that | ||||
| // other mod providers start loading before being selected, at least with | ||||
| // my Qt, so we need to implement this in every derived class... | ||||
| auto ModrinthModPage::shouldDisplay() const -> bool { return true; } | ||||
| auto ModrinthResourcePackPage::shouldDisplay() const -> bool { return true; } | ||||
| auto ModrinthShaderPackPage::shouldDisplay() const -> bool { return true; } | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
|   | ||||
| @@ -43,6 +43,7 @@ | ||||
|  | ||||
| #include "ui/pages/modplatform/ModPage.h" | ||||
| #include "ui/pages/modplatform/ResourcePackPage.h" | ||||
| #include "ui/pages/modplatform/ShaderPackPage.h" | ||||
|  | ||||
| namespace ResourceDownload { | ||||
|  | ||||
| @@ -102,4 +103,27 @@ class ModrinthResourcePackPage : public ResourcePackResourcePage { | ||||
|     [[nodiscard]] inline auto helpPage() const -> QString override { return ""; } | ||||
| }; | ||||
|  | ||||
| class ModrinthShaderPackPage : public ShaderPackResourcePage { | ||||
|     Q_OBJECT | ||||
|  | ||||
|    public: | ||||
|     static ModrinthShaderPackPage* create(ShaderPackDownloadDialog* dialog, BaseInstance& instance) | ||||
|     { | ||||
|         return ShaderPackResourcePage::create<ModrinthShaderPackPage>(dialog, instance); | ||||
|     } | ||||
|  | ||||
|     ModrinthShaderPackPage(ShaderPackDownloadDialog* dialog, BaseInstance& instance); | ||||
|     ~ModrinthShaderPackPage() override = default; | ||||
|  | ||||
|     [[nodiscard]] bool shouldDisplay() const override; | ||||
|  | ||||
|     [[nodiscard]] inline auto displayName() const -> QString override { return Modrinth::displayName(); } | ||||
|     [[nodiscard]] inline auto icon() const -> QIcon override { return Modrinth::icon(); } | ||||
|     [[nodiscard]] inline auto id() const -> QString override { return Modrinth::id(); } | ||||
|     [[nodiscard]] inline auto debugName() const -> QString override { return Modrinth::debugName(); } | ||||
|     [[nodiscard]] inline auto metaEntryBase() const -> QString override { return Modrinth::metaEntryBase(); } | ||||
|  | ||||
|     [[nodiscard]] inline auto helpPage() const -> QString override { return ""; } | ||||
| }; | ||||
|  | ||||
| }  // namespace ResourceDownload | ||||
|   | ||||
		Reference in New Issue
	
	Block a user