// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2024 A-La-Karte Contributors #pragma once #include #include #include #include "game.h" class GameModel : public QAbstractListModel { Q_OBJECT QML_ELEMENT Q_PROPERTY(int count READ count NOTIFY countChanged) Q_PROPERTY(QString filterText READ filterText WRITE setFilterText NOTIFY filterTextChanged) Q_PROPERTY(QString filterPlatform READ filterPlatform WRITE setFilterPlatform NOTIFY filterPlatformChanged) Q_PROPERTY(bool showHidden READ showHidden WRITE setShowHidden NOTIFY showHiddenChanged) Q_PROPERTY(bool favoritesOnly READ favoritesOnly WRITE setFavoritesOnly NOTIFY favoritesOnlyChanged) Q_PROPERTY(SortMode sortMode READ sortMode WRITE setSortMode NOTIFY sortModeChanged) public: enum Roles { IdRole = Qt::UserRole + 1, NameRole, DescriptionRole, DeveloperRole, PublisherRole, CoverUrlRole, IconUrlRole, LaunchCommandRole, PlatformRole, PlatformIdRole, LastPlayedRole, PlayTimeRole, FavoriteRole, HiddenRole, InstalledRole, RunningRole, GameObjectRole }; Q_ENUM(Roles) enum SortMode { SortByName, SortByLastPlayed, SortByPlayTime, SortByPlatform, SortByRecent }; Q_ENUM(SortMode) explicit GameModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; Qt::ItemFlags flags(const QModelIndex &index) const override; QHash roleNames() const override; int count() const; QString filterText() const; void setFilterText(const QString &text); QString filterPlatform() const; void setFilterPlatform(const QString &platform); bool showHidden() const; void setShowHidden(bool show); bool favoritesOnly() const; void setFavoritesOnly(bool favorites); SortMode sortMode() const; void setSortMode(SortMode mode); Q_INVOKABLE void addGame(Game *game); Q_INVOKABLE void removeGame(const QString &id); Q_INVOKABLE Game *gameAt(int index) const; Q_INVOKABLE Game *gameById(const QString &id) const; Q_INVOKABLE void clear(); Q_INVOKABLE QStringList platforms() const; Q_SIGNALS: void countChanged(); void filterTextChanged(); void filterPlatformChanged(); void showHiddenChanged(); void favoritesOnlyChanged(); void sortModeChanged(); private: QList m_games; QList m_filteredGames; QString m_filterText; QString m_filterPlatform; bool m_showHidden = false; bool m_favoritesOnly = false; SortMode m_sortMode = SortByName; void applyFilter(); void applySort(); bool matchesFilter(Game *game) const; };