Change filter hint text to "Games shown: X / Y" and fix user-game segfault (#3973)
This commit is contained in:
parent
9246c190fa
commit
1988e4558f
4 changed files with 51 additions and 61 deletions
|
@ -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<ers"));
|
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 ¤t, const QModelIndex & /* previous */)
|
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);
|
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue