2026-01-18 12:13:07 +00:00
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
// SPDX-FileCopyrightText: 2024 A-La-Karte Contributors
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <QAbstractListModel>
|
|
|
|
|
#include <QQmlEngine>
|
|
|
|
|
#include <QSortFilterProxyModel>
|
|
|
|
|
|
|
|
|
|
#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<int, QByteArray> 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;
|
|
|
|
|
|
2026-01-19 23:13:11 +00:00
|
|
|
QList<Game *> allGames() const;
|
|
|
|
|
|
2026-01-18 12:13:07 +00:00
|
|
|
Q_SIGNALS:
|
|
|
|
|
void countChanged();
|
|
|
|
|
void filterTextChanged();
|
|
|
|
|
void filterPlatformChanged();
|
|
|
|
|
void showHiddenChanged();
|
|
|
|
|
void favoritesOnlyChanged();
|
|
|
|
|
void sortModeChanged();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QList<Game *> m_games;
|
|
|
|
|
QList<Game *> 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;
|
|
|
|
|
};
|