Add CurseForge support

Currently doesn't work. Will try another approach to modrinth filter.

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
TheKodeToad 2025-03-26 16:11:53 +00:00
parent 1d1480f470
commit 5ece4bae70
No known key found for this signature in database
GPG key ID: 5E39D70B4C93C38E
6 changed files with 122 additions and 6 deletions

View file

@ -43,12 +43,13 @@ class FlameAPI : public NetworkResourceAPI {
case ModPlatform::ResourceType::MOD: case ModPlatform::ResourceType::MOD:
return 6; return 6;
case ModPlatform::ResourceType::RESOURCE_PACK: case ModPlatform::ResourceType::RESOURCE_PACK:
case ModPlatform::ResourceType::DATA_PACK:
return 12; return 12;
case ModPlatform::ResourceType::SHADER_PACK: case ModPlatform::ResourceType::SHADER_PACK:
return 6552; return 6552;
case ModPlatform::ResourceType::MODPACK: case ModPlatform::ResourceType::MODPACK:
return 4471; return 4471;
case ModPlatform::ResourceType::DATA_PACK:
return 6945;
} }
} }
@ -69,7 +70,7 @@ class FlameAPI : public NetworkResourceAPI {
case ModPlatform::NeoForge: case ModPlatform::NeoForge:
return 6; return 6;
case ModPlatform::DataPack: case ModPlatform::DataPack:
break; // not supported break; // not supported
} }
return 0; return 0;
} }

View file

@ -397,10 +397,9 @@ void ResourceDownloadDialog::setResourceMetadata(const std::shared_ptr<Metadata:
page->openProject(meta->project_id); page->openProject(meta->project_id);
} }
DataPackDownloadDialog::DataPackDownloadDialog(QWidget* parent, DataPackDownloadDialog::DataPackDownloadDialog(QWidget* parent,
const std::shared_ptr<DataPackFolderModel>& data_packs, const std::shared_ptr<DataPackFolderModel>& data_packs,
BaseInstance* instance) BaseInstance* instance)
: ResourceDownloadDialog(parent, data_packs), m_instance(instance) : ResourceDownloadDialog(parent, data_packs), m_instance(instance)
{ {
setWindowTitle(dialogTitle()); setWindowTitle(dialogTitle());
@ -416,6 +415,8 @@ QList<BasePage*> DataPackDownloadDialog::getPages()
{ {
QList<BasePage*> pages; QList<BasePage*> pages;
pages.append(ModrinthDataPackPage::create(this, *m_instance)); pages.append(ModrinthDataPackPage::create(this, *m_instance));
if (APPLICATION->capabilities() & Application::SupportsFlame)
pages.append(FlameDataPackPage::create(this, *m_instance));
return pages; return pages;
} }

View file

@ -170,4 +170,32 @@ auto FlameShaderPackModel::documentToArray(QJsonDocument& obj) const -> QJsonArr
return Json::ensureArray(obj.object(), "data"); return Json::ensureArray(obj.object(), "data");
} }
FlameDataPackModel::FlameDataPackModel(const BaseInstance& base) : DataPackResourceModel(base, new FlameAPI) {}
void FlameDataPackModel::loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj)
{
FlameMod::loadIndexedPack(m, obj);
}
// We already deal with the URLs when initializing the pack, due to the API response's structure
void FlameDataPackModel::loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj)
{
FlameMod::loadBody(m, obj);
}
void FlameDataPackModel::loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonArray& arr)
{
FlameMod::loadIndexedPackVersions(m, arr);
}
bool FlameDataPackModel::optedOut(const ModPlatform::IndexedVersion& ver) const
{
return isOptedOut(ver);
}
auto FlameDataPackModel::documentToArray(QJsonDocument& obj) const -> QJsonArray
{
return Json::ensureArray(obj.object(), "data");
}
} // namespace ResourceDownload } // namespace ResourceDownload

View file

