// SPDX-FileCopyrightText: 2023 flowln // // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #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 static T* create(ModDownloadDialog* dialog, BaseInstance& instance) { auto page = new T(dialog, instance); auto model = static_cast(page->getModel()); auto filter_widget = ModFilterWidget::create(static_cast(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 urlHandlers() const override; void addResourceToDialog(ModPlatform::IndexedPack&, ModPlatform::IndexedVersion&) override; virtual auto validateVersion(ModPlatform::IndexedVersion& ver, QString mineVer, std::optional loaders = {}) const -> bool = 0; [[nodiscard]] bool supportsFiltering() const override { return true; }; auto getFilter() const -> const std::shared_ptr { return m_filter; } void setFilterWidget(unique_qobject_ptr&); public slots: void updateVersionList() override; protected: ModPage(ModDownloadDialog* dialog, BaseInstance& instance); protected slots: virtual void filterMods(); void triggerSearch() override; protected: unique_qobject_ptr m_filter_widget; std::shared_ptr m_filter; }; } // namespace ResourceDownload