Merge pull request #523 from kaiserfro/apply-filters-at-start2
Apply filters at start
This commit is contained in:
commit
fba60c20c0
6 changed files with 117 additions and 98 deletions
|
@ -12,49 +12,37 @@
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
|
|
||||||
DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes, QWidget *parent)
|
DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes, const GamesProxyModel *_gamesProxyModel, QWidget *parent)
|
||||||
: QDialog(parent),
|
: QDialog(parent),
|
||||||
allGameTypes(_allGameTypes)
|
allGameTypes(_allGameTypes),
|
||||||
|
gamesProxyModel(_gamesProxyModel)
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
settings.beginGroup("filter_games");
|
settings.beginGroup("filter_games");
|
||||||
|
|
||||||
unavailableGamesVisibleCheckBox = new QCheckBox(tr("Show &unavailable games"));
|
unavailableGamesVisibleCheckBox = new QCheckBox(tr("Show &unavailable games"));
|
||||||
unavailableGamesVisibleCheckBox->setChecked(
|
unavailableGamesVisibleCheckBox->setChecked(gamesProxyModel->getUnavailableGamesVisible());
|
||||||
settings.value("unavailable_games_visible", false).toBool()
|
|
||||||
);
|
|
||||||
|
|
||||||
passwordProtectedGamesVisibleCheckBox = new QCheckBox(tr("Show &password protected games"));
|
passwordProtectedGamesVisibleCheckBox = new QCheckBox(tr("Show &password protected games"));
|
||||||
passwordProtectedGamesVisibleCheckBox->setChecked(
|
passwordProtectedGamesVisibleCheckBox->setChecked(gamesProxyModel->getPasswordProtectedGamesVisible());
|
||||||
settings.value("password_protected_games_visible", false).toBool()
|
|
||||||
);
|
|
||||||
|
|
||||||
gameNameFilterEdit = new QLineEdit;
|
gameNameFilterEdit = new QLineEdit;
|
||||||
gameNameFilterEdit->setText(
|
gameNameFilterEdit->setText(gamesProxyModel->getGameNameFilter());
|
||||||
settings.value("game_name_filter", "").toString()
|
|
||||||
);
|
|
||||||
QLabel *gameNameFilterLabel = new QLabel(tr("Game &description:"));
|
QLabel *gameNameFilterLabel = new QLabel(tr("Game &description:"));
|
||||||
gameNameFilterLabel->setBuddy(gameNameFilterEdit);
|
gameNameFilterLabel->setBuddy(gameNameFilterEdit);
|
||||||
|
|
||||||
creatorNameFilterEdit = new QLineEdit;
|
creatorNameFilterEdit = new QLineEdit;
|
||||||
creatorNameFilterEdit->setText(
|
creatorNameFilterEdit->setText(gamesProxyModel->getCreatorNameFilter());
|
||||||
settings.value("creator_name_filter", "").toString()
|
|
||||||
);
|
|
||||||
QLabel *creatorNameFilterLabel = new QLabel(tr("&Creator name:"));
|
QLabel *creatorNameFilterLabel = new QLabel(tr("&Creator name:"));
|
||||||
creatorNameFilterLabel->setBuddy(creatorNameFilterEdit);
|
creatorNameFilterLabel->setBuddy(creatorNameFilterEdit);
|
||||||
|
|
||||||
QVBoxLayout *gameTypeFilterLayout = new QVBoxLayout;
|
QVBoxLayout *gameTypeFilterLayout = new QVBoxLayout;
|
||||||
QMapIterator<int, QString> gameTypesIterator(allGameTypes);
|
QMapIterator<int, QString> gameTypesIterator(allGameTypes);
|
||||||
while (gameTypesIterator.hasNext()) {
|
while (gameTypesIterator.hasNext()) {
|
||||||
gameTypesIterator.next();
|
gameTypesIterator.next();
|
||||||
|
|
||||||
QCheckBox *temp = new QCheckBox(gameTypesIterator.value());
|
QCheckBox *temp = new QCheckBox(gameTypesIterator.value());
|
||||||
temp->setChecked(
|
temp->setChecked(gamesProxyModel->getGameTypeFilter().contains(gameTypesIterator.key()));
|
||||||
settings.value(
|
|
||||||
"game_type/" + hashGameType(gameTypesIterator.value()),
|
|
||||||
false
|
|
||||||
).toBool()
|
|
||||||
);
|
|
||||||
|
|
||||||
gameTypeFilterCheckBoxes.insert(gameTypesIterator.key(), temp);
|
gameTypeFilterCheckBoxes.insert(gameTypesIterator.key(), temp);
|
||||||
gameTypeFilterLayout->addWidget(temp);
|
gameTypeFilterLayout->addWidget(temp);
|
||||||
|
@ -65,34 +53,30 @@ DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes, QWidget
|
||||||
gameTypeFilterGroupBox->setLayout(gameTypeFilterLayout);
|
gameTypeFilterGroupBox->setLayout(gameTypeFilterLayout);
|
||||||
} else
|
} else
|
||||||
gameTypeFilterGroupBox = 0;
|
gameTypeFilterGroupBox = 0;
|
||||||
|
|
||||||
QLabel *maxPlayersFilterMinLabel = new QLabel(tr("at &least:"));
|
QLabel *maxPlayersFilterMinLabel = new QLabel(tr("at &least:"));
|
||||||
maxPlayersFilterMinSpinBox = new QSpinBox;
|
maxPlayersFilterMinSpinBox = new QSpinBox;
|
||||||
maxPlayersFilterMinSpinBox->setMinimum(1);
|
maxPlayersFilterMinSpinBox->setMinimum(1);
|
||||||
maxPlayersFilterMinSpinBox->setMaximum(99);
|
maxPlayersFilterMinSpinBox->setMaximum(99);
|
||||||
maxPlayersFilterMinSpinBox->setValue(
|
maxPlayersFilterMinSpinBox->setValue(gamesProxyModel->getMaxPlayersFilterMin());
|
||||||
settings.value("min_players", 1).toInt()
|
|
||||||
);
|
|
||||||
maxPlayersFilterMinLabel->setBuddy(maxPlayersFilterMinSpinBox);
|
maxPlayersFilterMinLabel->setBuddy(maxPlayersFilterMinSpinBox);
|
||||||
|
|
||||||
QLabel *maxPlayersFilterMaxLabel = new QLabel(tr("at &most:"));
|
QLabel *maxPlayersFilterMaxLabel = new QLabel(tr("at &most:"));
|
||||||
maxPlayersFilterMaxSpinBox = new QSpinBox;
|
maxPlayersFilterMaxSpinBox = new QSpinBox;
|
||||||
maxPlayersFilterMaxSpinBox->setMinimum(1);
|
maxPlayersFilterMaxSpinBox->setMinimum(1);
|
||||||
maxPlayersFilterMaxSpinBox->setMaximum(99);
|
maxPlayersFilterMaxSpinBox->setMaximum(99);
|
||||||
maxPlayersFilterMaxSpinBox->setValue(
|
maxPlayersFilterMaxSpinBox->setValue(gamesProxyModel->getMaxPlayersFilterMax());
|
||||||
settings.value("max_players", 99).toInt()
|
|
||||||
);
|
|
||||||
maxPlayersFilterMaxLabel->setBuddy(maxPlayersFilterMaxSpinBox);
|
maxPlayersFilterMaxLabel->setBuddy(maxPlayersFilterMaxSpinBox);
|
||||||
|
|
||||||
QGridLayout *maxPlayersFilterLayout = new QGridLayout;
|
QGridLayout *maxPlayersFilterLayout = new QGridLayout;
|
||||||
maxPlayersFilterLayout->addWidget(maxPlayersFilterMinLabel, 0, 0);
|
maxPlayersFilterLayout->addWidget(maxPlayersFilterMinLabel, 0, 0);
|
||||||
maxPlayersFilterLayout->addWidget(maxPlayersFilterMinSpinBox, 0, 1);
|
maxPlayersFilterLayout->addWidget(maxPlayersFilterMinSpinBox, 0, 1);
|
||||||
maxPlayersFilterLayout->addWidget(maxPlayersFilterMaxLabel, 1, 0);
|
maxPlayersFilterLayout->addWidget(maxPlayersFilterMaxLabel, 1, 0);
|
||||||
maxPlayersFilterLayout->addWidget(maxPlayersFilterMaxSpinBox, 1, 1);
|
maxPlayersFilterLayout->addWidget(maxPlayersFilterMaxSpinBox, 1, 1);
|
||||||
|
|
||||||
QGroupBox *maxPlayersGroupBox = new QGroupBox(tr("Maximum player count"));
|
QGroupBox *maxPlayersGroupBox = new QGroupBox(tr("Maximum player count"));
|
||||||
maxPlayersGroupBox->setLayout(maxPlayersFilterLayout);
|
maxPlayersGroupBox->setLayout(maxPlayersFilterLayout);
|
||||||
|
|
||||||
QGridLayout *leftGrid = new QGridLayout;
|
QGridLayout *leftGrid = new QGridLayout;
|
||||||
leftGrid->addWidget(gameNameFilterLabel, 0, 0);
|
leftGrid->addWidget(gameNameFilterLabel, 0, 0);
|
||||||
leftGrid->addWidget(gameNameFilterEdit, 0, 1);
|
leftGrid->addWidget(gameNameFilterEdit, 0, 1);
|
||||||
|
@ -101,66 +85,34 @@ DlgFilterGames::DlgFilterGames(const QMap<int, QString> &_allGameTypes, QWidget
|
||||||
leftGrid->addWidget(maxPlayersGroupBox, 2, 0, 1, 2);
|
leftGrid->addWidget(maxPlayersGroupBox, 2, 0, 1, 2);
|
||||||
leftGrid->addWidget(unavailableGamesVisibleCheckBox, 3, 0, 1, 2);
|
leftGrid->addWidget(unavailableGamesVisibleCheckBox, 3, 0, 1, 2);
|
||||||
leftGrid->addWidget(passwordProtectedGamesVisibleCheckBox, 4, 0, 1, 2);
|
leftGrid->addWidget(passwordProtectedGamesVisibleCheckBox, 4, 0, 1, 2);
|
||||||
|
|
||||||
QVBoxLayout *leftColumn = new QVBoxLayout;
|
QVBoxLayout *leftColumn = new QVBoxLayout;
|
||||||
leftColumn->addLayout(leftGrid);
|
leftColumn->addLayout(leftGrid);
|
||||||
leftColumn->addStretch();
|
leftColumn->addStretch();
|
||||||
|
|
||||||
QVBoxLayout *rightColumn = new QVBoxLayout;
|
QVBoxLayout *rightColumn = new QVBoxLayout;
|
||||||
rightColumn->addWidget(gameTypeFilterGroupBox);
|
rightColumn->addWidget(gameTypeFilterGroupBox);
|
||||||
|
|
||||||
QHBoxLayout *hbox = new QHBoxLayout;
|
QHBoxLayout *hbox = new QHBoxLayout;
|
||||||
hbox->addLayout(leftColumn);
|
hbox->addLayout(leftColumn);
|
||||||
hbox->addLayout(rightColumn);
|
hbox->addLayout(rightColumn);
|
||||||
|
|
||||||
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||||
connect(buttonBox, SIGNAL(accepted()), this, SLOT(actOk()));
|
connect(buttonBox, SIGNAL(accepted()), this, SLOT(actOk()));
|
||||||
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
||||||
|
|
||||||
QVBoxLayout *mainLayout = new QVBoxLayout;
|
QVBoxLayout *mainLayout = new QVBoxLayout;
|
||||||
mainLayout->addLayout(hbox);
|
mainLayout->addLayout(hbox);
|
||||||
mainLayout->addWidget(buttonBox);
|
mainLayout->addWidget(buttonBox);
|
||||||
|
|
||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
setWindowTitle(tr("Filter games"));
|
setWindowTitle(tr("Filter games"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DlgFilterGames::actOk() {
|
void DlgFilterGames::actOk() {
|
||||||
QSettings settings;
|
|
||||||
settings.beginGroup("filter_games");
|
|
||||||
settings.setValue(
|
|
||||||
"unavailable_games_visible",
|
|
||||||
unavailableGamesVisibleCheckBox->isChecked()
|
|
||||||
);
|
|
||||||
settings.setValue(
|
|
||||||
"password_protected_games_visible",
|
|
||||||
passwordProtectedGamesVisibleCheckBox->isChecked()
|
|
||||||
);
|
|
||||||
settings.setValue("game_name_filter", gameNameFilterEdit->text());
|
|
||||||
settings.setValue("creator_name_filter", creatorNameFilterEdit->text());
|
|
||||||
|
|
||||||
QMapIterator<int, QString> gameTypeIterator(allGameTypes);
|
|
||||||
QMapIterator<int, QCheckBox *> checkboxIterator(gameTypeFilterCheckBoxes);
|
|
||||||
while (gameTypeIterator.hasNext()) {
|
|
||||||
gameTypeIterator.next();
|
|
||||||
checkboxIterator.next();
|
|
||||||
|
|
||||||
settings.setValue(
|
|
||||||
"game_type/" + hashGameType(gameTypeIterator.value()),
|
|
||||||
checkboxIterator.value()->isChecked()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.setValue("min_players", maxPlayersFilterMinSpinBox->value());
|
|
||||||
settings.setValue("max_players", maxPlayersFilterMaxSpinBox->value());
|
|
||||||
|
|
||||||
accept();
|
accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString DlgFilterGames::hashGameType(const QString &gameType) const {
|
|
||||||
return QCryptographicHash::hash(gameType.toUtf8(), QCryptographicHash::Md5).toHex();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DlgFilterGames::getUnavailableGamesVisible() const
|
bool DlgFilterGames::getUnavailableGamesVisible() const
|
||||||
{
|
{
|
||||||
return unavailableGamesVisibleCheckBox->isChecked();
|
return unavailableGamesVisibleCheckBox->isChecked();
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
#include "gamesmodel.h"
|
||||||
|
|
||||||
class QCheckBox;
|
class QCheckBox;
|
||||||
class QLineEdit;
|
class QLineEdit;
|
||||||
|
@ -21,17 +22,13 @@ private:
|
||||||
QSpinBox *maxPlayersFilterMaxSpinBox;
|
QSpinBox *maxPlayersFilterMaxSpinBox;
|
||||||
|
|
||||||
const QMap<int, QString> &allGameTypes;
|
const QMap<int, QString> &allGameTypes;
|
||||||
|
const GamesProxyModel *gamesProxyModel;
|
||||||
|
|
||||||
/*
|
|
||||||
* The game type might contain special characters, so to use it in
|
|
||||||
* QSettings we just hash it.
|
|
||||||
*/
|
|
||||||
QString hashGameType(const QString &gameType) const;
|
|
||||||
private slots:
|
private slots:
|
||||||
void actOk();
|
void actOk();
|
||||||
public:
|
public:
|
||||||
DlgFilterGames(const QMap<int, QString> &allGameTypes, QWidget *parent = 0);
|
DlgFilterGames(const QMap<int, QString> &_allGameTypes, const GamesProxyModel *_gamesProxyModel, QWidget *parent = 0);
|
||||||
|
|
||||||
bool getUnavailableGamesVisible() const;
|
bool getUnavailableGamesVisible() const;
|
||||||
void setUnavailableGamesVisible(bool _unavailableGamesVisible);
|
void setUnavailableGamesVisible(bool _unavailableGamesVisible);
|
||||||
bool getPasswordProtectedGamesVisible() const;
|
bool getPasswordProtectedGamesVisible() const;
|
||||||
|
|
|
@ -32,8 +32,12 @@ GameSelector::GameSelector(AbstractClient *_client, const TabSupervisor *_tabSup
|
||||||
gameListView->setRootIsDecorated(true);
|
gameListView->setRootIsDecorated(true);
|
||||||
if (_room)
|
if (_room)
|
||||||
gameListView->header()->hideSection(gameListModel->roomColIndex());
|
gameListView->header()->hideSection(gameListModel->roomColIndex());
|
||||||
else
|
|
||||||
gameListProxyModel->setUnavailableGamesVisible(true);
|
if (room)
|
||||||
|
gameTypeMap = gameListModel->getGameTypes().value(room->getRoomId());
|
||||||
|
|
||||||
|
gameListProxyModel->loadFilterParameters(gameTypeMap);
|
||||||
|
|
||||||
#if QT_VERSION < 0x050000
|
#if QT_VERSION < 0x050000
|
||||||
gameListView->header()->setResizeMode(0, QHeaderView::ResizeToContents);
|
gameListView->header()->setResizeMode(0, QHeaderView::ResizeToContents);
|
||||||
#else
|
#else
|
||||||
|
@ -44,7 +48,7 @@ GameSelector::GameSelector(AbstractClient *_client, const TabSupervisor *_tabSup
|
||||||
connect(filterButton, SIGNAL(clicked()), this, SLOT(actSetFilter()));
|
connect(filterButton, SIGNAL(clicked()), this, SLOT(actSetFilter()));
|
||||||
clearFilterButton = new QPushButton;
|
clearFilterButton = new QPushButton;
|
||||||
clearFilterButton->setIcon(QIcon(":/resources/icon_clearsearch.svg"));
|
clearFilterButton->setIcon(QIcon(":/resources/icon_clearsearch.svg"));
|
||||||
clearFilterButton->setEnabled(false);
|
clearFilterButton->setEnabled(true);
|
||||||
connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter()));
|
connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter()));
|
||||||
|
|
||||||
if (room) {
|
if (room) {
|
||||||
|
@ -82,29 +86,28 @@ GameSelector::GameSelector(AbstractClient *_client, const TabSupervisor *_tabSup
|
||||||
|
|
||||||
void GameSelector::actSetFilter()
|
void GameSelector::actSetFilter()
|
||||||
{
|
{
|
||||||
GameTypeMap gameTypeMap;
|
DlgFilterGames dlg(gameTypeMap, gameListProxyModel, this);
|
||||||
if (room)
|
|
||||||
gameTypeMap = gameListModel->getGameTypes().value(room->getRoomId());
|
|
||||||
DlgFilterGames dlg(gameTypeMap, this);
|
|
||||||
|
|
||||||
if (!dlg.exec())
|
if (!dlg.exec())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
clearFilterButton->setEnabled(true);
|
clearFilterButton->setEnabled(true);
|
||||||
|
|
||||||
gameListProxyModel->setUnavailableGamesVisible(dlg.getUnavailableGamesVisible());
|
gameListProxyModel->setUnavailableGamesVisible(dlg.getUnavailableGamesVisible());
|
||||||
gameListProxyModel->setPasswordProtectedGamesVisible(dlg.getPasswordProtectedGamesVisible());
|
gameListProxyModel->setPasswordProtectedGamesVisible(dlg.getPasswordProtectedGamesVisible());
|
||||||
gameListProxyModel->setGameNameFilter(dlg.getGameNameFilter());
|
gameListProxyModel->setGameNameFilter(dlg.getGameNameFilter());
|
||||||
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->saveFilterParameters(gameTypeMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSelector::actClearFilter()
|
void GameSelector::actClearFilter()
|
||||||
{
|
{
|
||||||
clearFilterButton->setEnabled(false);
|
clearFilterButton->setEnabled(false);
|
||||||
|
|
||||||
gameListProxyModel->resetFilterParameters();
|
gameListProxyModel->resetFilterParameters();
|
||||||
|
gameListProxyModel->saveFilterParameters(gameTypeMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSelector::actCreate()
|
void GameSelector::actCreate()
|
||||||
|
@ -136,7 +139,7 @@ void GameSelector::checkResponse(const Response &response)
|
||||||
void GameSelector::actJoin()
|
void GameSelector::actJoin()
|
||||||
{
|
{
|
||||||
bool spectator = sender() == spectateButton;
|
bool spectator = sender() == spectateButton;
|
||||||
|
|
||||||
QModelIndex ind = gameListView->currentIndex();
|
QModelIndex ind = gameListView->currentIndex();
|
||||||
if (!ind.isValid())
|
if (!ind.isValid())
|
||||||
return;
|
return;
|
||||||
|
@ -149,19 +152,19 @@ void GameSelector::actJoin()
|
||||||
if (!ok)
|
if (!ok)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Command_JoinGame cmd;
|
Command_JoinGame cmd;
|
||||||
cmd.set_game_id(game.game_id());
|
cmd.set_game_id(game.game_id());
|
||||||
cmd.set_password(password.toStdString());
|
cmd.set_password(password.toStdString());
|
||||||
cmd.set_spectator(spectator);
|
cmd.set_spectator(spectator);
|
||||||
cmd.set_override_restrictions(overrideRestrictions);
|
cmd.set_override_restrictions(overrideRestrictions);
|
||||||
|
|
||||||
TabRoom *r = tabSupervisor->getRoomTabs().value(game.room_id());
|
TabRoom *r = tabSupervisor->getRoomTabs().value(game.room_id());
|
||||||
if (!r) {
|
if (!r) {
|
||||||
QMessageBox::critical(this, tr("Error"), tr("Please join the respective room first."));
|
QMessageBox::critical(this, tr("Error"), tr("Please join the respective room first."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PendingCommand *pend = r->prepareRoomCommand(cmd);
|
PendingCommand *pend = r->prepareRoomCommand(cmd);
|
||||||
connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this, SLOT(checkResponse(Response)));
|
connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this, SLOT(checkResponse(Response)));
|
||||||
r->sendRoomCommand(pend);
|
r->sendRoomCommand(pend);
|
||||||
|
|
|
@ -34,6 +34,7 @@ private:
|
||||||
GamesModel *gameListModel;
|
GamesModel *gameListModel;
|
||||||
GamesProxyModel *gameListProxyModel;
|
GamesProxyModel *gameListProxyModel;
|
||||||
QPushButton *filterButton, *clearFilterButton, *createButton, *joinButton, *spectateButton;
|
QPushButton *filterButton, *clearFilterButton, *createButton, *joinButton, *spectateButton;
|
||||||
|
GameTypeMap gameTypeMap;
|
||||||
public:
|
public:
|
||||||
GameSelector(AbstractClient *_client, const TabSupervisor *_tabSupervisor, TabRoom *_room, const QMap<int, QString> &_rooms, const QMap<int, GameTypeMap> &_gameTypes, QWidget *parent = 0);
|
GameSelector(AbstractClient *_client, const TabSupervisor *_tabSupervisor, TabRoom *_room, const QMap<int, QString> &_rooms, const QMap<int, GameTypeMap> &_gameTypes, QWidget *parent = 0);
|
||||||
void retranslateUi();
|
void retranslateUi();
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QCryptographicHash>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const unsigned SECS_PER_MIN = 60;
|
const unsigned SECS_PER_MIN = 60;
|
||||||
|
@ -10,7 +12,7 @@ namespace {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pretty print an integer number of seconds ago. Accurate to only one unit,
|
* Pretty print an integer number of seconds ago. Accurate to only one unit,
|
||||||
* rounded; <5 minutes and >5 hours are displayed as such. As a special case,
|
* rounded; <5 minutes and >5 hours are displayed as such. As a special case,
|
||||||
* time between 60 and 90 minutes will display both the hours and minutes.
|
* time between 60 and 90 minutes will display both the hours and minutes.
|
||||||
*
|
*
|
||||||
* For example...
|
* For example...
|
||||||
|
@ -85,7 +87,7 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const
|
||||||
QDateTime then;
|
QDateTime then;
|
||||||
then.setTime_t(g.start_time());
|
then.setTime_t(g.start_time());
|
||||||
unsigned int secs = then.secsTo(QDateTime::currentDateTime());
|
unsigned int secs = then.secsTo(QDateTime::currentDateTime());
|
||||||
|
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case Qt::DisplayRole: return prettyPrintSecsAgo(secs);
|
case Qt::DisplayRole: return prettyPrintSecsAgo(secs);
|
||||||
case SORT_ROLE: return QVariant(secs);
|
case SORT_ROLE: return QVariant(secs);
|
||||||
|
@ -221,12 +223,62 @@ void GamesProxyModel::resetFilterParameters()
|
||||||
gameNameFilter = QString();
|
gameNameFilter = QString();
|
||||||
creatorNameFilter = QString();
|
creatorNameFilter = QString();
|
||||||
gameTypeFilter.clear();
|
gameTypeFilter.clear();
|
||||||
maxPlayersFilterMin = -1;
|
maxPlayersFilterMin = 1;
|
||||||
maxPlayersFilterMax = -1;
|
maxPlayersFilterMax = DEFAULT_MAX_PLAYERS_MAX;
|
||||||
|
|
||||||
invalidateFilter();
|
invalidateFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GamesProxyModel::loadFilterParameters(const QMap<int, QString> &allGameTypes)
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
settings.beginGroup("filter_games");
|
||||||
|
|
||||||
|
unavailableGamesVisible = settings.value("unavailable_games_visible", false).toBool();
|
||||||
|
passwordProtectedGamesVisible = settings.value("password_protected_games_visible", false).toBool();
|
||||||
|
gameNameFilter = settings.value("game_name_filter", "").toString();
|
||||||
|
creatorNameFilter = settings.value("creator_name_filter", "").toString();
|
||||||
|
maxPlayersFilterMin = settings.value("min_players", 1).toInt();
|
||||||
|
maxPlayersFilterMax = settings.value("max_players", DEFAULT_MAX_PLAYERS_MAX).toInt();
|
||||||
|
|
||||||
|
QMapIterator<int, QString> gameTypesIterator(allGameTypes);
|
||||||
|
while (gameTypesIterator.hasNext()) {
|
||||||
|
gameTypesIterator.next();
|
||||||
|
if (settings.value("game_type/" + hashGameType(gameTypesIterator.value()), false).toBool()) {
|
||||||
|
gameTypeFilter.insert(gameTypesIterator.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
invalidateFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GamesProxyModel::saveFilterParameters(const QMap<int, QString> &allGameTypes)
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
settings.beginGroup("filter_games");
|
||||||
|
|
||||||
|
settings.setValue("unavailable_games_visible", unavailableGamesVisible);
|
||||||
|
settings.setValue(
|
||||||
|
"password_protected_games_visible",
|
||||||
|
passwordProtectedGamesVisible
|
||||||
|
);
|
||||||
|
settings.setValue("game_name_filter", gameNameFilter);
|
||||||
|
settings.setValue("creator_name_filter", creatorNameFilter);
|
||||||
|
|
||||||
|
QMapIterator<int, QString> gameTypeIterator(allGameTypes);
|
||||||
|
while (gameTypeIterator.hasNext()) {
|
||||||
|
gameTypeIterator.next();
|
||||||
|
|
||||||
|
settings.setValue(
|
||||||
|
"game_type/" + hashGameType(gameTypeIterator.value()),
|
||||||
|
gameTypeFilter.contains(gameTypeIterator.key())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setValue("min_players", maxPlayersFilterMin);
|
||||||
|
settings.setValue("max_players", maxPlayersFilterMax);
|
||||||
|
}
|
||||||
|
|
||||||
bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &/*sourceParent*/) const
|
bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &/*sourceParent*/) const
|
||||||
{
|
{
|
||||||
GamesModel *model = qobject_cast<GamesModel *>(sourceModel());
|
GamesModel *model = qobject_cast<GamesModel *>(sourceModel());
|
||||||
|
@ -265,3 +317,7 @@ bool GamesProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &/*sourc
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString GamesProxyModel::hashGameType(const QString &gameType) const {
|
||||||
|
return QCryptographicHash::hash(gameType.toUtf8(), QCryptographicHash::Md5).toHex();
|
||||||
|
}
|
||||||
|
|
|
@ -49,6 +49,14 @@ private:
|
||||||
QString gameNameFilter, creatorNameFilter;
|
QString gameNameFilter, creatorNameFilter;
|
||||||
QSet<int> gameTypeFilter;
|
QSet<int> gameTypeFilter;
|
||||||
int maxPlayersFilterMin, maxPlayersFilterMax;
|
int maxPlayersFilterMin, maxPlayersFilterMax;
|
||||||
|
|
||||||
|
static const int DEFAULT_MAX_PLAYERS_MAX = 99;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The game type might contain special characters, so to use it in
|
||||||
|
* QSettings we just hash it.
|
||||||
|
*/
|
||||||
|
QString hashGameType(const QString &gameType) const;
|
||||||
public:
|
public:
|
||||||
GamesProxyModel(QObject *parent = 0, ServerInfo_User *_ownUser = 0);
|
GamesProxyModel(QObject *parent = 0, ServerInfo_User *_ownUser = 0);
|
||||||
|
|
||||||
|
@ -66,6 +74,8 @@ public:
|
||||||
int getMaxPlayersFilterMax() const { return maxPlayersFilterMax; }
|
int getMaxPlayersFilterMax() const { return maxPlayersFilterMax; }
|
||||||
void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax);
|
void setMaxPlayersFilter(int _maxPlayersFilterMin, int _maxPlayersFilterMax);
|
||||||
void resetFilterParameters();
|
void resetFilterParameters();
|
||||||
|
void loadFilterParameters(const QMap<int, QString> &allGameTypes);
|
||||||
|
void saveFilterParameters(const QMap<int, QString> &allGameTypes);
|
||||||
protected:
|
protected:
|
||||||
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
|
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue