23 #include "serverlistproxymodel.h" 25 #include "gui/entity/serverlistfilterinfo.h" 26 #include "gui/models/serverlistcolumn.h" 27 #include "gui/models/serverlistmodel.h" 28 #include "gui/mainwindow.h" 29 #include "gui/serverlist.h" 30 #include "serverapi/playerslist.h" 31 #include "serverapi/server.h" 36 DClass<ServerListProxyModel>
39 QList<ColumnSort> additionalSortColumns;
40 bool groupServersWithPlayersAtTop;
44 Qt::SortOrder sortOrder;
46 ColumnSort additionalSortForColumn(
int column)
const 48 foreach (
const ColumnSort &sort, additionalSortColumns)
50 if (sort.columnId() == column)
58 bool removeAdditionalColumnSorting(
int column)
60 ColumnSort sort = additionalSortForColumn(column);
63 additionalSortColumns.removeAll(sort);
73 : QSortFilterProxyModel(serverListHandler)
75 d->groupServersWithPlayersAtTop =
true;
76 d->mainSortColumn = -1;
77 d->parentHandler = serverListHandler;
80 ServerListProxyModel::~ServerListProxyModel()
84 void ServerListProxyModel::addAdditionalColumnSorting(
int column, Qt::SortOrder order)
86 if (d->mainSortColumn == column)
91 if (d->mainSortColumn >= 0)
93 d->removeAdditionalColumnSorting(column);
94 d->additionalSortColumns <<
ColumnSort(column, order);
95 emit additionalSortColumnsChanged();
99 d->mainSortColumn = column;
100 d->sortOrder = order;
102 sort(d->mainSortColumn, d->sortOrder);
105 const QList<ColumnSort> &ServerListProxyModel::additionalSortColumns()
const 107 return d->additionalSortColumns;
110 void ServerListProxyModel::clearAdditionalSorting()
112 if (!d->additionalSortColumns.isEmpty())
114 d->additionalSortColumns.clear();
115 emit additionalSortColumnsChanged();
119 #define RET_COMPARE(a, b) \ 129 int ServerListProxyModel::compareColumnSortData(QVariant& var1, QVariant& var2,
int column)
const 133 if ( !(var1.isValid() || !var2.isValid()) )
149 RET_COMPARE(var1.toUInt(), var2.toUInt());
153 RET_COMPARE(var1.toInt(), var2.toInt());
161 RET_COMPARE(var1.toString(), var2.toString());
170 ServerPtr s = serverFromList(sourceRow);
176 const QString& nameFilter = d->filterInfo.serverName;
177 if (!nameFilter.isEmpty())
179 if (!s->name().contains(nameFilter, Qt::CaseInsensitive))
185 if (!d->filterInfo.bEnabled)
192 if (d->filterInfo.bShowOnlyValid)
205 if (!d->filterInfo.bShowEmpty && s->isEmpty())
210 if (!d->filterInfo.bShowFull && s->isFull())
215 if (d->filterInfo.maxPing > 0 && d->filterInfo.maxPing < s->ping())
220 if (d->filterInfo.testingServers == Doomseeker::ShowOnly && !s->isTestingServer())
224 else if (d->filterInfo.testingServers == Doomseeker::ShowNone && s->isTestingServer())
229 if (!d->filterInfo.gameModes.isEmpty())
231 if (!d->filterInfo.gameModes.contains(s->gameMode().name(), Qt::CaseInsensitive))
237 if (d->filterInfo.gameModesExcluded.contains(s->gameMode().name(), Qt::CaseInsensitive))
242 if (!d->filterInfo.wads.isEmpty())
244 bool bWadFound =
false;
248 foreach (
const QString& filteredWad, d->filterInfo.wads)
250 if (s->anyWadnameContains(filteredWad))
263 if (!d->filterInfo.wadsExcluded.isEmpty())
265 foreach (
const QString& filteredWad, d->filterInfo.wadsExcluded)
267 if (s->anyWadnameContains(filteredWad))
280 return d->filterInfo;
283 bool ServerListProxyModel::isAnyColumnSortedAdditionally()
const 285 return !d->additionalSortColumns.isEmpty();
288 bool ServerListProxyModel::isSortingAdditionallyByColumn(
int column)
const 290 return d->additionalSortForColumn(column).isValid();
293 bool ServerListProxyModel::lessThan(
const QModelIndex& left,
const QModelIndex& right)
const 295 if (!d->parentHandler->getMainWindow()->isEffectivelyActiveWindow())
302 ServerPtr s1 = serverFromList(left);
303 ServerPtr s2 = serverFromList(right);
305 if (s1 != NULL && s2 != NULL)
307 if (s1->isCustom() && !s2->isCustom())
309 return d->sortOrder == Qt::AscendingOrder;
311 else if (!s1->isCustom() && s2->isCustom())
313 return d->sortOrder == Qt::DescendingOrder;
316 if (s1->isLan() && !s2->isLan())
318 return d->sortOrder == Qt::AscendingOrder;
320 else if (!s1->isLan() && s2->isLan())
322 return d->sortOrder == Qt::DescendingOrder;
329 if (sg1 != sg2 && sg1 != 0 && sg2 != 0)
333 return d->sortOrder == Qt::AscendingOrder;
337 return d->sortOrder == Qt::DescendingOrder;
341 if (d->groupServersWithPlayersAtTop)
345 int numPlayers1 = sourceModel()->data(left.sibling(left.row(),
346 ServerListColumnId::IDPlayers), sortRole()).toInt();
347 int numPlayers2 = sourceModel()->data(right.sibling(right.row(),
348 ServerListColumnId::IDPlayers), sortRole()).toInt();
349 if (numPlayers1 > 0 && numPlayers2 == 0)
351 return d->sortOrder == Qt::AscendingOrder;
353 else if (numPlayers1 == 0 && numPlayers2 > 0)
355 return d->sortOrder == Qt::DescendingOrder;
359 QVariant leftVar = sourceModel()->data(left, sortRole());
360 QVariant rightVar = sourceModel()->data(right, sortRole());
361 int comparison = compareColumnSortData(leftVar, rightVar, left.column());
364 foreach (
const ColumnSort &additionalSort, d->additionalSortColumns)
366 QModelIndex additionalLeft = left.sibling(left.row(), additionalSort.columnId());
367 QModelIndex additionalRight = right.sibling(right.row(), additionalSort.columnId());
368 leftVar = sourceModel()->data(additionalLeft, sortRole());
369 rightVar = sourceModel()->data(additionalRight, sortRole());
370 comparison = compareColumnSortData(leftVar, rightVar, additionalSort.columnId());
373 if (additionalSort.order() == Qt::DescendingOrder)
381 return comparison < 0;
384 void ServerListProxyModel::removeAdditionalColumnSorting(
int column)
386 bool anythingRemoved = d->removeAdditionalColumnSorting(column);
387 if (d->mainSortColumn > 0)
389 sort(d->mainSortColumn, d->sortOrder);
393 emit additionalSortColumnsChanged();
399 d->filterInfo = filterInfo;
403 void ServerListProxyModel::setGroupServersWithPlayersAtTop(
bool b)
405 d->groupServersWithPlayersAtTop = b;
409 ServerPtr ServerListProxyModel::serverFromList(
const QModelIndex& index)
const 411 return serverFromList(index.row());
414 ServerPtr ServerListProxyModel::serverFromList(
int row)
const 417 return model->serverFromList(row);
420 void ServerListProxyModel::setAdditionalSortColumns(
const QList<ColumnSort> &columns)
422 d->additionalSortColumns = columns;
423 emit additionalSortColumnsChanged();
426 void ServerListProxyModel::sortServers(
int column, Qt::SortOrder order)
428 d->mainSortColumn = column;
429 d->sortOrder = order;
430 if (d->removeAdditionalColumnSorting(column))
432 emit additionalSortColumnsChanged();
437 ColumnSort::ColumnSort()
440 order_ = Qt::AscendingOrder;
443 ColumnSort::ColumnSort(
int columnId, Qt::SortOrder order)
445 columnId_ = columnId;
449 int ColumnSort::columnId()
const 454 ColumnSort ColumnSort::deserializeQVariant(
const QVariant &v)
456 QVariantMap map = v.toMap();
458 static_cast<Qt::SortOrder>(map[
"order"].toInt())
462 bool ColumnSort::isValid()
const 464 return columnId() >= 0;
467 Qt::SortOrder ColumnSort::order()
const 472 bool ColumnSort::operator==(
const ColumnSort &other)
const 474 return order() == other.order() && columnId() == other.columnId();
477 QVariant ColumnSort::serializeQVariant()
const 480 map[
"columnId"] = columnId();
481 map[
"order"] = order();
Structure describing server filter.
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
void setFilterInfo(const ServerListFilterInfo &filterInfo)
Sets new filter info and immediately calls invalidate()