// SPDX-FileCopyrightText: 2023 flowln <flowlnlnln@gmail.com> // // SPDX-License-Identifier: GPL-3.0-only #pragma once #include <QWidget> #include "modplatform/ModIndex.h" #include "ui/pages/modplatform/ResourcePage.h" #include "ui/pages/modplatform/ModModel.h" #include "ui/widgets/ModFilterWidget.h" namespace Ui { class ResourcePage; } namespace ResourceDownload { class ModDownloadDialog; /* This page handles most logic related to browsing and selecting mods to download. */ class ModPage : public ResourcePage { Q_OBJECT public: template<typename T> static T* create(ModDownloadDialog* dialog, BaseInstance& instance) { auto page = new T(dialog, instance); auto model = static_cast<ModModel*>(page->getModel()); auto filter_widget = ModFilterWidget::create(static_cast<MinecraftInstance&>(instance).getPackProfile()->getComponentVersion("net.minecraft"), page); page->setFilterWidget(filter_widget); model->setFilter(page->getFilter()); connect(model, &ResourceModel::versionListUpdated, page, &ResourcePage::updateVersionList); connect(model, &ResourceModel::projectInfoUpdated, page, &ResourcePage::updateUi); return page; } ~ModPage() override = default; //: The plural version of 'mod' [[nodiscard]] inline QString resourcesString() const override { return tr("mods"); } //: The singular version of 'mods' [[nodiscard]] inline QString resourceString() const override { return tr("mod"); } [[nodiscard]] QMap<QString, QString> urlHandlers() const override; void addResourceToDialog(ModPlatform::IndexedPack&, ModPlatform::IndexedVersion&) override; virtual auto validateVersion(ModPlatform::IndexedVersion& ver, QString mineVer, std::optional<ResourceAPI::ModLoaderTypes> loaders = {}) const -> bool = 0; [[nodiscard]] bool supportsFiltering() const override { return true; }; auto getFilter() const -> const std::shared_ptr<ModFilterWidget::Filter> { return m_filter; } void setFilterWidget(unique_qobject_ptr<ModFilterWidget>&); public slots: void updateVersionList() override; protected: ModPage(ModDownloadDialog* dialog, BaseInstance& instance); protected slots: virtual void filterMods(); void triggerSearch() override; protected: unique_qobject_ptr<ModFilterWidget> m_filter_widget; std::shared_ptr<ModFilterWidget::Filter> m_filter; }; } // namespace ResourceDownload