Change filter hint text to "Games shown: X / Y" and fix user-game segfault (#3973)

This commit is contained in:
Kaitlin 2020-05-08 15:15:54 -04:00 committed by GitHub
parent 9246c190fa
commit 1988e4558f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 61 deletions

View file

@ -30,13 +30,14 @@ GameSelector::GameSelector(AbstractClient *_client,
const QMap<int, QString> &_rooms, const QMap<int, QString> &_rooms,
const QMap<int, GameTypeMap> &_gameTypes, const QMap<int, GameTypeMap> &_gameTypes,
const bool restoresettings, const bool restoresettings,
const bool showfilters, const bool _showfilters,
QWidget *parent) QWidget *parent)
: QGroupBox(parent), client(_client), tabSupervisor(_tabSupervisor), room(_room) : QGroupBox(parent), client(_client), tabSupervisor(_tabSupervisor), room(_room), showFilters(_showfilters)
{ {
gameListView = new QTreeView; gameListView = new QTreeView;
gameListModel = new GamesModel(_rooms, _gameTypes, this); gameListModel = new GamesModel(_rooms, _gameTypes, this);
if (showfilters) { filteredGamesLabel = new QLabel;
if (showFilters) {
gameListProxyModel = new GamesProxyModel(this, tabSupervisor); gameListProxyModel = new GamesProxyModel(this, tabSupervisor);
gameListProxyModel->setSourceModel(gameListModel); gameListProxyModel->setSourceModel(gameListModel);
gameListProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); gameListProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
@ -64,7 +65,7 @@ GameSelector::GameSelector(AbstractClient *_client,
if (room) if (room)
gameTypeMap = gameListModel->getGameTypes().value(room->getRoomId()); gameTypeMap = gameListModel->getGameTypes().value(room->getRoomId());
if (showfilters && restoresettings) if (showFilters && restoresettings)
gameListProxyModel->loadFilterParameters(gameTypeMap); gameListProxyModel->loadFilterParameters(gameTypeMap);
gameListView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); gameListView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
@ -76,7 +77,6 @@ GameSelector::GameSelector(AbstractClient *_client,
clearFilterButton->setIcon(QPixmap("theme:icons/clearsearch")); clearFilterButton->setIcon(QPixmap("theme:icons/clearsearch"));
clearFilterButton->setEnabled(true); clearFilterButton->setEnabled(true);
connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter())); connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter()));
alteredFiltersLabel = new QLabel;
if (room) { if (room) {
createButton = new QPushButton; createButton = new QPushButton;
@ -87,10 +87,10 @@ GameSelector::GameSelector(AbstractClient *_client,
spectateButton = new QPushButton; spectateButton = new QPushButton;
QHBoxLayout *buttonLayout = new QHBoxLayout; QHBoxLayout *buttonLayout = new QHBoxLayout;
if (showfilters) { if (showFilters) {
buttonLayout->addWidget(filterButton); buttonLayout->addWidget(filterButton);
buttonLayout->addWidget(clearFilterButton); buttonLayout->addWidget(clearFilterButton);
buttonLayout->addWidget(alteredFiltersLabel); buttonLayout->addWidget(filteredGamesLabel);
} }
buttonLayout->addStretch(); buttonLayout->addStretch();
if (room) if (room)
@ -133,6 +133,7 @@ void GameSelector::processAddToListEvent(const Event_AddToList &event)
if (event.list_name() == "ignore") { if (event.list_name() == "ignore") {
gameListProxyModel->refresh(); gameListProxyModel->refresh();
} }
setFilteredGamesLabel();
} }
void GameSelector::processRemoveFromListEvent(const Event_RemoveFromList &event) void GameSelector::processRemoveFromListEvent(const Event_RemoveFromList &event)
@ -140,6 +141,7 @@ void GameSelector::processRemoveFromListEvent(const Event_RemoveFromList &event)
if (event.list_name() == "ignore") { if (event.list_name() == "ignore") {
gameListProxyModel->refresh(); gameListProxyModel->refresh();
} }
setFilteredGamesLabel();
} }
void GameSelector::actSetFilter() void GameSelector::actSetFilter()
@ -161,7 +163,7 @@ void GameSelector::actSetFilter()
gameListProxyModel->setMaxPlayersFilter(dlg.getMaxPlayersFilterMin(), dlg.getMaxPlayersFilterMax()); gameListProxyModel->setMaxPlayersFilter(dlg.getMaxPlayersFilterMin(), dlg.getMaxPlayersFilterMax());
gameListProxyModel->saveFilterParameters(gameTypeMap); gameListProxyModel->saveFilterParameters(gameTypeMap);
setAlteredFiltersText(gameListProxyModel->getNumberOfAlteredFilters()); setFilteredGamesLabel();
} }
void GameSelector::actClearFilter() void GameSelector::actClearFilter()
@ -170,7 +172,8 @@ void GameSelector::actClearFilter()
gameListProxyModel->resetFilterParameters(); gameListProxyModel->resetFilterParameters();
gameListProxyModel->saveFilterParameters(gameTypeMap); gameListProxyModel->saveFilterParameters(gameTypeMap);
alteredFiltersLabel->setText(tr("Filters reset to default"));
setFilteredGamesLabel();
} }
void GameSelector::actCreate() void GameSelector::actCreate()
@ -182,6 +185,7 @@ void GameSelector::actCreate()
DlgCreateGame dlg(room, room->getGameTypes(), this); DlgCreateGame dlg(room, room->getGameTypes(), this);
dlg.exec(); dlg.exec();
setFilteredGamesLabel();
} }
void GameSelector::checkResponse(const Response &response) void GameSelector::checkResponse(const Response &response)
@ -265,17 +269,19 @@ void GameSelector::retranslateUi()
{ {
setTitle(tr("Games")); setTitle(tr("Games"));
filterButton->setText(tr("&Filter games")); filterButton->setText(tr("&Filter games"));
clearFilterButton->setText(tr("Reset fi&lters")); clearFilterButton->setText(tr("C&lear filter"));
setAlteredFiltersText(gameListProxyModel->getNumberOfAlteredFilters());
if (createButton) if (createButton)
createButton->setText(tr("C&reate")); createButton->setText(tr("C&reate"));
joinButton->setText(tr("&Join")); joinButton->setText(tr("&Join"));
spectateButton->setText(tr("J&oin as spectator")); spectateButton->setText(tr("J&oin as spectator"));
setFilteredGamesLabel();
} }
void GameSelector::processGameInfo(const ServerInfo_Game &info) void GameSelector::processGameInfo(const ServerInfo_Game &info)
{ {
gameListModel->updateGameList(info); gameListModel->updateGameList(info);
setFilteredGamesLabel();
} }
void GameSelector::actSelectedGameChanged(const QModelIndex &current, const QModelIndex & /* previous */) void GameSelector::actSelectedGameChanged(const QModelIndex &current, const QModelIndex & /* previous */)
@ -290,13 +296,11 @@ void GameSelector::actSelectedGameChanged(const QModelIndex &current, const QMod
joinButton->setEnabled(game.player_count() < game.max_players() || overrideRestrictions); joinButton->setEnabled(game.player_count() < game.max_players() || overrideRestrictions);
} }
void GameSelector::setAlteredFiltersText(const int numAlteredFilters) void GameSelector::setFilteredGamesLabel()
{ {
if (alteredFiltersLabel != nullptr) { if (showFilters) {
if (numAlteredFilters == 0) { const int totalGames = gameListModel->rowCount();
alteredFiltersLabel->setText(tr("Default filters applied")); const int shownGames = totalGames - gameListProxyModel->getNumFilteredGames();
} else { filteredGamesLabel->setText(tr("Games shown: %1 / %2").arg(shownGames).arg(totalGames));
alteredFiltersLabel->setText(tr("%1 filter(s) applied").arg(numAlteredFilters));
}
} }
} }

