diff --git a/cockatrice/src/gameselector.cpp b/cockatrice/src/gameselector.cpp index 733c02dc..4e832cf0 100644 --- a/cockatrice/src/gameselector.cpp +++ b/cockatrice/src/gameselector.cpp @@ -30,13 +30,14 @@ GameSelector::GameSelector(AbstractClient *_client, const QMap &_rooms, const QMap &_gameTypes, const bool restoresettings, - const bool showfilters, + const bool _showfilters, QWidget *parent) - : QGroupBox(parent), client(_client), tabSupervisor(_tabSupervisor), room(_room) + : QGroupBox(parent), client(_client), tabSupervisor(_tabSupervisor), room(_room), showFilters(_showfilters) { gameListView = new QTreeView; gameListModel = new GamesModel(_rooms, _gameTypes, this); - if (showfilters) { + filteredGamesLabel = new QLabel; + if (showFilters) { gameListProxyModel = new GamesProxyModel(this, tabSupervisor); gameListProxyModel->setSourceModel(gameListModel); gameListProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); @@ -64,7 +65,7 @@ GameSelector::GameSelector(AbstractClient *_client, if (room) gameTypeMap = gameListModel->getGameTypes().value(room->getRoomId()); - if (showfilters && restoresettings) + if (showFilters && restoresettings) gameListProxyModel->loadFilterParameters(gameTypeMap); gameListView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); @@ -76,7 +77,6 @@ GameSelector::GameSelector(AbstractClient *_client, clearFilterButton->setIcon(QPixmap("theme:icons/clearsearch")); clearFilterButton->setEnabled(true); connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter())); - alteredFiltersLabel = new QLabel; if (room) { createButton = new QPushButton; @@ -87,10 +87,10 @@ GameSelector::GameSelector(AbstractClient *_client, spectateButton = new QPushButton; QHBoxLayout *buttonLayout = new QHBoxLayout; - if (showfilters) { + if (showFilters) { buttonLayout->addWidget(filterButton); buttonLayout->addWidget(clearFilterButton); - buttonLayout->addWidget(alteredFiltersLabel); + buttonLayout->addWidget(filteredGamesLabel); } buttonLayout->addStretch(); if (room) @@ -133,6 +133,7 @@ void GameSelector::processAddToListEvent(const Event_AddToList &event) if (event.list_name() == "ignore") { gameListProxyModel->refresh(); } + setFilteredGamesLabel(); } void GameSelector::processRemoveFromListEvent(const Event_RemoveFromList &event) @@ -140,6 +141,7 @@ void GameSelector::processRemoveFromListEvent(const Event_RemoveFromList &event) if (event.list_name() == "ignore") { gameListProxyModel->refresh(); } + setFilteredGamesLabel(); } void GameSelector::actSetFilter() @@ -161,7 +163,7 @@ void GameSelector::actSetFilter() gameListProxyModel->setMaxPlayersFilter(dlg.getMaxPlayersFilterMin(), dlg.getMaxPlayersFilterMax()); gameListProxyModel->saveFilterParameters(gameTypeMap); - setAlteredFiltersText(gameListProxyModel->getNumberOfAlteredFilters()); + setFilteredGamesLabel(); } void GameSelector::actClearFilter() @@ -170,7 +172,8 @@ void GameSelector::actClearFilter() gameListProxyModel->resetFilterParameters(); gameListProxyModel->saveFilterParameters(gameTypeMap); - alteredFiltersLabel->setText(tr("Filters reset to default")); + + setFilteredGamesLabel(); } void GameSelector::actCreate() @@ -182,6 +185,7 @@ void GameSelector::actCreate() DlgCreateGame dlg(room, room->getGameTypes(), this); dlg.exec(); + setFilteredGamesLabel(); } void GameSelector::checkResponse(const Response &response) @@ -265,17 +269,19 @@ void GameSelector::retranslateUi() { setTitle(tr("Games")); filterButton->setText(tr("&Filter games")); - clearFilterButton->setText(tr("Reset fi<ers")); - setAlteredFiltersText(gameListProxyModel->getNumberOfAlteredFilters()); + clearFilterButton->setText(tr("C&lear filter")); if (createButton) createButton->setText(tr("C&reate")); joinButton->setText(tr("&Join")); spectateButton->setText(tr("J&oin as spectator")); + + setFilteredGamesLabel(); } void GameSelector::processGameInfo(const ServerInfo_Game &info) { gameListModel->updateGameList(info); + setFilteredGamesLabel(); } void GameSelector::actSelectedGameChanged(const QModelIndex ¤t, const QModelIndex & /* previous */) @@ -290,13 +296,11 @@ void GameSelector::actSelectedGameChanged(const QModelIndex ¤t, const QMod joinButton->setEnabled(game.player_count() < game.max_players() || overrideRestrictions); } -void GameSelector::setAlteredFiltersText(const int numAlteredFilters) +void GameSelector::setFilteredGamesLabel() { - if (alteredFiltersLabel != nullptr) { - if (numAlteredFilters == 0) { - alteredFiltersLabel->setText(tr("Default filters applied")); - } else { - alteredFiltersLabel->setText(tr("%1 filter(s) applied").arg(numAlteredFilters)); - } + if (showFilters) { + const int totalGames = gameListModel->rowCount(); + const int shownGames = totalGames - gameListProxyModel->getNumFilteredGames(); + filteredGamesLabel->setText(tr("Games shown: %1 / %2").arg(shownGames).arg(totalGames)); } } diff --git a/cockatrice/src/gameselector.h b/cockatrice/src/gameselector.h index 96b9889e..e2624512 100644 --- a/cockatrice/src/gameselector.h +++ b/cockatrice/src/gameselector.h @@ -11,8 +11,8 @@ class QTreeView; class GamesModel; class GamesProxyModel; class QPushButton; -class QLabel; class QCheckBox; +class QLabel; class AbstractClient; class TabSupervisor; class TabRoom; @@ -45,10 +45,11 @@ private: GamesModel *gameListModel; GamesProxyModel *gameListProxyModel; QPushButton *filterButton, *clearFilterButton, *createButton, *joinButton, *spectateButton; - QLabel *alteredFiltersLabel; + QLabel *filteredGamesLabel; + const bool showFilters; GameTypeMap gameTypeMap; - void setAlteredFiltersText(int numAlteredFilters); + void setFilteredGamesLabel(); public: GameSelector(AbstractClient *_client, @@ -57,7 +58,7 @@ public: const QMap &_rooms, const QMap &_gameTypes, const bool restoresettings, - const bool showfilters, + const bool _showfilters, QWidget *parent = nullptr); void retranslateUi(); void processGameInfo(const ServerInfo_Game &info); diff --git a/cockatrice/src/gamesmodel.cpp b/cockatrice/src/gamesmodel.cpp index 01e39cd3..cb83af40 100644 --- a/cockatrice/src/gamesmodel.cpp +++ b/cockatrice/src/gamesmodel.cpp @@ -38,7 +38,7 @@ const QString GamesModel::getGameCreatedString(const int secs) const } else { // from 1 hr onward we show hrs int hours = secs / SECS_PER_HOUR; if (secs % SECS_PER_HOUR >= SECS_PER_MIN * 30) // if the room is open for 1hr 30 mins, we round to 2hrs - hours++; + ++hours; ret = QString("%1+ h").arg(QString::number(hours)); } return ret; @@ -314,11 +314,26 @@ void GamesProxyModel::setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlay invalidateFilter(); } +int GamesProxyModel::getNumFilteredGames() const +{ + GamesModel *model = qobject_cast(sourceModel()); + if (!model) + return 0; + + int numFilteredGames = 0; + for (int row = 0; row < model->rowCount(); ++row) { + if (!filterAcceptsRow(row)) { + ++numFilteredGames; + } + } + return numFilteredGames; +} + void GamesProxyModel::resetFilterParameters() { - unavailableGamesVisible = DEFAULT_UNAVAILABLE_GAMES_VISIBLE; - showPasswordProtectedGames = DEFAULT_SHOW_PASSWORD_PROTECTED_GAMES; - showBuddiesOnlyGames = DEFAULT_SHOW_BUDDIES_ONLY_GAMES; + unavailableGamesVisible = false; + showPasswordProtectedGames = true; + showBuddiesOnlyGames = true; gameNameFilter = QString(); creatorNameFilter = QString(); gameTypeFilter.clear(); @@ -368,40 +383,12 @@ void GamesProxyModel::saveFilterParameters(const QMap &allGameType settingsCache->gameFilters().setMaxPlayers(maxPlayersFilterMax); } -int GamesProxyModel::getNumberOfAlteredFilters() const +bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const { - int numFiltersAltered = 0; - if (showBuddiesOnlyGames != DEFAULT_SHOW_BUDDIES_ONLY_GAMES) { - numFiltersAltered++; - } - if (hideIgnoredUserGames) { - numFiltersAltered++; - } - if (unavailableGamesVisible != DEFAULT_UNAVAILABLE_GAMES_VISIBLE) { - numFiltersAltered++; - } - if (showPasswordProtectedGames != DEFAULT_SHOW_PASSWORD_PROTECTED_GAMES) { - numFiltersAltered++; - } - if (!gameNameFilter.isEmpty()) { - numFiltersAltered++; - } - if (!creatorNameFilter.isEmpty()) { - numFiltersAltered++; - } - if (!gameTypeFilter.isEmpty()) { - numFiltersAltered++; - } - if (maxPlayersFilterMin != -1 && maxPlayersFilterMin != 1) { - numFiltersAltered++; - } - if (maxPlayersFilterMax != -1 && maxPlayersFilterMax != DEFAULT_MAX_PLAYERS_MAX) { - numFiltersAltered++; - } - return numFiltersAltered; + return filterAcceptsRow(sourceRow); } -bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const +bool GamesProxyModel::filterAcceptsRow(int sourceRow) const { GamesModel *model = qobject_cast(sourceModel()); if (!model) diff --git a/cockatrice/src/gamesmodel.h b/cockatrice/src/gamesmodel.h index fa605863..a50c0e86 100644 --- a/cockatrice/src/gamesmodel.h +++ b/cockatrice/src/gamesmodel.h @@ -77,9 +77,6 @@ private: int maxPlayersFilterMin, maxPlayersFilterMax; static const int DEFAULT_MAX_PLAYERS_MAX = 99; - static const bool DEFAULT_UNAVAILABLE_GAMES_VISIBLE = false; - static const bool DEFAULT_SHOW_PASSWORD_PROTECTED_GAMES = true; - static const bool DEFAULT_SHOW_BUDDIES_ONLY_GAMES = true; public: GamesProxyModel(QObject *parent = nullptr, const TabSupervisor *_tabSupervisor = nullptr); @@ -128,14 +125,15 @@ public: return maxPlayersFilterMax; } void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax); + int getNumFilteredGames() const; void resetFilterParameters(); void loadFilterParameters(const QMap &allGameTypes); void saveFilterParameters(const QMap &allGameTypes); - int getNumberOfAlteredFilters() const; void refresh(); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + bool filterAcceptsRow(int sourceRow) const; }; #endif