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();