View file

@ -11,8 +11,8 @@ class QTreeView;
class GamesModel; class GamesModel;
class GamesProxyModel; class GamesProxyModel;
class QPushButton; class QPushButton;
class QLabel;
class QCheckBox; class QCheckBox;
class QLabel;
class AbstractClient; class AbstractClient;
class TabSupervisor; class TabSupervisor;
class TabRoom; class TabRoom;
@ -45,10 +45,11 @@ private:
GamesModel *gameListModel; GamesModel *gameListModel;
GamesProxyModel *gameListProxyModel; GamesProxyModel *gameListProxyModel;
QPushButton *filterButton, *clearFilterButton, *createButton, *joinButton, *spectateButton; QPushButton *filterButton, *clearFilterButton, *createButton, *joinButton, *spectateButton;
QLabel *alteredFiltersLabel; QLabel *filteredGamesLabel;
const bool showFilters;
GameTypeMap gameTypeMap; GameTypeMap gameTypeMap;
void setAlteredFiltersText(int numAlteredFilters); void setFilteredGamesLabel();
public: public:
GameSelector(AbstractClient *_client, GameSelector(AbstractClient *_client,
@ -57,7 +58,7 @@ public:
const QMap<int, QString> &_rooms, const QMap<int, QString> &_rooms,
const QMap<int, GameTypeMap> &_gameTypes, const QMap<int, GameTypeMap> &_gameTypes,
const bool restoresettings, const bool restoresettings,
const bool showfilters, const bool _showfilters,
QWidget *parent = nullptr); QWidget *parent = nullptr);
void retranslateUi(); void retranslateUi();
void processGameInfo(const ServerInfo_Game &info); void processGameInfo(const ServerInfo_Game &info);