@ -93,4 +93,23 @@ class FlameShaderPackModel : public ShaderPackResourceModel {
auto documentToArray(QJsonDocument& obj) const -> QJsonArray override; auto documentToArray(QJsonDocument& obj) const -> QJsonArray override;
}; };
class FlameDataPackModel : public DataPackResourceModel {
Q_OBJECT
public:
FlameDataPackModel(const BaseInstance&);
~FlameDataPackModel() override = default;
bool optedOut(const ModPlatform::IndexedVersion& ver) const override;
private:
[[nodiscard]] QString debugName() const override { return Flame::debugName() + " (Model)"; }
[[nodiscard]] QString metaEntryBase() const override { return Flame::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

View file

@ -152,6 +152,22 @@ void FlameTexturePackPage::openUrl(const QUrl& url)
TexturePackResourcePage::openUrl(url); TexturePackResourcePage::openUrl(url);
} }
void FlameDataPackPage::openUrl(const QUrl& url)
{
if (url.scheme().isEmpty()) {
QString query = url.query(QUrl::FullyDecoded);
if (query.startsWith("remoteUrl=")) {
// attempt to resolve url from warning page
query.remove(0, 10);
DataPackResourcePage::openUrl({ QUrl::fromPercentEncoding(query.toUtf8()) }); // double decoding is necessary
return;
}
}
DataPackResourcePage::openUrl(url);
}
FlameShaderPackPage::FlameShaderPackPage(ShaderPackDownloadDialog* dialog, BaseInstance& instance) FlameShaderPackPage::FlameShaderPackPage(ShaderPackDownloadDialog* dialog, BaseInstance& instance)
: ShaderPackResourcePage(dialog, instance) : ShaderPackResourcePage(dialog, instance)
{ {
@ -171,6 +187,25 @@ FlameShaderPackPage::FlameShaderPackPage(ShaderPackDownloadDialog* dialog, BaseI
m_ui->packDescription->setMetaEntry(metaEntryBase()); m_ui->packDescription->setMetaEntry(metaEntryBase());
} }
FlameDataPackPage::FlameDataPackPage(DataPackDownloadDialog* dialog, BaseInstance& instance)
: DataPackResourcePage(dialog, instance)
{
m_model = new FlameDataPackModel(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, &FlameDataPackPage::onSelectionChanged);
connect(m_ui->versionSelectionBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&FlameDataPackPage::onVersionSelectionChanged);
connect(m_ui->resourceSelectionButton, &QPushButton::clicked, this, &FlameDataPackPage::onResourceSelected);
m_ui->packDescription->setMetaEntry(metaEntryBase());
}
void FlameShaderPackPage::openUrl(const QUrl& url) void FlameShaderPackPage::openUrl(const QUrl& url)
{ {
if (url.scheme().isEmpty()) { if (url.scheme().isEmpty()) {
@ -206,6 +241,10 @@ auto FlameShaderPackPage::shouldDisplay() const -> bool
{ {
return true; return true;
} }
auto FlameDataPackPage::shouldDisplay() const -> bool
{
return true;
}
unique_qobject_ptr<ModFilterWidget> FlameModPage::createFilterWidget() unique_qobject_ptr<ModFilterWidget> FlameModPage::createFilterWidget()
{ {

View file

@ -39,6 +39,7 @@
#pragma once #pragma once
#include <ui/pages/modplatform/DataPackPage.h>
#include "Application.h" #include "Application.h"
#include "modplatform/ResourceAPI.h" #include "modplatform/ResourceAPI.h"
@ -180,4 +181,31 @@ class FlameShaderPackPage : public ShaderPackResourcePage {
void openUrl(const QUrl& url) override; void openUrl(const QUrl& url) override;
}; };
class FlameDataPackPage : public DataPackResourcePage {
Q_OBJECT
public:
static FlameDataPackPage* create(DataPackDownloadDialog* dialog, BaseInstance& instance)
{
return DataPackResourcePage::create<FlameDataPackPage>(dialog, instance);
}
FlameDataPackPage(DataPackDownloadDialog* dialog, BaseInstance& instance);
~FlameDataPackPage() override = default;
[[nodiscard]] bool shouldDisplay() const override;
[[nodiscard]] inline auto displayName() const -> QString override { return Flame::displayName(); }
[[nodiscard]] inline auto icon() const -> QIcon override { return Flame::icon(); }
[[nodiscard]] inline auto id() const -> QString override { return Flame::id(); }
[[nodiscard]] inline auto debugName() const -> QString override { return Flame::debugName(); }
[[nodiscard]] inline auto metaEntryBase() const -> QString override { return Flame::metaEntryBase(); }
[[nodiscard]] inline auto helpPage() const -> QString override { return ""; }
void openUrl(const QUrl& url) override;
};
} // namespace ResourceDownload } // namespace ResourceDownload