23 #include "configuration/doomseekerconfig.h"    24 #include "cfgcustomservers.h"    25 #include "ui_cfgcustomservers.h"    26 #include "plugins/engineplugin.h"    27 #include "plugins/pluginloader.h"    28 #include <QHeaderView>    29 #include <QMessageBox>    30 #include <QStandardItemModel>    34 #include "unknownengine.xpm"    36 DClass<CFGCustomServers> : 
public Ui::CFGCustomServers
    47         connect(d->btnAdd, SIGNAL( clicked() ), 
this, SLOT( add() ));
    48         connect(d->btnRemove, SIGNAL( clicked() ), 
this, SLOT( 
remove() ));
    49         connect(d->btnSetEngine, SIGNAL( clicked() ), 
this, SLOT( setEngine() ));
    51         prepareEnginesComboBox();
    54 CFGCustomServers::~CFGCustomServers()
    58 void CFGCustomServers::add()
    60         int pluginIndex = d->cboEngines->itemData(d->cboEngines->currentIndex()).toInt();
    61         const EnginePlugin* plugin = gPlugins->info(pluginIndex);
    63         QString engineName = d->cboEngines->itemText(d->cboEngines->currentIndex());
    65         add(engineName, 
"", plugin->data()->defaultServerPort);
    68 void CFGCustomServers::add(
const QString& engineName, 
const QString& host, 
unsigned short port)
    70         QList<QStandardItem* > record;
    72         QStandardItem* engineItem = 
new QStandardItem();
    73         setEngineOnItem(engineItem, engineName);
    75         QString portString = QString::number(port);
    77         record.append(engineItem);
    78         record.append(
new QStandardItem(host));
    79         record.append(
new QStandardItem(portString));
    81         model->appendRow(record);
    82         d->tvServers->resizeRowsToContents();
    87         CheckAndFixPorts returnValue = AllOk;
    88         for (
int rowIndex = firstRow; rowIndex <= lastRow; ++rowIndex)
    90                 if (!isPortCorrect(rowIndex))
    92                         returnValue = AtLeastOneFixed;
    94                         setPortToDefault(rowIndex);
   101 void CFGCustomServers::dataChanged(
const QModelIndex& topLeft, 
const QModelIndex& bottomRight)
   103         const QString MESSAGE_TITLE = tr(
"Doomseeker - custom servers");
   105         int leftmostColumn = topLeft.column();
   106         int rightmostColumn = bottomRight.column();
   108         if ( isPortColumnWithingRange(leftmostColumn, rightmostColumn) )
   116                         case AtLeastOneFixed:
   117                                 QMessageBox::warning(
this, MESSAGE_TITLE, tr(
"Port must be within range 1 - 65535"));
   121                                 QMessageBox::warning(
this, MESSAGE_TITLE, tr(
"Unimplemented behavior!"));
   127 const EnginePlugin* CFGCustomServers::getPluginInfoForRow(
int rowIndex)
   129         QStandardItem* itemEngine = model->item(rowIndex, EngineColumnIndex);
   130         QString engineName = itemEngine->data().toString();
   131         int pluginIndex = gPlugins->pluginIndexFromName(engineName);
   132         return gPlugins->info(pluginIndex);
   135 bool CFGCustomServers::isPortColumnWithingRange(
int leftmostColumnIndex, 
int rightmostColumnIndex)
   137         return leftmostColumnIndex <= PortColumnIndex && rightmostColumnIndex >= PortColumnIndex;
   140 bool CFGCustomServers::isPortCorrect(
int rowIndex)
   142         const int MIN_PORT = 1;
   143         const int MAX_PORT = 65535;
   145         QStandardItem* item = model->item(rowIndex, PortColumnIndex);
   147         int port = item->text().toInt(&ok);
   149         return ok && port >= MIN_PORT && port <= MAX_PORT;
   152 void CFGCustomServers::prepareEnginesComboBox()
   154         d->cboEngines->clear();
   156         for (
unsigned i = 0; i < gPlugins->numPlugins(); ++i)
   159                 d->cboEngines->addItem(plugin->icon(), plugin->data()->name, i);
   162         if (d->cboEngines->count() > 0)
   164                 d->cboEngines->setCurrentIndex(0);
   168 void CFGCustomServers::prepareTable()
   170         model = 