View file

@ -38,7 +38,7 @@ const QString GamesModel::getGameCreatedString(const int secs) const
} else { // from 1 hr onward we show hrs } else { // from 1 hr onward we show hrs
int hours = secs / SECS_PER_HOUR; 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 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)); ret = QString("%1+ h").arg(QString::number(hours));
} }
return ret; return ret;
@ -314,11 +314,26 @@ void GamesProxyModel::setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlay
invalidateFilter(); invalidateFilter();
} }
int GamesProxyModel::getNumFilteredGames() const
{
GamesModel *model = qobject_cast<GamesModel *>(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() void GamesProxyModel::resetFilterParameters()
{ {
unavailableGamesVisible = DEFAULT_UNAVAILABLE_GAMES_VISIBLE; unavailableGamesVisible = false;
showPasswordProtectedGames = DEFAULT_SHOW_PASSWORD_PROTECTED_GAMES; showPasswordProtectedGames = true;
showBuddiesOnlyGames = DEFAULT_SHOW_BUDDIES_ONLY_GAMES; showBuddiesOnlyGames = true;
gameNameFilter = QString(); gameNameFilter = QString();
creatorNameFilter = QString(); creatorNameFilter = QString();
gameTypeFilter.clear(); gameTypeFilter.clear();
@ -368,40 +383,12 @@ void GamesProxyModel::saveFilterParameters(const QMap<int, QString> &allGameType
settingsCache->gameFilters().setMaxPlayers(maxPlayersFilterMax); settingsCache->gameFilters().setMaxPlayers(maxPlayersFilterMax);
} }
int GamesProxyModel::getNumberOfAlteredFilters() const bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
{ {
int numFiltersAltered = 0; return filterAcceptsRow(sourceRow);
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;
} }
bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const bool GamesProxyModel::filterAcceptsRow(int sourceRow) const
{ {
GamesModel *model = qobject_cast<GamesModel *>(sourceModel()); GamesModel *model = qobject_cast<GamesModel *>(sourceModel());
if (!model) if (!model)

View file

@ -77,9 +77,6 @@ private:
int maxPlayersFilterMin, maxPlayersFilterMax; int maxPlayersFilterMin, maxPlayersFilterMax;
static const int DEFAULT_MAX_PLAYERS_MAX = 99; 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: public:
GamesProxyModel(QObject *parent = nullptr, const TabSupervisor *_tabSupervisor = nullptr); GamesProxyModel(QObject *parent = nullptr, const TabSupervisor *_tabSupervisor = nullptr);
@ -128,14 +125,15 @@ public:
return maxPlayersFilterMax; return maxPlayersFilterMax;
} }
void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax); void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax);
int getNumFilteredGames() const;
void resetFilterParameters(); void resetFilterParameters();
void loadFilterParameters(const QMap<int, QString> &allGameTypes); void loadFilterParameters(const QMap<int, QString> &allGameTypes);
void saveFilterParameters(const QMap<int, QString> &allGameTypes); void saveFilterParameters(const QMap<int, QString> &allGameTypes);
int getNumberOfAlteredFilters() const;
void refresh(); void refresh();
protected: protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
bool filterAcceptsRow(int sourceRow) const;
}; };
#endif #endif