#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include "ui/widgets/ModFilterWidget.h" namespace Flame { using LogoMap = QMap; using LogoCallback = std::function; class ListModel : public QAbstractListModel { Q_OBJECT public: ListModel(QObject* parent); virtual ~ListModel(); int rowCount(const QModelIndex& parent) const override; int columnCount(const QModelIndex& parent) const override; QVariant data(const QModelIndex& index, int role) const override; bool setData(const QModelIndex& index, const QVariant& value, int role) override; Qt::ItemFlags flags(const QModelIndex& index) const override; bool canFetchMore(const QModelIndex& parent) const override; void fetchMore(const QModelIndex& parent) override; void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); void searchWithTerm(const QString& term, int sort, std::shared_ptr filter, bool filterChanged); bool hasActiveSearchJob() const { return m_jobPtr && m_jobPtr->isRunning(); } Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? m_jobPtr : nullptr; } private slots: void performPaginatedSearch(); void logoFailed(QString logo); void logoLoaded(QString logo, QIcon out); void searchRequestFinished(QList&); void searchRequestFailed(QString reason); void searchRequestForOneSucceeded(ModPlatform::IndexedPack::Ptr); private: void requestLogo(QString file, QString url); private: QList m_modpacks; QStringList m_failedLogos; QStringList m_loadingLogos; LogoMap m_logoMap; QMap m_waitingCallbacks; QString m_currentSearchTerm; int m_currentSort = 0; std::shared_ptr m_filter; int m_nextSearchOffset = 0; enum SearchState { None, CanPossiblyFetchMore, ResetRequested, Finished } m_searchState = None; Task::Ptr m_jobPtr; }; } // namespace Flame