feat(RD): add shader pack downloader
Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
parent
c3ea303a37
commit
b724607e31
@ -611,6 +611,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
|
|||||||
|
|
||||||
m_settings->registerSetting("ModDownloadGeometry", "");
|
m_settings->registerSetting("ModDownloadGeometry", "");
|
||||||
m_settings->registerSetting("RPDownloadGeometry", "");
|
m_settings->registerSetting("RPDownloadGeometry", "");
|
||||||
|
m_settings->registerSetting("ShaderDownloadGeometry", "");
|
||||||
|
|
||||||
// HACK: This code feels so stupid is there a less stupid way of doing this?
|
// 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.h
|
||||||
ui/pages/instance/ResourcePackPage.cpp
|
ui/pages/instance/ResourcePackPage.cpp
|
||||||
ui/pages/instance/ShaderPackPage.h
|
ui/pages/instance/ShaderPackPage.h
|
||||||
|
ui/pages/instance/ShaderPackPage.cpp
|
||||||
ui/pages/instance/ModFolderPage.cpp
|
ui/pages/instance/ModFolderPage.cpp
|
||||||
ui/pages/instance/ModFolderPage.h
|
ui/pages/instance/ModFolderPage.h
|
||||||
ui/pages/instance/NotesPage.cpp
|
ui/pages/instance/NotesPage.cpp
|
||||||
@ -777,6 +778,9 @@ SET(LAUNCHER_SOURCES
|
|||||||
ui/pages/modplatform/ResourcePackPage.cpp
|
ui/pages/modplatform/ResourcePackPage.cpp
|
||||||
ui/pages/modplatform/ResourcePackModel.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.cpp
|
||||||
ui/pages/modplatform/atlauncher/AtlFilterModel.h
|
ui/pages/modplatform/atlauncher/AtlFilterModel.h
|
||||||
ui/pages/modplatform/atlauncher/AtlListModel.cpp
|
ui/pages/modplatform/atlauncher/AtlListModel.cpp
|
||||||
|
@ -30,7 +30,7 @@ namespace ModPlatform {
|
|||||||
|
|
||||||
enum class ResourceProvider { MODRINTH, FLAME };
|
enum class ResourceProvider { MODRINTH, FLAME };
|
||||||
|
|
||||||
enum class ResourceType { MOD, RESOURCE_PACK };
|
enum class ResourceType { MOD, RESOURCE_PACK, SHADER_PACK };
|
||||||
|
|
||||||
class ProviderCapabilities {
|
class ProviderCapabilities {
|
||||||
public:
|
public:
|
||||||
|
@ -70,6 +70,8 @@ class ModrinthAPI : public NetworkResourceAPI {
|
|||||||
return "mod";
|
return "mod";
|
||||||
case ModPlatform::ResourceType::RESOURCE_PACK:
|
case ModPlatform::ResourceType::RESOURCE_PACK:
|
||||||
return "resourcepack";
|
return "resourcepack";
|
||||||
|
case ModPlatform::ResourceType::SHADER_PACK:
|
||||||
|
return "shader";
|
||||||
default:
|
default:
|
||||||
qWarning() << "Invalid resource type for Modrinth API!";
|
qWarning() << "Invalid resource type for Modrinth API!";
|
||||||
break;
|
break;
|
||||||
|
@ -113,6 +113,7 @@
|
|||||||
|
|
||||||
#include "minecraft/mod/tasks/LocalResourceParse.h"
|
#include "minecraft/mod/tasks/LocalResourceParse.h"
|
||||||
#include "minecraft/mod/ModFolderModel.h"
|
#include "minecraft/mod/ModFolderModel.h"
|
||||||
|
#include "minecraft/mod/ShaderPackFolderModel.h"
|
||||||
#include "minecraft/WorldList.h"
|
#include "minecraft/WorldList.h"
|
||||||
|
|
||||||
#include "KonamiCode.h"
|
#include "KonamiCode.h"
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "minecraft/mod/ModFolderModel.h"
|
#include "minecraft/mod/ModFolderModel.h"
|
||||||
#include "minecraft/mod/ResourcePackFolderModel.h"
|
#include "minecraft/mod/ResourcePackFolderModel.h"
|
||||||
|
#include "minecraft/mod/ShaderPackFolderModel.h"
|
||||||
|
|
||||||
#include "ui/dialogs/ReviewMessageBox.h"
|
#include "ui/dialogs/ReviewMessageBox.h"
|
||||||
|
|
||||||
@ -256,4 +257,28 @@ QList<BasePage*> ResourcePackDownloadDialog::getPages()
|
|||||||
return pages;
|
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
|
} // namespace ResourceDownload
|
||||||
|
@ -36,6 +36,7 @@ class QDialogButtonBox;
|
|||||||
class ResourceDownloadTask;
|
class ResourceDownloadTask;
|
||||||
class ResourceFolderModel;
|
class ResourceFolderModel;
|
||||||
class ResourcePackFolderModel;
|
class ResourcePackFolderModel;
|
||||||
|
class ShaderPackFolderModel;
|
||||||
|
|
||||||
namespace ResourceDownload {
|
namespace ResourceDownload {
|
||||||
|
|
||||||
@ -128,4 +129,23 @@ class ResourcePackDownloadDialog final : public ResourceDownloadDialog {
|
|||||||
BaseInstance* m_instance;
|
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
|
} // 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
|
#pragma once
|
||||||
|
|
||||||
#include "ExternalResourcesPage.h"
|
#include "ExternalResourcesPage.h"
|
||||||
#include "ui_ExternalResourcesPage.h"
|
|
||||||
|
|
||||||
#include "minecraft/mod/ShaderPackFolderModel.h"
|
|
||||||
|
|
||||||
class ShaderPackPage : public ExternalResourcesPage
|
class ShaderPackPage : public ExternalResourcesPage
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit ShaderPackPage(MinecraftInstance *instance, std::shared_ptr<ShaderPackFolderModel> model, QWidget *parent = 0)
|
explicit ShaderPackPage(MinecraftInstance *instance, std::shared_ptr<ShaderPackFolderModel> model, QWidget *parent = nullptr);
|
||||||
: ExternalResourcesPage(instance, model, parent)
|
~ShaderPackPage() override = default;
|
||||||
{
|
|
||||||
ui->actionViewConfigs->setVisible(false);
|
|
||||||
}
|
|
||||||
virtual ~ShaderPackPage() {}
|
|
||||||
|
|
||||||
QString displayName() const override { return tr("Shader packs"); }
|
QString displayName() const override { return tr("Shader packs"); }
|
||||||
QIcon icon() const override { return APPLICATION->getThemedIcon("shaderpacks"); }
|
QIcon icon() const override { return APPLICATION->getThemedIcon("shaderpacks"); }
|
||||||
QString id() const override { return "shaderpacks"; }
|
QString id() const override { return "shaderpacks"; }
|
||||||
QString helpPage() const override { return "Resource-packs"; }
|
QString helpPage() const override { return "Resource-packs"; }
|
||||||
|
|
||||||
virtual bool shouldDisplay() const override
|
bool shouldDisplay() const override { return true; }
|
||||||
{
|
|
||||||
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/ModPage.h"
|
||||||
#include "ui/pages/modplatform/ResourcePackPage.h"
|
#include "ui/pages/modplatform/ResourcePackPage.h"
|
||||||
|
#include "ui/pages/modplatform/ShaderPackPage.h"
|
||||||
|
|
||||||
namespace ResourceDownload {
|
namespace ResourceDownload {
|
||||||
|
|
||||||
|
@ -69,4 +69,26 @@ auto ModrinthResourcePackModel::documentToArray(QJsonDocument& obj) const -> QJs
|
|||||||
return obj.object().value("hits").toArray();
|
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
|
} // namespace ResourceDownload
|
||||||
|
@ -62,4 +62,22 @@ class ModrinthResourcePackModel : public ResourcePackResourceModel {
|
|||||||
auto documentToArray(QJsonDocument& obj) const -> QJsonArray override;
|
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
|
} // namespace ResourceDownload
|
||||||
|
@ -100,10 +100,29 @@ ModrinthResourcePackPage::ModrinthResourcePackPage(ResourcePackDownloadDialog* d
|
|||||||
m_ui->packDescription->setMetaEntry(metaEntryBase());
|
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
|
// 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
|
// other mod providers start loading before being selected, at least with
|
||||||
// my Qt, so we need to implement this in every derived class...
|
// my Qt, so we need to implement this in every derived class...
|
||||||
auto ModrinthModPage::shouldDisplay() const -> bool { return true; }
|
auto ModrinthModPage::shouldDisplay() const -> bool { return true; }
|
||||||
auto ModrinthResourcePackPage::shouldDisplay() const -> bool { return true; }
|
auto ModrinthResourcePackPage::shouldDisplay() const -> bool { return true; }
|
||||||
|
auto ModrinthShaderPackPage::shouldDisplay() const -> bool { return true; }
|
||||||
|
|
||||||
} // namespace ResourceDownload
|
} // namespace ResourceDownload
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#include "ui/pages/modplatform/ModPage.h"
|
#include "ui/pages/modplatform/ModPage.h"
|
||||||
#include "ui/pages/modplatform/ResourcePackPage.h"
|
#include "ui/pages/modplatform/ResourcePackPage.h"
|
||||||
|
#include "ui/pages/modplatform/ShaderPackPage.h"
|
||||||
|
|
||||||
namespace ResourceDownload {
|
namespace ResourceDownload {
|
||||||
|
|
||||||
@ -102,4 +103,27 @@ class ModrinthResourcePackPage : public ResourcePackResourcePage {
|
|||||||
[[nodiscard]] inline auto helpPage() const -> QString override { return ""; }
|
[[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
|
} // namespace ResourceDownload
|
||||||
|
Loading…
Reference in New Issue
Block a user