23 #include "application.h"
24 #include "configuration/doomseekerconfig.h"
25 #include "gui/dockBuddiesList.h"
26 #include "gui/helpers/playersdiagram.h"
27 #include "gui/mainwindow.h"
28 #include "gui/serverlist.h"
29 #include "gui/widgets/serverlistview.h"
30 #include "ip2c/ip2c.h"
32 #include "serverapi/playerslist.h"
33 #include "serverapi/server.h"
35 #include "serverlistcolumn.h"
36 #include "serverlistmodel.h"
37 #include "serverlistrowhandler.h"
40 using namespace ServerListColumnId;
42 DClass<ServerListRowHandler>
51 int rowIndex, const ServerPtr &server)
52 : model(parentModel), row(rowIndex)
57 ServerListRowHandler::ServerListRowHandler(
ServerListModel *parentModel,
int rowIndex)
58 : model(parentModel), row(rowIndex)
60 d->server = serverFromList(parentModel, rowIndex);
63 ServerListRowHandler::~ServerListRowHandler()
69 for (
int i = 0; i < NUM_SERVERLIST_COLUMNS; ++i)
71 if (!ServerListColumns::isColumnVital(i))
76 void ServerListRowHandler::emptyItem(QStandardItem *item)
78 item->setData(
"", Qt::DisplayRole);
79 item->setData(QVariant(), Qt::DecorationRole);
80 item->setData(QVariant(), ServerListModel::SLDT_SORT);
83 QStringList ServerListRowHandler::extractValidGameCVarNames(
const QList<GameCVar> &cvars)
89 result << cvar.name();
94 void ServerListRowHandler::fillAddressColumn()
96 QStandardItem *pItem = item(IDAddress);
97 fillItem(pItem, d->server->address(), d->server->hostName());
100 void ServerListRowHandler::fillItem(QStandardItem *item,
const QString &str)
102 QString strLowcase = str.toLower();
103 item->setData(str, Qt::DisplayRole);
104 item->setData(strLowcase, ServerListModel::SLDT_SORT);
107 void ServerListRowHandler::fillItem(QStandardItem *item,
int sort,
const QString &str)
112 item->setData(sort, ServerListModel::SLDT_SORT);
115 void ServerListRowHandler::fillItem(QStandardItem *item,
int num)
119 item->setData(var, Qt::DisplayRole);
120 item->setData(var, ServerListModel::SLDT_SORT);
123 void ServerListRowHandler::fillItem(QStandardItem *item,
const QHostAddress &addr,
const QString &actualDisplay)
125 QVariant var = addr.toIPv4Address();
127 if (actualDisplay.isEmpty())
128 item->setData(addr.toString(), Qt::DisplayRole);
130 item->setData(actualDisplay, Qt::DisplayRole);
131 item->setData(var, ServerListModel::SLDT_SORT);
134 void ServerListRowHandler::fillItem(QStandardItem *item,
const QString &sort,
const QPixmap &icon)
136 item->setIcon(QIcon(icon));
137 item->setData(sort, ServerListModel::SLDT_SORT);
140 void ServerListRowHandler::fillItem(QStandardItem *item,
int sort,
const QPixmap &image)
142 item->setData(image, Qt::DecorationRole);
143 item->setData(sort, ServerListModel::SLDT_SORT);
146 void ServerListRowHandler::fillPlayerColumn()
148 QStandardItem *pItem = item(IDPlayers);
150 QString style = gConfig.doomseeker.slotStyle;
151 bool botsAreNotPlayers = gConfig.doomseeker.bBotsAreNotPlayers;
156 if (botsAreNotPlayers)
157 sortValue = players.numClientsWithoutBots();
161 if (!PlayersDiagram::isNumericStyle(style))
165 fillItem(pItem, sortValue, QString(
"%1/%2").arg(players.
numClients())
166 .arg(d->server->numTotalSlots()));
170 pItem->setData(QVariant(QVariant::Invalid), PlayersDiagram::isNumericStyle(style) ? Qt::DecorationRole : Qt::DisplayRole);
171 pItem->setData(PlayersDiagram::isNumericStyle(style) ? 0 : USERROLE_RIGHTALIGNDECORATION, Qt::UserRole);
174 void ServerListRowHandler::fillPortIconColumn()
176 QStandardItem *pItem = item(IDPort);
177 QPixmap icon = d->server->icon();
178 if (d->server->isKnown())
180 if (d->server->isLockedAnywhere())
182 QPainter iconPainter(&icon);
183 iconPainter.drawPixmap(0, 0, QPixmap(
":/locked.png"));
186 else if (d->server->isSecure())
188 QPainter iconPainter(&icon);
189 iconPainter.drawPixmap(0, 0, QPixmap(
":/shield.png"));
194 if (d->server->isTestingServer())
196 QPainter iconPainter(&icon);
197 iconPainter.drawPixmap(0, 0, QPixmap(
":/t.png"));
201 fillItem(pItem, d->server->metaObject()->className(), icon);
204 void ServerListRowHandler::fillServerPointer()
206 QStandardItem *pItem = item(COL_META);
207 QVariant savePointer = QVariant::fromValue(d->server);
208 pItem->setData(savePointer, ServerListModel::SLDT_POINTER_TO_SERVER_STRUCTURE);
211 QStandardItem *ServerListRowHandler::item(
int columnIndex)
213 return model->item(row, columnIndex);
216 void ServerListRowHandler::redraw()
225 ServerPtr ServerListRowHandler::server()
230 void ServerListRowHandler::setBackgroundColor()
233 if (d->server->isCustom())
234 color = gConfig.doomseeker.customServersColor;
235 else if (d->server->isLan())
236 color = gConfig.doomseeker.lanServersColor;
237 else if (gApp->mainWindow()->buddiesList()->hasBuddy(d->server))
239 if (gConfig.doomseeker.bMarkServersWithBuddies)
240 color = gConfig.doomseeker.buddyServersColor;
243 for (
int column = 0; column < NUM_SERVERLIST_COLUMNS; ++column)
245 QBrush brush = !color.isEmpty()
246 ? QBrush(QColor(color))
248 QStandardItem *pItem = item(column);
249 pItem->setBackground(brush);
253 void ServerListRowHandler::setBad()
255 QStandardItem *qstdItem;
259 qstdItem = item(IDServerName);
260 fillItem(qstdItem, tr(
"<ERROR>"));
262 item(COL_META)->setData(SGBad, ServerListModel::SLDT_SERVER_GROUP);
265 void ServerListRowHandler::setBanned()
267 QStandardItem *qstdItem;
271 qstdItem = item(IDServerName);
272 fillItem(qstdItem, tr(
"You are banned from this server!"));
274 item(COL_META)->setData(SGBanned, ServerListModel::SLDT_SERVER_GROUP);
277 void ServerListRowHandler::setCountryFlag()
279 QStandardItem *pItem = item(IDServerName);
281 if (!IP2C::instance()->isDataAccessLocked())
284 if (countryInfo.isValid())
286 QPixmap flag = *countryInfo.flag;
287 pItem->setIcon(flag);
292 void ServerListRowHandler::setFirstQuery()
294 item(COL_META)->setData(SGFirstQuery, ServerListModel::SLDT_SERVER_GROUP);
297 void ServerListRowHandler::setGood()
299 QStandardItem *qstdItem;
304 qstdItem = item(IDPing);
305 fillItem(qstdItem, d->server->ping());
307 qstdItem = item(IDServerName);
308 fillItem(qstdItem, d->server->name());
310 qstdItem = item(IDIwad);
311 fillItem(qstdItem, d->server->iwad());
313 qstdItem = item(IDMap);
314 fillItem(qstdItem, d->server->map());
317 for (
const PWad &wad : d->server->wads())
319 if (wad.isOptional())
320 strTmp += QString(
"[%1] ").arg(wad.name());
322 strTmp += wad.name() +
" ";
325 qstdItem = item(IDWads);
326 fillItem(qstdItem, strTmp);
328 qstdItem = item(IDGametype);
329 QString fullGameModeName = d->server->gameMode().name();
330 QStringList modifierNames = extractValidGameCVarNames(d->server->modifiers());
331 if (!modifierNames.isEmpty())
332 fullGameModeName += QString(
" (%1)").arg(modifierNames.join(
", "));
333 fillItem(qstdItem, fullGameModeName);
335 item(COL_META)->setData(SGNormal, ServerListModel::SLDT_SERVER_GROUP);
338 void ServerListRowHandler::setRefreshing()
340 QStandardItem *qstdItem = item(IDServerName);
341 qstdItem->setText(tr(
"<REFRESHING>"));
344 void ServerListRowHandler::setTimeout()
346 QStandardItem *qstdItem;
350 qstdItem = item(IDServerName);
351 fillItem(qstdItem, tr(
"<NO RESPONSE>"));
353 item(COL_META)->setData(SGTimeout, ServerListModel::SLDT_SERVER_GROUP);
356 void ServerListRowHandler::setWait()
358 QStandardItem *qstdItem;
362 qstdItem = item(IDServerName);
363 fillItem(qstdItem, tr(
"<Refreshed too soon, wait a while and try again>"));
365 item(COL_META)->setData(SGWait, ServerListModel::SLDT_SERVER_GROUP);
368 ServerPtr ServerListRowHandler::serverFromList(
const ServerListModel *parentModel,
int rowIndex)
370 QStandardItem *pItem = parentModel->item(rowIndex, COL_META);
371 QVariant pointer = pItem->data(ServerListModel::SLDT_POINTER_TO_SERVER_STRUCTURE);
372 if (!pointer.isValid())
374 return pointer.value<ServerPtr>();
377 int ServerListRowHandler::updateServer()
380 fillPortIconColumn();
383 switch (d->server->lastResponse())
398 if (d->server->isKnown())
410 if (d->server->isRefreshing())
415 gLog << tr(
"Unknown server response (%1): %2:%3").arg(d->server->lastResponse())
416 .arg(d->server->address().toString()).arg(d->server->port());
420 setBackgroundColor();