new QStandardItemModel(
this);
   172         connect(model, SIGNAL( dataChanged(
const QModelIndex&, 
const QModelIndex&) ), 
this, SLOT( dataChanged(
const QModelIndex&, 
const QModelIndex&) ) );
   175         labels << 
"" << tr(
"Host") << tr(
"Port");
   176         model->setHorizontalHeaderLabels(labels);
   178         d->tvServers->setModel(model);
   180         d->tvServers->setColumnWidth(0, 23);
   181         d->tvServers->setColumnWidth(1, 180);
   182         d->tvServers->setColumnWidth(2, 60);
   184         d->tvServers->horizontalHeader()->setHighlightSections(
false);
   185 #if QT_VERSION >= 0x050000   186         d->tvServers->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
   188         d->tvServers->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
   191         d->tvServers->verticalHeader()->hide();
   198         QList<CustomServerInfo> customServersList = gConfig.doomseeker.customServers.toList();
   199         QList<CustomServerInfo>::iterator it;
   200         for (it = customServersList.begin(); it != customServersList.end(); ++it)
   202                 add(it->engine, it->host, it->port);
   206 void CFGCustomServers::remove()
   208         QItemSelectionModel* selModel = d->tvServers->selectionModel();
   209         QModelIndexList indexList = selModel->selectedRows();
   212         QList<QStandardItem*> itemList;
   213         for (
int i = 0; i < indexList.count(); ++i)
   215                 itemList << model->item(indexList[i].row(), 0);
   218         for (
int i = 0; i < itemList.count(); ++i)
   220                 QModelIndex index = model->indexFromItem(itemList[i]);
   221                 model->removeRow(index.row());
   227         gConfig.doomseeker.customServers = this->tableGetServers();
   230 void CFGCustomServers::setEngine()
   232         QItemSelectionModel* sel = d->tvServers->selectionModel();
   233         QModelIndexList indexList = sel->selectedRows();
   235         QModelIndexList::iterator it;
   236         for (it = indexList.begin(); it != indexList.end(); ++it)
   238                 QStandardItem* item = model->itemFromIndex(*it);
   239                 QString engineName = d->cboEngines->itemText(d->cboEngines->currentIndex());
   240                 setEngineOnItem(item, engineName);
   244 void CFGCustomServers::setEngineOnItem(QStandardItem* item, 
const QString& engineName)
   246         int engineId = gPlugins->pluginIndexFromName(engineName);
   248         item->setData(engineName);
   249         item->setToolTip(engineName);
   253                 item->setIcon(plugin->icon());
   257                 item->setIcon(QPixmap(unknownengine_xpm));
   260         item->setEditable(
false);
   264 void CFGCustomServers::setPortToDefault(
int rowIndex)
   266         const EnginePlugin* pluginInfo = getPluginInfoForRow(rowIndex);
   267         QString defaultPort = QString::number(pluginInfo->data()->defaultServerPort);
   269         QStandardItem* itemPort = model->item(rowIndex, PortColumnIndex);
   270         itemPort->setText(defaultPort);
   273 QVector<CustomServerInfo> CFGCustomServers::tableGetServers()
   275         QVector<CustomServerInfo> servers;
   276         for (
int i = 0; i < model->rowCount(); ++i)
   280                 QStandardItem* item = model->item(i, EngineColumnIndex);
   281                 customServer.engine = item->data().toString();
   283                 customServer.engineIndex = gPlugins->pluginIndexFromName(customServer.engine);
   285                 item = model->item(i, AddressColumnIndex);
   286                 customServer.host = item->text();
   288                 item = model->item(i, PortColumnIndex);
   289                 customServer.port = item->text().toUShort();
   291                 servers << customServer;
 
void readSettings()
Reimplement this to read settings from config into widgets. 
 
CheckAndFixPorts checkAndFixPorts(int firstRow, int lastRow)
Moves through rows and checks if network port information is correct. 
 
void saveSettings()
Reimplement this to write settings to config from widgets. 
 
Base class for configuration pages.