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.