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.