From facfc3cc521782821ff238a58e37e6a47919b695 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Wed, 28 Mar 2012 23:52:21 +0200 Subject: [PATCH] added more filter options to GamesProxyModel, user interface still missing (related to issue #32) --- cockatrice/src/gamesmodel.cpp | 58 ++++++++++++++++++++++++++++++++++- cockatrice/src/gamesmodel.h | 10 ++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/cockatrice/src/gamesmodel.cpp b/cockatrice/src/gamesmodel.cpp index 687bb43e..40a17c65 100644 --- a/cockatrice/src/gamesmodel.cpp +++ b/cockatrice/src/gamesmodel.cpp @@ -99,7 +99,11 @@ void GamesModel::updateGameList(const ServerInfo_Game &game) } GamesProxyModel::GamesProxyModel(QObject *parent, ServerInfo_User *_ownUser) - : QSortFilterProxyModel(parent), ownUser(_ownUser), unavailableGamesVisible(false) + : QSortFilterProxyModel(parent), + ownUser(_ownUser), + unavailableGamesVisible(false), + maxPlayersFilterMin(-1), + maxPlayersFilterMax(-1) { setDynamicSortFilter(true); } @@ -110,6 +114,41 @@ void GamesProxyModel::setUnavailableGamesVisible(bool _unavailableGamesVisible) invalidateFilter(); } +void GamesProxyModel::setGameNameFilter(const QString &_gameNameFilter) +{ + gameNameFilter = _gameNameFilter; + invalidateFilter(); +} + +void GamesProxyModel::setCreatorNameFilter(const QString &_creatorNameFilter) +{ + creatorNameFilter = _creatorNameFilter; + invalidateFilter(); +} + +void GamesProxyModel::setGameTypeFilter(const QSet &_gameTypeFilter) +{ + gameTypeFilter = _gameTypeFilter; + invalidateFilter(); +} + +void GamesProxyModel::setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax) +{ + maxPlayersFilterMin = _maxPlayersFilterMin; + maxPlayersFilterMax = _maxPlayersFilterMax; + invalidateFilter(); +} + +void GamesProxyModel::resetFilterParameters() +{ + unavailableGamesVisible = false; + gameNameFilter = QString(); + creatorNameFilter = QString(); + gameTypeFilter.clear(); + maxPlayersFilterMin = -1; + maxPlayersFilterMax = -1; +} + bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &/*sourceParent*/) const { GamesModel *model = qobject_cast(sourceModel()); @@ -126,6 +165,23 @@ bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &/*sourc if (game.only_registered()) return false; } + if (!gameNameFilter.isEmpty()) + if (!QString::fromStdString(game.description()).contains(gameNameFilter, Qt::CaseInsensitive)) + return false; + if (!creatorNameFilter.isEmpty()) + if (!QString::fromStdString(game.creator_info().name()).contains(creatorNameFilter, Qt::CaseInsensitive)) + return false; + + QSet gameTypes; + for (int i = 0; i < game.game_types_size(); ++i) + gameTypes.insert(game.game_types(i)); + if (!gameTypeFilter.isEmpty() && gameTypes.intersect(gameTypeFilter).isEmpty()) + return false; + + if ((maxPlayersFilterMin != -1) && (game.max_players() < maxPlayersFilterMin)) + return false; + if ((maxPlayersFilterMax != -1) && (game.max_players() > maxPlayersFilterMax)) + return false; return true; } diff --git a/cockatrice/src/gamesmodel.h b/cockatrice/src/gamesmodel.h index e27cf0f0..760da6d6 100644 --- a/cockatrice/src/gamesmodel.h +++ b/cockatrice/src/gamesmodel.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "gametypemap.h" class ServerInfo_Game; @@ -32,9 +33,18 @@ class GamesProxyModel : public QSortFilterProxyModel { private: ServerInfo_User *ownUser; bool unavailableGamesVisible; + QString gameNameFilter, creatorNameFilter; + QSet gameTypeFilter; + int maxPlayersFilterMin, maxPlayersFilterMax; public: GamesProxyModel(QObject *parent = 0, ServerInfo_User *_ownUser = 0); + void setUnavailableGamesVisible(bool _unavailableGamesVisible); + void setGameNameFilter(const QString &_gameNameFilter); + void setCreatorNameFilter(const QString &_creatorNameFilter); + void setGameTypeFilter(const QSet &_gameTypeFilter); + void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax); + void resetFilterParameters(); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; };