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" 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(), DTSort);
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, DTSort);
107 void ServerListRowHandler::fillItem(QStandardItem *item,
int sort,
const QString &str)
112 item->setData(sort, DTSort);
115 void ServerListRowHandler::fillItem(QStandardItem *item,
int num)
119 item->setData(var, Qt::DisplayRole);
120 item->setData(var, DTSort);
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, DTSort);
134 void ServerListRowHandler::fillItem(QStandardItem *item,
const QString &sort,
const QPixmap &icon)
136 item->setIcon(QIcon(icon));
137 item->setData(sort, DTSort);
140 void ServerListRowHandler::fillItem(QStandardItem *item,
int sort,
const QPixmap &image)
142 item->setData(image, Qt::DecorationRole);
143 item->setData(sort, DTSort);
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::fillServerPointerColumn()
206 QStandardItem *pItem = item(IDHiddenServerPointer);
207 QVariant savePointer = qVariantFromValue(d->server);
208 pItem->setData(savePointer, DTPointerToServerStructure);
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 qstdItem = item(IDHiddenGroup);
263 fillItem(qstdItem, SGBad);
266 void ServerListRowHandler::setBanned()
268 QStandardItem *qstdItem;
272 qstdItem = item(IDServerName);
273 fillItem(qstdItem, tr(
"You are banned from this server!"));
275 qstdItem = item(IDHiddenGroup);
276 fillItem(qstdItem, SGBanned);
279 void ServerListRowHandler::setCountryFlag()
281 QStandardItem *pItem = item(IDServerName);
283 if (!IP2C::instance()->isDataAccessLocked())
286 if (countryInfo.isValid())
288 QPixmap flag = *countryInfo.flag;
289 pItem->setIcon(flag);
294 void ServerListRowHandler::setFirstQuery()
296 QStandardItem *qstdItem = item(IDHiddenGroup);
297 fillItem(qstdItem, SGFirstQuery);
300 void ServerListRowHandler::setGood()
302 QStandardItem *qstdItem;
307 qstdItem = item(IDPing);
308 fillItem(qstdItem, d->server->ping());
310 qstdItem = item(IDServerName);
311 fillItem(qstdItem, d->server->name());
313 qstdItem = item(IDIwad);
314 fillItem(qstdItem, d->server->iwad());
316 qstdItem = item(IDMap);
317 fillItem(qstdItem, d->server->map());
320 for (
const PWad &wad : d->server->wads())
322 if (wad.isOptional())
323 strTmp += QString(
"[%1] ").arg(wad.name());
325 strTmp += wad.name() +
" ";
328 qstdItem = item(IDWads);
329 fillItem(qstdItem, strTmp);
331 qstdItem = item(IDGametype);
332 QString fullGameModeName = d->server->gameMode().name();
333 QStringList modifierNames = extractValidGameCVarNames(d->server->modifiers());
334 if (!modifierNames.isEmpty())
335 fullGameModeName += QString(
" (%1)").arg(modifierNames.join(
", "));
336 fillItem(qstdItem, fullGameModeName);
338 qstdItem = item(IDHiddenGroup);
339 fillItem(qstdItem, SGNormal);
342 void ServerListRowHandler::setRefreshing()
344 QStandardItem *qstdItem = item(IDServerName);
345 qstdItem->setText(tr(
"<REFRESHING>"));
348 void ServerListRowHandler::setTimeout()
350 QStandardItem *qstdItem;
354 qstdItem = item(IDServerName);
355 fillItem(qstdItem, tr(
"<NO RESPONSE>"));
357 qstdItem = item(IDHiddenGroup);
358 fillItem(qstdItem, SGTimeout);
361 void ServerListRowHandler::setWait()
363 QStandardItem *qstdItem;
367 qstdItem = item(IDServerName);
368 fillItem(qstdItem, tr(
"<Refreshed too soon, wait a while and try again>"));
370 qstdItem = item(IDHiddenGroup);
371 fillItem(qstdItem, SGWait);
374 ServerPtr ServerListRowHandler::serverFromList(
const ServerListModel *parentModel,
int rowIndex)
376 QStandardItem *pItem = parentModel->item(rowIndex, IDHiddenServerPointer);
377 QVariant pointer = pItem->data(DTPointerToServerStructure);
378 if (!pointer.isValid())
380 return pointer.value<ServerPtr>();
383 int ServerListRowHandler::updateServer()
385 fillServerPointerColumn();
386 fillPortIconColumn();
389 switch (d->server->lastResponse())
404 if (d->server->isKnown())
416 if (d->server->isRefreshing())
421 gLog << tr(
"Unknown server response (%1): %2:%3").arg(d->server->lastResponse())
422 .arg(d->server->address().toString()).arg(d->server->port());
426 setBackgroundColor();
IP2CCountryInfo obtainCountryInfo(unsigned int ipaddress)
void clearNonVitalFields()
Player is banned from that server.
"Dummy" response for servers that weren't refreshed yet.
Response from the server was erroneous.
Response was parsed properly and Server information is available.
Flag and name of the country.
Server didn't respond at all.
int numClients() const
Overall number of people and bots on the server.
A general game setting or variable (like fraglimit).
Server responded with "wait", may happen when we refresh too quickly.