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->maxClients()));
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 (gConfig.doomseeker.bMarkServersWithBuddies &&
246 gApp->mainWindow() !=
nullptr &&
247 gApp->mainWindow()->buddiesList()->hasBuddy(d->server))
249 color = gConfig.doomseeker.buddyServersColor;
252 for (
int column = 0; column < NUM_SERVERLIST_COLUMNS; ++column)
254 QBrush brush = !color.isEmpty()
255 ? QBrush(QColor(color))
257 QStandardItem *pItem = item(column);
258 pItem->setBackground(brush);
262 void ServerListRowHandler::setBad()
264 QStandardItem *qstdItem;
268 qstdItem = item(IDServerName);
269 fillItem(qstdItem, tr(
"<ERROR>"));
271 item(COL_META)->setData(SGBad, ServerListModel::SLDT_SERVER_GROUP);
274 void ServerListRowHandler::setBanned()
276 QStandardItem *qstdItem;
280 qstdItem = item(IDServerName);
281 fillItem(qstdItem, tr(
"You are banned from this server!"));
283 item(COL_META)->setData(SGBanned, ServerListModel::SLDT_SERVER_GROUP);
286 void ServerListRowHandler::setCountryFlag()
288 item(IDServerName)->setIcon(d->flag());
291 void ServerListRowHandler::setFirstQuery()
293 item(COL_META)->setData(SGFirstQuery, ServerListModel::SLDT_SERVER_GROUP);
296 void ServerListRowHandler::setGood()
298 QStandardItem *qstdItem;
303 qstdItem = item(IDPing);
304 fillItem(qstdItem, d->server->ping());
306 qstdItem = item(IDServerName);
307 fillItem(qstdItem, d->server->name());
309 qstdItem = item(IDIwad);
310 fillItem(qstdItem, d->server->iwad());
312 qstdItem = item(IDMap);
313 fillItem(qstdItem, d->server->map());
316 for (
const PWad &wad : d->server->wads())
318 if (wad.isOptional())
319 strTmp += QString(
"[%1] ").arg(wad.name());
321 strTmp += wad.name() +
" ";
324 qstdItem = item(IDWads);
325 fillItem(qstdItem, strTmp);
327 qstdItem = item(IDGametype);
328 QString fullGameModeName = d->server->gameMode().name();
329 QStringList modifierNames = extractValidGameCVarNames(d->server->modifiers());
330 if (!modifierNames.isEmpty())
331 fullGameModeName += QString(
" (%1)").arg(modifierNames.join(
", "));
332 fillItem(qstdItem, fullGameModeName);
334 item(COL_META)->setData(SGNormal, ServerListModel::SLDT_SERVER_GROUP);
337 void ServerListRowHandler::setRefreshing()
339 QStandardItem *qstdItem = item(IDServerName);
340 qstdItem->setText(tr(
"<REFRESHING>"));
343 void ServerListRowHandler::setTimeout()
345 QStandardItem *qstdItem;
349 qstdItem = item(IDServerName);
350 fillItem(qstdItem, tr(
"<NO RESPONSE>"));
352 item(COL_META)->setData(SGTimeout, ServerListModel::SLDT_SERVER_GROUP);
355 void ServerListRowHandler::setWait()
357 QStandardItem *qstdItem;
361 qstdItem = item(IDServerName);
362 fillItem(qstdItem, tr(
"<Refreshed too soon, wait a while and try again>"));
364 item(COL_META)->setData(SGWait, ServerListModel::SLDT_SERVER_GROUP);
367 ServerPtr ServerListRowHandler::serverFromList(
const ServerListModel *parentModel,
int rowIndex)
369 QStandardItem *pItem = parentModel->item(rowIndex, COL_META);
370 if (pItem ==
nullptr)
372 QVariant pointer = pItem->data(ServerListModel::SLDT_POINTER_TO_SERVER_STRUCTURE);
373 if (!pointer.isValid())
375 return pointer.value<ServerPtr>();
378 int ServerListRowHandler::updateServer()
381 fillPortIconColumn();
384 switch (d->server->lastResponse())
399 if (d->server->isKnown())
411 if (d->server->isRefreshing())
416 gLog << tr(
"Unknown server response (%1): %2:%3").arg(d->server->lastResponse())
417 .arg(d->server->address().toString()).arg(d->server->port());
421 setBackgroundColor();