Add dropdown for game age filtering (#4092)
* Part 1 for #3067: Basic combo box (dropdown) filtering mechanism for game age. * Apply suggestions from draft review # Conflicts: # cockatrice/src/gamesmodel.cpp # cockatrice/src/gamesmodel.h * switch to using QTime * check for games older than a day * formatting for casts and more unnecessary cosmetic changes * ebbit1q fixes Co-authored-by: ebbit1q <ebbit1q@gmail.com>
This commit is contained in:
parent
58d024d067
commit
eba9c097f6
7 changed files with 136 additions and 46 deletions
|
@ -1,6 +1,7 @@
|
||||||
#include "dlg_filter_games.h"
|
#include "dlg_filter_games.h"
|
||||||
|
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
|
#include <QComboBox>
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
#include <QDialogButtonBox>
|
#include <QDialogButtonBox>
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
|
@ -15,7 +16,13 @@
|
||||||
DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes,
|
DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes,
|
||||||
const GamesProxyModel *_gamesProxyModel,
|
const GamesProxyModel *_gamesProxyModel,
|
||||||
QWidget *parent)
|
QWidget *parent)
|
||||||
: QDialog(parent), allGameTypes(_allGameTypes), gamesProxyModel(_gamesProxyModel)
|
: QDialog(parent), allGameTypes(_allGameTypes), gamesProxyModel(_gamesProxyModel),
|
||||||
|
gameAgeMap({{QTime(), tr("no limit")},
|
||||||
|
{QTime(0, 5), tr("5 minutes")},
|
||||||
|
{QTime(0, 10), tr("10 minutes")},
|
||||||
|
{QTime(0, 30), tr("30 minutes")},
|
||||||
|
{QTime(1, 0), tr("1 hour")},
|
||||||
|
{QTime(2, 0), tr("2 hours")}})
|
||||||
{
|
{
|
||||||
showBuddiesOnlyGames = new QCheckBox(tr("Show '&buddies only' games"));
|
showBuddiesOnlyGames = new QCheckBox(tr("Show '&buddies only' games"));
|
||||||
showBuddiesOnlyGames->setChecked(gamesProxyModel->getShowBuddiesOnlyGames());
|
showBuddiesOnlyGames->setChecked(gamesProxyModel->getShowBuddiesOnlyGames());
|
||||||
|
@ -29,6 +36,14 @@ DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes,
|
||||||
hideIgnoredUserGames = new QCheckBox(tr("Hide '&ignored user' games"));
|
hideIgnoredUserGames = new QCheckBox(tr("Hide '&ignored user' games"));
|
||||||
hideIgnoredUserGames->setChecked(gamesProxyModel->getHideIgnoredUserGames());
|
hideIgnoredUserGames->setChecked(gamesProxyModel->getHideIgnoredUserGames());
|
||||||
|
|
||||||
|
maxGameAgeComboBox = new QComboBox();
|
||||||
|
maxGameAgeComboBox->setEditable(false);
|
||||||
|
maxGameAgeComboBox->addItems(gameAgeMap.values());
|
||||||
|
QTime gameAge = gamesProxyModel->getMaxGameAge();
|
||||||
|
maxGameAgeComboBox->setCurrentIndex(gameAgeMap.keys().indexOf(gameAge)); // index is -1 if unknown
|
||||||
|
QLabel *maxGameAgeLabel = new QLabel(tr("&Newer than:"));
|
||||||
|
maxGameAgeLabel->setBuddy(maxGameAgeComboBox);
|
||||||
|
|
||||||
gameNameFilterEdit = new QLineEdit;
|
gameNameFilterEdit = new QLineEdit;
|
||||||
gameNameFilterEdit->setText(gamesProxyModel->getGameNameFilter());
|
gameNameFilterEdit->setText(gamesProxyModel->getGameNameFilter());
|
||||||
QLabel *gameNameFilterLabel = new QLabel(tr("Game &description:"));
|
QLabel *gameNameFilterLabel = new QLabel(tr("Game &description:"));
|
||||||
|
@ -43,6 +58,8 @@ DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes,
|
||||||
generalGrid->addWidget(gameNameFilterEdit, 0, 1);
|
generalGrid->addWidget(gameNameFilterEdit, 0, 1);
|
||||||
generalGrid->addWidget(creatorNameFilterLabel, 1, 0);
|
generalGrid->addWidget(creatorNameFilterLabel, 1, 0);
|
||||||
generalGrid->addWidget(creatorNameFilterEdit, 1, 1);
|
generalGrid->addWidget(creatorNameFilterEdit, 1, 1);
|
||||||
|
generalGrid->addWidget(maxGameAgeLabel, 2, 0);
|
||||||
|
generalGrid->addWidget(maxGameAgeComboBox, 2, 1);
|
||||||
generalGroupBox = new QGroupBox(tr("General"));
|
generalGroupBox = new QGroupBox(tr("General"));
|
||||||
generalGroupBox->setLayout(generalGrid);
|
generalGroupBox->setLayout(generalGrid);
|
||||||
|
|
||||||
|
@ -220,6 +237,15 @@ int DlgFilterGames::getMaxPlayersFilterMax() const
|
||||||
return maxPlayersFilterMaxSpinBox->value();
|
return maxPlayersFilterMaxSpinBox->value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QTime &DlgFilterGames::getMaxGameAge() const
|
||||||
|
{
|
||||||
|
int index = maxGameAgeComboBox->currentIndex();
|
||||||
|
if (index < 0 || index >= gameAgeMap.size()) { // index is out of bounds
|
||||||
|
return gamesProxyModel->getMaxGameAge(); // leave the setting unchanged
|
||||||
|
}
|
||||||
|
return gameAgeMap.keys().at(index);
|
||||||
|
}
|
||||||
|
|
||||||
void DlgFilterGames::setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax)
|
void DlgFilterGames::setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax)
|
||||||
{
|
{
|
||||||
maxPlayersFilterMinSpinBox->setValue(_maxPlayersFilterMin);
|
maxPlayersFilterMinSpinBox->setValue(_maxPlayersFilterMin);
|
||||||
|
|
|
@ -4,11 +4,14 @@
|
||||||
#include "gamesmodel.h"
|
#include "gamesmodel.h"
|
||||||
|
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
|
#include <QComboBox>
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
|
#include <QTime>
|
||||||
|
|
||||||
class QCheckBox;
|
class QCheckBox;
|
||||||
|
class QComboBox;
|
||||||
class QGroupBox;
|
class QGroupBox;
|
||||||
class QLineEdit;
|
class QLineEdit;
|
||||||
class QSpinBox;
|
class QSpinBox;
|
||||||
|
@ -27,6 +30,7 @@ private:
|
||||||
QMap<int, QCheckBox *> gameTypeFilterCheckBoxes;
|
QMap<int, QCheckBox *> gameTypeFilterCheckBoxes;
|
||||||
QSpinBox *maxPlayersFilterMinSpinBox;
|
QSpinBox *maxPlayersFilterMinSpinBox;
|
||||||
QSpinBox *maxPlayersFilterMaxSpinBox;
|
QSpinBox *maxPlayersFilterMaxSpinBox;
|
||||||
|
QComboBox *maxGameAgeComboBox;
|
||||||
|
|
||||||
const QMap<int, QString> &allGameTypes;
|
const QMap<int, QString> &allGameTypes;
|
||||||
const GamesProxyModel *gamesProxyModel;
|
const GamesProxyModel *gamesProxyModel;
|
||||||
|
@ -56,6 +60,8 @@ public:
|
||||||
int getMaxPlayersFilterMin() const;
|
int getMaxPlayersFilterMin() const;
|
||||||
int getMaxPlayersFilterMax() const;
|
int getMaxPlayersFilterMax() const;
|
||||||
void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax);
|
void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax);
|
||||||
|
const QTime &getMaxGameAge() const;
|
||||||
|
const QMap<QTime, QString> gameAgeMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -74,18 +74,16 @@ GameSelector::GameSelector(AbstractClient *_client,
|
||||||
connect(filterButton, SIGNAL(clicked()), this, SLOT(actSetFilter()));
|
connect(filterButton, SIGNAL(clicked()), this, SLOT(actSetFilter()));
|
||||||
clearFilterButton = new QPushButton;
|
clearFilterButton = new QPushButton;
|
||||||
clearFilterButton->setIcon(QPixmap("theme:icons/clearsearch"));
|
clearFilterButton->setIcon(QPixmap("theme:icons/clearsearch"));
|
||||||
if (showFilters && gameListProxyModel->areFilterParametersSetToDefaults()) {
|
bool filtersSetToDefault = showFilters && gameListProxyModel->areFilterParametersSetToDefaults();
|
||||||
clearFilterButton->setEnabled(false);
|
clearFilterButton->setEnabled(!filtersSetToDefault);
|
||||||
} else {
|
|
||||||
clearFilterButton->setEnabled(true);
|
|
||||||
}
|
|
||||||
connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter()));
|
connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter()));
|
||||||
|
|
||||||
if (room) {
|
if (room) {
|
||||||
createButton = new QPushButton;
|
createButton = new QPushButton;
|
||||||
connect(createButton, SIGNAL(clicked()), this, SLOT(actCreate()));
|
connect(createButton, SIGNAL(clicked()), this, SLOT(actCreate()));
|
||||||
} else
|
} else {
|
||||||
createButton = 0;
|
createButton = nullptr;
|
||||||
|
}
|
||||||
joinButton = new QPushButton;
|
joinButton = new QPushButton;
|
||||||
spectateButton = new QPushButton;
|
spectateButton = new QPushButton;
|
||||||
|
|
||||||
|
@ -161,6 +159,7 @@ void GameSelector::actSetFilter()
|
||||||
gameListProxyModel->setCreatorNameFilter(dlg.getCreatorNameFilter());
|
gameListProxyModel->setCreatorNameFilter(dlg.getCreatorNameFilter());
|
||||||
gameListProxyModel->setGameTypeFilter(dlg.getGameTypeFilter());
|
gameListProxyModel->setGameTypeFilter(dlg.getGameTypeFilter());
|
||||||
gameListProxyModel->setMaxPlayersFilter(dlg.getMaxPlayersFilterMin(), dlg.getMaxPlayersFilterMax());
|
gameListProxyModel->setMaxPlayersFilter(dlg.getMaxPlayersFilterMin(), dlg.getMaxPlayersFilterMax());
|
||||||
|
gameListProxyModel->setMaxGameAge(dlg.getMaxGameAge());
|
||||||
gameListProxyModel->saveFilterParameters(gameTypeMap);
|
gameListProxyModel->saveFilterParameters(gameTypeMap);
|
||||||
|
|
||||||
clearFilterButton->setEnabled(!gameListProxyModel->areFilterParametersSetToDefaults());
|
clearFilterButton->setEnabled(!gameListProxyModel->areFilterParametersSetToDefaults());
|
||||||
|
|
|
@ -23,7 +23,15 @@ enum GameListColumn
|
||||||
SPECTATORS
|
SPECTATORS
|
||||||
};
|
};
|
||||||
|
|
||||||
const QString GamesModel::getGameCreatedString(const int secs) const
|
const bool DEFAULT_UNAVAILABLE_GAMES_VISIBLE = false;
|
||||||
|
const bool DEFAULT_SHOW_PASSWORD_PROTECTED_GAMES = true;
|
||||||
|
const bool DEFAULT_SHOW_BUDDIES_ONLY_GAMES = true;
|
||||||
|
const bool DEFAULT_HIDE_IGNORED_USER_GAMES = false;
|
||||||
|
const int DEFAULT_MAX_PLAYERS_MIN = 1;
|
||||||
|
const int DEFAULT_MAX_PLAYERS_MAX = 99;
|
||||||
|
constexpr QTime DEFAULT_MAX_GAME_AGE = QTime();
|
||||||
|
|
||||||
|
const QString GamesModel::getGameCreatedString(const int secs)
|
||||||
{
|
{
|
||||||
|
|
||||||
QString ret;
|
QString ret;
|
||||||
|
@ -60,20 +68,23 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
if ((index.row() >= gameList.size()) || (index.column() >= columnCount()))
|
if ((index.row() >= gameList.size()) || (index.column() >= columnCount()))
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
||||||
const ServerInfo_Game &g = gameList[index.row()];
|
const ServerInfo_Game &gameentry = gameList[index.row()];
|
||||||
switch (index.column()) {
|
switch (index.column()) {
|
||||||
case ROOM:
|
case ROOM:
|
||||||
return rooms.value(g.room_id());
|
return rooms.value(gameentry.room_id());
|
||||||
case CREATED: {
|
case CREATED: {
|
||||||
QDateTime then;
|
|
||||||
then.setTime_t(g.start_time());
|
|
||||||
int secs = then.secsTo(QDateTime::currentDateTime());
|
|
||||||
|
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole: {
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))
|
||||||
|
QDateTime then = QDateTime::fromSecsSinceEpoch(gameentry.start_time(), Qt::UTC);
|
||||||
|
#else
|
||||||
|
QDateTime then = QDateTime::fromTime_t(gameentry.start_time(), Qt::UTC);
|
||||||
|
#endif
|
||||||
|
int secs = then.secsTo(QDateTime::currentDateTimeUtc());
|
||||||
return getGameCreatedString(secs);
|
return getGameCreatedString(secs);
|
||||||
|
}
|
||||||
case SORT_ROLE:
|
case SORT_ROLE:
|
||||||
return QVariant(secs);
|
return QVariant(-static_cast<qint64>(gameentry.start_time()));
|
||||||
case Qt::TextAlignmentRole:
|
case Qt::TextAlignmentRole:
|
||||||
return Qt::AlignCenter;
|
return Qt::AlignCenter;
|
||||||
default:
|
default:
|
||||||
|
@ -84,7 +95,7 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case SORT_ROLE:
|
case SORT_ROLE:
|
||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole:
|
||||||
return QString::fromStdString(g.description());
|
return QString::fromStdString(gameentry.description());
|
||||||
case Qt::TextAlignmentRole:
|
case Qt::TextAlignmentRole:
|
||||||
return Qt::AlignLeft;
|
return Qt::AlignLeft;
|
||||||
default:
|
default:
|
||||||
|
@ -94,11 +105,11 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case SORT_ROLE:
|
case SORT_ROLE:
|
||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole:
|
||||||
return QString::fromStdString(g.creator_info().name());
|
return QString::fromStdString(gameentry.creator_info().name());
|
||||||
case Qt::DecorationRole: {
|
case Qt::DecorationRole: {
|
||||||
QPixmap avatarPixmap = UserLevelPixmapGenerator::generatePixmap(
|
QPixmap avatarPixmap = UserLevelPixmapGenerator::generatePixmap(
|
||||||
13, (UserLevelFlags)g.creator_info().user_level(), false,
|
13, (UserLevelFlags)gameentry.creator_info().user_level(), false,
|
||||||
QString::fromStdString(g.creator_info().privlevel()));
|
QString::fromStdString(gameentry.creator_info().privlevel()));
|
||||||
return QIcon(avatarPixmap);
|
return QIcon(avatarPixmap);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -110,9 +121,9 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
case SORT_ROLE:
|
case SORT_ROLE:
|
||||||
case Qt::DisplayRole: {
|
case Qt::DisplayRole: {
|
||||||
QStringList result;
|
QStringList result;
|
||||||
GameTypeMap gameTypeMap = gameTypes.value(g.room_id());
|
GameTypeMap gameTypeMap = gameTypes.value(gameentry.room_id());
|
||||||
for (int i = g.game_types_size() - 1; i >= 0; --i)
|
for (int i = gameentry.game_types_size() - 1; i >= 0; --i)
|
||||||
result.append(gameTypeMap.value(g.game_types(i)));
|
result.append(gameTypeMap.value(gameentry.game_types(i)));
|
||||||
return result.join(", ");
|
return result.join(", ");
|
||||||
}
|
}
|
||||||
case Qt::TextAlignmentRole:
|
case Qt::TextAlignmentRole:
|
||||||
|
@ -125,16 +136,16 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
case SORT_ROLE:
|
case SORT_ROLE:
|
||||||
case Qt::DisplayRole: {
|
case Qt::DisplayRole: {
|
||||||
QStringList result;
|
QStringList result;
|
||||||
if (g.with_password())
|
if (gameentry.with_password())
|
||||||
result.append(tr("password"));
|
result.append(tr("password"));
|
||||||
if (g.only_buddies())
|
if (gameentry.only_buddies())
|
||||||
result.append(tr("buddies only"));
|
result.append(tr("buddies only"));
|
||||||
if (g.only_registered())
|
if (gameentry.only_registered())
|
||||||
result.append(tr("reg. users only"));
|
result.append(tr("reg. users only"));
|
||||||
return result.join(", ");
|
return result.join(", ");
|
||||||
}
|
}
|
||||||
case Qt::DecorationRole: {
|
case Qt::DecorationRole: {
|
||||||
return g.with_password() ? QIcon(LockPixmapGenerator::generatePixmap(13)) : QVariant();
|
return gameentry.with_password() ? QIcon(LockPixmapGenerator::generatePixmap(13)) : QVariant();
|
||||||
case Qt::TextAlignmentRole:
|
case Qt::TextAlignmentRole:
|
||||||
return Qt::AlignLeft;
|
return Qt::AlignLeft;
|
||||||
default:
|
default:
|
||||||
|
@ -145,7 +156,7 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case SORT_ROLE:
|
case SORT_ROLE:
|
||||||
case Qt::DisplayRole:
|
case Qt::DisplayRole:
|
||||||
return QString("%1/%2").arg(g.player_count()).arg(g.max_players());
|
return QString("%1/%2").arg(gameentry.player_count()).arg(gameentry.max_players());
|
||||||
case Qt::TextAlignmentRole:
|
case Qt::TextAlignmentRole:
|
||||||
return Qt::AlignCenter;
|
return Qt::AlignCenter;
|
||||||
default:
|
default:
|
||||||
|
@ -156,19 +167,19 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case SORT_ROLE:
|
case SORT_ROLE:
|
||||||
case Qt::DisplayRole: {
|
case Qt::DisplayRole: {
|
||||||
if (g.spectators_allowed()) {
|
if (gameentry.spectators_allowed()) {
|
||||||
QString result;
|
QString result;
|
||||||
result.append(QString::number(g.spectators_count()));
|
result.append(QString::number(gameentry.spectators_count()));
|
||||||
|
|
||||||
if (g.spectators_can_chat() && g.spectators_omniscient()) {
|
if (gameentry.spectators_can_chat() && gameentry.spectators_omniscient()) {
|
||||||
result.append(" (")
|
result.append(" (")
|
||||||
.append(tr("can chat"))
|
.append(tr("can chat"))
|
||||||
.append(" & ")
|
.append(" & ")
|
||||||
.append(tr("see hands"))
|
.append(tr("see hands"))
|
||||||
.append(")");
|
.append(")");
|
||||||
} else if (g.spectators_can_chat()) {
|
} else if (gameentry.spectators_can_chat()) {
|
||||||
result.append(" (").append(tr("can chat")).append(")");
|
result.append(" (").append(tr("can chat")).append(")");
|
||||||
} else if (g.spectators_omniscient()) {
|
} else if (gameentry.spectators_omniscient()) {
|
||||||
result.append(" (").append(tr("can see hands")).append(")");
|
result.append(" (").append(tr("can see hands")).append(")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,6 +325,12 @@ void GamesProxyModel::setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlay
|
||||||
invalidateFilter();
|
invalidateFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GamesProxyModel::setMaxGameAge(const QTime &_maxGameAge)
|
||||||
|
{
|
||||||
|
maxGameAge = _maxGameAge;
|
||||||
|
invalidateFilter();
|
||||||
|
}
|
||||||
|
|
||||||
int GamesProxyModel::getNumFilteredGames() const
|
int GamesProxyModel::getNumFilteredGames() const
|
||||||
{
|
{
|
||||||
GamesModel *model = qobject_cast<GamesModel *>(sourceModel());
|
GamesModel *model = qobject_cast<GamesModel *>(sourceModel());
|
||||||
|
@ -340,6 +357,7 @@ void GamesProxyModel::resetFilterParameters()
|
||||||
gameTypeFilter.clear();
|
gameTypeFilter.clear();
|
||||||
maxPlayersFilterMin = DEFAULT_MAX_PLAYERS_MIN;
|
maxPlayersFilterMin = DEFAULT_MAX_PLAYERS_MIN;
|
||||||
maxPlayersFilterMax = DEFAULT_MAX_PLAYERS_MAX;
|
maxPlayersFilterMax = DEFAULT_MAX_PLAYERS_MAX;
|
||||||
|
maxGameAge = DEFAULT_MAX_GAME_AGE;
|
||||||
|
|
||||||
invalidateFilter();
|
invalidateFilter();
|
||||||
}
|
}
|
||||||
|
@ -351,7 +369,7 @@ bool GamesProxyModel::areFilterParametersSetToDefaults() const
|
||||||
showBuddiesOnlyGames == DEFAULT_SHOW_BUDDIES_ONLY_GAMES &&
|
showBuddiesOnlyGames == DEFAULT_SHOW_BUDDIES_ONLY_GAMES &&
|
||||||
hideIgnoredUserGames == DEFAULT_HIDE_IGNORED_USER_GAMES && gameNameFilter.isEmpty() &&
|
hideIgnoredUserGames == DEFAULT_HIDE_IGNORED_USER_GAMES && gameNameFilter.isEmpty() &&
|
||||||
creatorNameFilter.isEmpty() && gameTypeFilter.isEmpty() && maxPlayersFilterMin == DEFAULT_MAX_PLAYERS_MIN &&
|
creatorNameFilter.isEmpty() && gameTypeFilter.isEmpty() && maxPlayersFilterMin == DEFAULT_MAX_PLAYERS_MIN &&
|
||||||
maxPlayersFilterMax == DEFAULT_MAX_PLAYERS_MAX;
|
maxPlayersFilterMax == DEFAULT_MAX_PLAYERS_MAX && maxGameAge == DEFAULT_MAX_GAME_AGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GamesProxyModel::loadFilterParameters(const QMap<int, QString> &allGameTypes)
|
void GamesProxyModel::loadFilterParameters(const QMap<int, QString> &allGameTypes)
|
||||||
|
@ -365,6 +383,7 @@ void GamesProxyModel::loadFilterParameters(const QMap<int, QString> &allGameType
|
||||||
creatorNameFilter = gameFilters.getCreatorNameFilter();
|
creatorNameFilter = gameFilters.getCreatorNameFilter();
|
||||||
maxPlayersFilterMin = gameFilters.getMinPlayers();
|
maxPlayersFilterMin = gameFilters.getMinPlayers();
|
||||||
maxPlayersFilterMax = gameFilters.getMaxPlayers();
|
maxPlayersFilterMax = gameFilters.getMaxPlayers();
|
||||||
|
maxGameAge = gameFilters.getMaxGameAge();
|
||||||
|
|
||||||
QMapIterator<int, QString> gameTypesIterator(allGameTypes);
|
QMapIterator<int, QString> gameTypesIterator(allGameTypes);
|
||||||
while (gameTypesIterator.hasNext()) {
|
while (gameTypesIterator.hasNext()) {
|
||||||
|
@ -396,6 +415,7 @@ void GamesProxyModel::saveFilterParameters(const QMap<int, QString> &allGameType
|
||||||
|
|
||||||
gameFilters.setMinPlayers(maxPlayersFilterMin);
|
gameFilters.setMinPlayers(maxPlayersFilterMin);
|
||||||
gameFilters.setMaxPlayers(maxPlayersFilterMax);
|
gameFilters.setMaxPlayers(maxPlayersFilterMax);
|
||||||
|
gameFilters.setMaxGameAge(maxGameAge);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
|
bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
|
||||||
|
@ -405,6 +425,11 @@ bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sour
|
||||||
|
|
||||||
bool GamesProxyModel::filterAcceptsRow(int sourceRow) const
|
bool GamesProxyModel::filterAcceptsRow(int sourceRow) const
|
||||||
{
|
{
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))
|
||||||
|
static const QDate epochDate = QDateTime::fromSecsSinceEpoch(0, Qt::UTC).date();
|
||||||
|
#else
|
||||||
|
static const QDate epochDate = QDateTime::fromTime_t(0, Qt::UTC).date();
|
||||||
|
#endif
|
||||||
GamesModel *model = qobject_cast<GamesModel *>(sourceModel());
|
GamesModel *model = qobject_cast<GamesModel *>(sourceModel());
|
||||||
if (!model)
|
if (!model)
|
||||||
return false;
|
return false;
|
||||||
|
@ -442,11 +467,21 @@ bool GamesProxyModel::filterAcceptsRow(int sourceRow) const
|
||||||
if (!gameTypeFilter.isEmpty() && gameTypes.intersect(gameTypeFilter).isEmpty())
|
if (!gameTypeFilter.isEmpty() && gameTypes.intersect(gameTypeFilter).isEmpty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((int)game.max_players() < maxPlayersFilterMin)
|
if (game.max_players() < maxPlayersFilterMin)
|
||||||
return false;
|
return false;
|
||||||
if ((int)game.max_players() > maxPlayersFilterMax)
|
if (game.max_players() > maxPlayersFilterMax)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (maxGameAge.isValid()) {
|
||||||
|
QDateTime now = QDateTime::currentDateTimeUtc();
|
||||||
|
qint64 signed_start_time = game.start_time(); // cast to 64 bit value to allow signed value
|
||||||
|
QDateTime total = now.addSecs(-signed_start_time); // a 32 bit value would wrap at 2038-1-19
|
||||||
|
// games shouldn't have negative ages but we'll not filter them
|
||||||
|
// because qtime wraps after a day we consider all games older than a day to be too old
|
||||||
|
if (total.isValid() && total.date() >= epochDate && (total.date() > epochDate || total.time() > maxGameAge)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QTime>
|
||||||
|
|
||||||
class GamesModel : public QAbstractTableModel
|
class GamesModel : public QAbstractTableModel
|
||||||
{
|
{
|
||||||
|
@ -37,7 +39,7 @@ public:
|
||||||
}
|
}
|
||||||
QVariant data(const QModelIndex &index, int role) const;
|
QVariant data(const QModelIndex &index, int role) const;
|
||||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||||
const QString getGameCreatedString(const int secs) const;
|
static const QString getGameCreatedString(const int secs);
|
||||||
const ServerInfo_Game &getGame(int row);
|
const ServerInfo_Game &getGame(int row);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -68,20 +70,22 @@ class GamesProxyModel : public QSortFilterProxyModel
|
||||||
private:
|
private:
|
||||||
bool ownUserIsRegistered;
|
bool ownUserIsRegistered;
|
||||||
const TabSupervisor *tabSupervisor;
|
const TabSupervisor *tabSupervisor;
|
||||||
|
|
||||||
|
// If adding any additional filters, make sure to update:
|
||||||
|
// - GamesProxyModel()
|
||||||
|
// - resetFilterParameters()
|
||||||
|
// - areFilterParametersSetToDefaults()
|
||||||
|
// - loadFilterParameters()
|
||||||
|
// - saveFilterParameters()
|
||||||
|
// - filterAcceptsRow()
|
||||||
bool showBuddiesOnlyGames;
|
bool showBuddiesOnlyGames;
|
||||||
bool hideIgnoredUserGames;
|
bool hideIgnoredUserGames;
|
||||||
bool unavailableGamesVisible;
|
bool unavailableGamesVisible;
|
||||||
bool showPasswordProtectedGames;
|
bool showPasswordProtectedGames;
|
||||||
QString gameNameFilter, creatorNameFilter;
|
QString gameNameFilter, creatorNameFilter;
|
||||||
QSet<int> gameTypeFilter;
|
QSet<int> gameTypeFilter;
|
||||||
int maxPlayersFilterMin, maxPlayersFilterMax;
|
quint32 maxPlayersFilterMin, maxPlayersFilterMax;
|
||||||
|
QTime maxGameAge;
|
||||||
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;
|
|
||||||
static const bool DEFAULT_HIDE_IGNORED_USER_GAMES = false;
|
|
||||||
static const int DEFAULT_MAX_PLAYERS_MIN = 1;
|
|
||||||
static const int DEFAULT_MAX_PLAYERS_MAX = 99;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GamesProxyModel(QObject *parent = nullptr, const TabSupervisor *_tabSupervisor = nullptr);
|
GamesProxyModel(QObject *parent = nullptr, const TabSupervisor *_tabSupervisor = nullptr);
|
||||||
|
@ -130,6 +134,12 @@ public:
|
||||||
return maxPlayersFilterMax;
|
return maxPlayersFilterMax;
|
||||||
}
|
}
|
||||||
void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax);
|
void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax);
|
||||||
|
const QTime &getMaxGameAge() const
|
||||||
|
{
|
||||||
|
return maxGameAge;
|
||||||
|
}
|
||||||
|
void setMaxGameAge(const QTime &_maxGameAge);
|
||||||
|
|
||||||
int getNumFilteredGames() const;
|
int getNumFilteredGames() const;
|
||||||
void resetFilterParameters();
|
void resetFilterParameters();
|
||||||
bool areFilterParametersSetToDefaults() const;
|
bool areFilterParametersSetToDefaults() const;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "gamefilterssettings.h"
|
#include "gamefilterssettings.h"
|
||||||
|
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
|
#include <QTime>
|
||||||
|
|
||||||
GameFiltersSettings::GameFiltersSettings(QString settingPath, QObject *parent)
|
GameFiltersSettings::GameFiltersSettings(QString settingPath, QObject *parent)
|
||||||
: SettingsManager(settingPath + "gamefilters.ini", parent)
|
: SettingsManager(settingPath + "gamefilters.ini", parent)
|
||||||
|
@ -102,6 +103,17 @@ int GameFiltersSettings::getMaxPlayers()
|
||||||
return previous == QVariant() ? 99 : previous.toInt();
|
return previous == QVariant() ? 99 : previous.toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameFiltersSettings::setMaxGameAge(const QTime &maxGameAge)
|
||||||
|
{
|
||||||
|
setValue(maxGameAge, "max_game_age_time", "filter_games");
|
||||||
|
}
|
||||||
|
|
||||||
|
QTime GameFiltersSettings::getMaxGameAge()
|
||||||
|
{
|
||||||
|
QVariant previous = getValue("max_game_age_time", "filter_games");
|
||||||
|
return previous.toTime();
|
||||||
|
}
|
||||||
|
|
||||||
void GameFiltersSettings::setGameTypeEnabled(QString gametype, bool enabled)
|
void GameFiltersSettings::setGameTypeEnabled(QString gametype, bool enabled)
|
||||||
{
|
{
|
||||||
setValue(enabled, "game_type/" + hashGameType(gametype), "filter_games");
|
setValue(enabled, "game_type/" + hashGameType(gametype), "filter_games");
|
||||||
|
|
|
@ -17,6 +17,7 @@ public:
|
||||||
QString getCreatorNameFilter();
|
QString getCreatorNameFilter();
|
||||||
int getMinPlayers();
|
int getMinPlayers();
|
||||||
int getMaxPlayers();
|
int getMaxPlayers();
|
||||||
|
QTime getMaxGameAge();
|
||||||
bool isGameTypeEnabled(QString gametype);
|
bool isGameTypeEnabled(QString gametype);
|
||||||
|
|
||||||
void setShowBuddiesOnlyGames(bool show);
|
void setShowBuddiesOnlyGames(bool show);
|
||||||
|
@ -27,6 +28,7 @@ public:
|
||||||
void setCreatorNameFilter(QString creatorName);
|
void setCreatorNameFilter(QString creatorName);
|
||||||
void setMinPlayers(int min);
|
void setMinPlayers(int min);
|
||||||
void setMaxPlayers(int max);
|
void setMaxPlayers(int max);
|
||||||
|
void setMaxGameAge(const QTime &maxGameAge);
|
||||||
void setGameTypeEnabled(QString gametype, bool enabled);
|
void setGameTypeEnabled(QString gametype, bool enabled);
|
||||||
void setGameHashedTypeEnabled(QString gametypeHASHED, bool enabled);
|
void setGameHashedTypeEnabled(QString gametypeHASHED, bool enabled);
|
||||||
signals:
|
signals:
|
||||||
|
|
Loading…
Reference in a new issue