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/serverlist.h"
29 #include "serverapi/playerslist.h"
30 #include "serverapi/server.h"
35 DClass<ServerListProxyModel>
38 QList<ColumnSort> additionalSortColumns;
39 bool groupServersWithPlayersAtTop;
43 Qt::SortOrder sortOrder;
45 ColumnSort additionalSortForColumn(
int column)
const
47 foreach (
const ColumnSort &sort, additionalSortColumns)
49 if (sort.columnId() == column)
57 bool removeAdditionalColumnSorting(
int column)
59 ColumnSort sort = additionalSortForColumn(column);
62 additionalSortColumns.removeAll(sort);
72 : QSortFilterProxyModel(serverListHandler)
74 d->groupServersWithPlayersAtTop =
true;
75 d->mainSortColumn = -1;
76 d->parentHandler = serverListHandler;
79 ServerListProxyModel::~ServerListProxyModel()
83 void ServerListProxyModel::addAdditionalColumnSorting(
int column, Qt::SortOrder order)
85 if (d->mainSortColumn == column)
90 if (d->mainSortColumn >= 0)
92 d->removeAdditionalColumnSorting(column);
93 d->additionalSortColumns <<
ColumnSort(column, order);
94 emit additionalSortColumnsChanged();
98 d->mainSortColumn = column;
101 sort(d->mainSortColumn, d->sortOrder);
104 const QList<ColumnSort> &ServerListProxyModel::additionalSortColumns()
const
106 return d->additionalSortColumns;
109 void ServerListProxyModel::clearAdditionalSorting()
111 if (!d->additionalSortColumns.isEmpty())
113 d->additionalSortColumns.clear();
114 emit additionalSortColumnsChanged();
118 #define RET_COMPARE(a, b) \
128 int ServerListProxyModel::compareColumnSortData(QVariant& var1, QVariant& var2,
int column)
const
130 using namespace ServerListColumnId;
132 if ( !(var1.isValid() || !var2.isValid()) )
148 RET_COMPARE(var1.toUInt(), var2.toUInt());
152 RET_COMPARE(var1.toInt(), var2.toInt());
160 RET_COMPARE(var1.toString(), var2.toString());
169 ServerPtr s = serverFromList(sourceRow);
174 if (!d->filterInfo.bEnabled)
181 if (d->filterInfo.bShowOnlyValid)
194 if (!d->filterInfo.bShowEmpty && s->isEmpty())
199 if (!d->filterInfo.bShowFull && s->isFull())
204 if (d->filterInfo.maxPing > 0 && d->filterInfo.maxPing < s->ping())
209 const QString& nameFilter = d->filterInfo.serverName;
210 if (!nameFilter.isEmpty())
212 if (!s->name().contains(nameFilter, Qt::CaseInsensitive))
218 if (!d->filterInfo.gameModes.isEmpty())
220 if (!d->filterInfo.gameModes.contains(s->gameMode().name(), Qt::CaseInsensitive))
226 if (d->filterInfo.gameModesExcluded.contains(s->gameMode().name(), Qt::CaseInsensitive))
231 if (!d->filterInfo.wads.isEmpty())
233 bool bWadFound =
false;
237 foreach (
const QString& filteredWad, d->filterInfo.wads)
239 if (s->anyWadnameContains(filteredWad))
252 if (!d->filterInfo.wadsExcluded.isEmpty())
254 bool bWadFound =
false;
255 foreach (
const QString& filteredWad, d->filterInfo.wadsExcluded)
257 if (s->anyWadnameContains(filteredWad))
270 return d->filterInfo;
273 bool ServerListProxyModel::isAnyColumnSortedAdditionally()
const
275 return !d->additionalSortColumns.isEmpty();
278 bool ServerListProxyModel::isSortingAdditionallyByColumn(
int column)
const
280 return d->additionalSortForColumn(column).isValid();
283 bool ServerListProxyModel::lessThan(
const QModelIndex& left,
const QModelIndex& right)
const
285 if (!d->parentHandler->getMainWindow()->isActiveWindow())
292 ServerPtr s1 = serverFromList(left);
293 ServerPtr s2 = serverFromList(right);
295 if (s1 != NULL && s2 != NULL)
297 if (s1->isCustom() && !s2->isCustom())
299 return d->sortOrder == Qt::AscendingOrder;
301 else if (!s1->isCustom() && s2->isCustom())
303 return d->sortOrder == Qt::DescendingOrder;
310 if (sg1 != sg2 && sg1 != 0 && sg2 != 0)
314 return d->sortOrder == Qt::AscendingOrder;
318 return d->sortOrder == Qt::DescendingOrder;
322 if (d->groupServersWithPlayersAtTop)
326 int numPlayers1 = sourceModel()->data(left.sibling(left.row(),
327 ServerListColumnId::IDPlayers), sortRole()).toInt();
328 int numPlayers2 = sourceModel()->data(right.sibling(right.row(),
329 ServerListColumnId::IDPlayers), sortRole()).toInt();
330 if (numPlayers1 > 0 && numPlayers2 == 0)
332 return d->sortOrder == Qt::AscendingOrder;
334 else if (numPlayers1 == 0 && numPlayers2 > 0)
336 return d->sortOrder == Qt::DescendingOrder;
340 QVariant leftVar = sourceModel()->data(left, sortRole());
341 QVariant rightVar = sourceModel()->data(right, sortRole());
342 int comparison = compareColumnSortData(leftVar, rightVar, left.column());
345 foreach (
const ColumnSort &additionalSort, d->additionalSortColumns)
347 QModelIndex additionalLeft = left.sibling(left.row(), additionalSort.columnId());
348 QModelIndex additionalRight = right.sibling(right.row(), additionalSort.columnId());
349 leftVar = sourceModel()->data(additionalLeft, sortRole());
350 rightVar = sourceModel()->data(additionalRight, sortRole());
351 comparison = compareColumnSortData(leftVar, rightVar, additionalSort.columnId());
354 if (additionalSort.order() == Qt::DescendingOrder)
362 return comparison < 0;
365 void ServerListProxyModel::removeAdditionalColumnSorting(
int column)
367 bool anythingRemoved = d->removeAdditionalColumnSorting(column);
368 if (d->mainSortColumn > 0)
370 sort(d->mainSortColumn, d->sortOrder);
374 emit additionalSortColumnsChanged();
380 d->filterInfo = filterInfo;
384 void ServerListProxyModel::setGroupServersWithPlayersAtTop(
bool b)
386 d->groupServersWithPlayersAtTop = b;
390 ServerPtr ServerListProxyModel::serverFromList(
const QModelIndex& index)
const
392 return serverFromList(index.row());
395 ServerPtr ServerListProxyModel::serverFromList(
int row)
const
398 return model->serverFromList(row);
401 void ServerListProxyModel::setAdditionalSortColumns(
const QList<ColumnSort> &columns)
403 d->additionalSortColumns = columns;
404 emit additionalSortColumnsChanged();
407 void ServerListProxyModel::sortServers(
int column, Qt::SortOrder order)
409 d->mainSortColumn = column;
410 d->sortOrder = order;
411 if (d->removeAdditionalColumnSorting(column))
413 emit additionalSortColumnsChanged();
418 ColumnSort::ColumnSort()
421 order_ = Qt::AscendingOrder;
424 ColumnSort::ColumnSort(
int columnId, Qt::SortOrder order)
426 columnId_ = columnId;
430 int ColumnSort::columnId()
const
435 ColumnSort ColumnSort::deserializeQVariant(
const QVariant &v)
437 QVariantMap map = v.toMap();
439 static_cast<Qt::SortOrder>(map[
"order"].toInt())
443 bool ColumnSort::isValid()
const
445 return columnId() >= 0;
448 Qt::SortOrder ColumnSort::order()
const
453 bool ColumnSort::operator==(
const ColumnSort &other)
const
455 return order() == other.order() && columnId() == other.columnId();
458 QVariant ColumnSort::serializeQVariant()
const
461 map[
"columnId"] = columnId();
462 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()