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>
49 IP2C *ip2c = IP2C::instance();
50 const IP2CCountry countryInfo = ip2c->countryInfoForServer(*server);
51 return (countryInfo.isValid() && countryInfo.flag !=
nullptr) ?
52 *countryInfo.flag : ip2c->flagUnknown;
59 int rowIndex, const ServerPtr &server)
60 : model(parentModel), row(rowIndex)
65 ServerListRowHandler::ServerListRowHandler(
ServerListModel *parentModel,
int rowIndex)
66 : model(parentModel), row(rowIndex)
68 d->server = serverFromList(parentModel, rowIndex);
71 ServerListRowHandler::~ServerListRowHandler()
77 for (
int i = 0; i < NUM_SERVERLIST_COLUMNS; ++i)
79 if (!ServerListColumns::isColumnVital(i))
84 void ServerListRowHandler::emptyItem(QStandardItem *item)
86 item->setData(
"", Qt::DisplayRole);
87 item->setData(QVariant(), Qt::DecorationRole);
88 item->setData(QVariant(), ServerListModel::SLDT_SORT);
91 QStringList ServerListRowHandler::extractValidGameCVarNames(
const QList<GameCVar> &cvars)
97 result << cvar.name();
102 void ServerListRowHandler::fillAddressColumn()
104 QStandardItem *pItem = item(IDAddress);
105 fillItem(pItem, d->server->address(), d->server->hostName());
108 void ServerListRowHandler::fillItem(QStandardItem *item,
const QString &str)
110 QString strLowcase = str.toLower();
111 item->setData(str, Qt::DisplayRole);
112 item->setData(strLowcase, ServerListModel::SLDT_SORT);
115 void ServerListRowHandler::fillItem(QStandardItem *item,
int sort,
const QString &str)
120 item->setData(sort, ServerListModel::SLDT_SORT);
123 void ServerListRowHandler::fillItem(QStandardItem *item,
int num)
127 item->setData(var, Qt::DisplayRole);
128 item->setData(var, ServerListModel::SLDT_SORT);
131 void ServerListRowHandler::fillItem(QStandardItem *item,
const QHostAddress &addr,
const QString &actualDisplay)
133 QVariant var = addr.toIPv4Address();
135 if (actualDisplay.isEmpty())
136 item->setData(addr.toString(), Qt::DisplayRole);
138 item->setData(actualDisplay, Qt::DisplayRole);
139 item->setData(var, ServerListModel::SLDT_SORT);
142 void ServerListRowHandler::fillItem(QStandardItem *item,
const QString &sort,
const QPixmap &icon)
144 item->setIcon(QIcon(icon));
145 item->setData(sort, ServerListModel::SLDT_SORT);
148 void ServerListRowHandler::fillItem(QStandardItem *item,
int sort,
const QPixmap &image)
150 item->setData(image, Qt::DecorationRole);
151 item->setData(sort, ServerListModel::SLDT_SORT);
154 void ServerListRowHandler::fillPlayerColumn()
156 QStandardItem *pItem = item(IDPlayers);
158 QString style = gConfig.doomseeker.slotStyle;
159 bool botsAreNotPlayers = gConfig.doomseeker.bBotsAreNotPlayers;
164 if (botsAreNotPlayers)
165 sortValue = players.numClientsWithoutBots();
169 if (!PlayersDiagram::isNumericStyle(style))
173 fillItem(pItem, sortValue, QString(
"%1/%2").arg(players.
numClients())
174 .arg(d->server->numTotalSlots()));
178 pItem->setData(QVariant(QVariant::Invalid), PlayersDiagram::isNumericStyle(style) ? Qt::DecorationRole : Qt::DisplayRole);
179 pItem->setData(PlayersDiagram::isNumericStyle(style) ? 0 : USERROLE_RIGHTALIGNDECORATION, Qt::UserRole);
182 void ServerListRowHandler::fillPortIconColumn()
184 QStandardItem *pItem = item(IDPort);
185 QPixmap icon = d->server->icon();
186 if (d->server->isKnown())
188 if (d->server->isLockedAnywhere())
190 QPainter iconPainter(&icon);
191 iconPainter.drawPixmap(0, 0, QPixmap(
":/locked.png"));
194 else if (d->server->isSecure())
196 QPainter iconPainter(&icon);
197 iconPainter.drawPixmap(0, 0, QPixmap(
":/shield.png"));
202 if (d->server->isTestingServer())
204 QPainter iconPainter(&icon);
205 iconPainter.drawPixmap(0, 0, QPixmap(
":/t.png"));
209 fillItem(pItem, d->server->metaObject()->className(), icon);
212 void ServerListRowHandler::fillServerPointer()
214 QStandardItem *pItem = item(COL_META);
215 QVariant savePointer = QVariant::fromValue(d->server);
216 pItem->setData(savePointer, ServerListModel::SLDT_POINTER_TO_SERVER_STRUCTURE);
219 QStandardItem *ServerListRowHandler::item(
int columnIndex)
221 return model->item(row, columnIndex);
224 void ServerListRowHandler::redraw()
233 ServerPtr ServerListRowHandler::server()
238 void ServerListRowHandler::setBackgroundColor()
241 if (d->server->isCustom())
242 color = gConfig.doomseeker.customServersColor;
243 else if (d->server->isLan())
244 color = gConfig.doomseeker.lanServersColor;
245 else if (gApp->mainWindow()->buddiesList()->hasBuddy(d->server))
247 if (gConfig.doomseeker.bMarkServersWithBuddies)
248 color = gConfig.doomseeker.buddyServersColor;
251 for (
int column = 0; column < NUM_SERVERLIST_COLUMNS; ++column)
253 QBrush brush = !color.isEmpty()
254 ? QBrush(QColor(color))
256 QStandardItem *pItem = item(column);
257 pItem->setBackground(brush);
261 void ServerListRowHandler::setBad()
263 QStandardItem *qstdItem;
267 qstdItem = item(IDServerName);
268 fillItem(qstdItem, tr(
"<ERROR>"));
270 item(COL_META)->setData(SGBad, ServerListModel::SLDT_SERVER_GROUP);
273 void ServerListRowHandler::setBanned()
275 QStandardItem *qstdItem;
279 qstdItem = item(IDServerName);
280 fillItem(qstdItem, tr(
"You are banned from this server!"));
282 item(COL_META)->setData(SGBanned, ServerListModel::SLDT_SERVER_GROUP);
285 void ServerListRowHandler::setCountryFlag()
287 item(IDServerName)->setIcon(d->flag());
290 void ServerListRowHandler::setFirstQuery()
292 item(COL_META)->setData(SGFirstQuery, ServerListModel::SLDT_SERVER_GROUP);
295 void ServerListRowHandler::setGood()
297 QStandardItem *qstdItem;
302 qstdItem = item(IDPing);
303 fillItem(qstdItem, d->server->ping());
305 qstdItem = item(IDServerName);
306 fillItem(qstdItem, d->server->name());
308 qstdItem = item(IDIwad);
309 fillItem(qstdItem, d->server->iwad());
311 qstdItem = item(IDMap);
312 fillItem(qstdItem, d->server->map());
315 for (
const PWad &wad : d->server->wads())
317 if (wad.isOptional())
318 strTmp += QString(
"[%1] ").arg(wad.name());
320 strTmp += wad.name() +
" ";
323 qstdItem = item(IDWads);
324 fillItem(qstdItem, strTmp);
326 qstdItem = item(IDGametype);
327 QString fullGameModeName = d->server->gameMode().name();
328 QStringList modifierNames = extractValidGameCVarNames(d->server->modifiers());
329 if (!modifierNames.isEmpty())
330 fullGameModeName += QString(
" (%1)").arg(modifierNames.join(
", "));
331 fillItem(qstdItem, fullGameModeName);
333 item(COL_META)->setData(SGNormal, ServerListModel::SLDT_SERVER_GROUP);
336 void ServerListRowHandler::setRefreshing()
338 QStandardItem *qstdItem = item(IDServerName);
339 qstdItem->setText(tr(
"<REFRESHING>"));
342 void ServerListRowHandler::setTimeout()
344 QStandardItem *qstdItem;
348 qstdItem = item(IDServerName);
349 fillItem(qstdItem, tr(
"<NO RESPONSE>"));
351 item(COL_META)->setData(SGTimeout, ServerListModel::SLDT_SERVER_GROUP);
354 void ServerListRowHandler::setWait()
356 QStandardItem *qstdItem;
360 qstdItem = item(IDServerName);
361 fillItem(qstdItem, tr(
"<Refreshed too soon, wait a while and try again>"));
363 item(COL_META)->setData(SGWait, ServerListModel::SLDT_SERVER_GROUP);
366 ServerPtr ServerListRowHandler::serverFromList(
const ServerListModel *parentModel,
int rowIndex)
368 QStandardItem *pItem = parentModel->item(rowIndex, COL_META);
369 QVariant pointer = pItem->data(ServerListModel::SLDT_POINTER_TO_SERVER_STRUCTURE);
370 if (!pointer.isValid())
372 return pointer.value<ServerPtr>();
375 int ServerListRowHandler::updateServer()
378 fillPortIconColumn();
381 switch (d->server->lastResponse())
396 if (d->server->isKnown())
408 if (d->server->isRefreshing())
413 gLog << tr(
"Unknown server response (%1): %2:%3").arg(d->server->lastResponse())
414 .arg(d->server->address().toString()).arg(d->server->port());
418 setBackgroundColor();