cfgircnetworks.cpp
1 //------------------------------------------------------------------------------
2 // cfgircnetworks.cpp
3 //------------------------------------------------------------------------------
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 // 02110-1301, USA.
19 //
20 //------------------------------------------------------------------------------
21 // Copyright (C) 2010 "Zalewa" <zalewapl@gmail.com>
22 //------------------------------------------------------------------------------
23 #include "cfgircnetworks.h"
24 #include "ui_cfgircnetworks.h"
25 #include "gui/configuration/irc/cfgircdefinenetworkdialog.h"
26 #include "irc/configuration/chatnetworkscfg.h"
27 #include "irc/configuration/ircconfig.h"
28 #include "irc/entities/ircnetworkentity.h"
29 #include "irc/chatlogs.h"
30 #include "qtmetapointer.h"
31 #include <QItemDelegate>
32 #include <QStandardItemModel>
33 
34 DClass<CFGIRCNetworks> : public Ui::CFGIRCNetworks
35 {
36 };
37 
38 DPointered(CFGIRCNetworks)
39 
40 CFGIRCNetworks::CFGIRCNetworks(QWidget* parent)
41 : ConfigurationBaseBox(parent)
42 {
43  d->setupUi(this);
44 
45  connect(d->btnAdd, SIGNAL( clicked() ), this, SLOT( addButtonClicked() ) );
46  connect(d->btnEdit, SIGNAL( clicked() ), this, SLOT( editButtonClicked() ) );
47  connect(d->btnRemove, SIGNAL( clicked() ), this, SLOT( removeButtonClicked() ) );
48  connect(d->gridNetworks, SIGNAL( doubleClicked(const QModelIndex&) ), SLOT( tableDoubleClicked(const QModelIndex&) ) );
49 
50  // Crash prevention measure.
51  d->gridNetworks->setModel(new QStandardItemModel(this));
52 }
53 
54 CFGIRCNetworks::~CFGIRCNetworks()
55 {
56  cleanUpTable();
57 }
58 
59 void CFGIRCNetworks::addButtonClicked()
60 {
61  CFGIRCDefineNetworkDialog dialog(this);
62  dialog.setExistingNetworks(networksAsQList());
63  if (dialog.exec() == QDialog::Accepted)
64  {
65  IRCNetworkEntity* pNetworkEntity = new IRCNetworkEntity();
66  *pNetworkEntity = dialog.getNetworkEntity();
67 
68  addRecord(pNetworkEntity);
69  saveNetworks();
70  }
71 }
72 
73 void CFGIRCNetworks::addRecord(IRCNetworkEntity* pNetworkEntity)
74 {
75  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
76  pModel->appendRow(generateTableRecord(pNetworkEntity));
77 
78  this->d->gridNetworks->resizeRowsToContents();
79 
80  if (this->d->gridNetworks->model()->rowCount() == 1)
81  {
82  this->d->gridNetworks->resizeColumnToContents(0);
83  }
84 }
85 
86 void CFGIRCNetworks::cleanUpTable()
87 {
88  QVector<IRCNetworkEntity*> networksArray = networks();
89  foreach (IRCNetworkEntity* pEntity, networksArray)
90  {
91  delete pEntity;
92  }
93 }
94 
95 void CFGIRCNetworks::editButtonClicked()
96 {
97  IRCNetworkEntity* pNetwork = this->selectedNetwork();
98  if (pNetwork != NULL)
99  {
100  CFGIRCDefineNetworkDialog dialog(*pNetwork, this);
101  dialog.setExistingNetworks(networksAsQList());
102  if (dialog.exec() == QDialog::Accepted)
103  {
104  IRCNetworkEntity editedNetwork = dialog.getNetworkEntity();
105  if (ChatLogs().renameNetwork(this, pNetwork->description(), editedNetwork.description()))
106  {
107  *pNetwork = dialog.getNetworkEntity();
108  this->updateRecord(this->selectedRow());
109  saveNetworks();
110  }
111  }
112  }
113 }
114 
115 QList<QStandardItem*> CFGIRCNetworks::generateTableRecord(IRCNetworkEntity* pNetworkEntity)
116 {
117  QList<QStandardItem*> itemArray;
118  QStandardItem* pItem;
119 
120  // Boolean item.
121  pItem = new QStandardItem();
122  pItem->setCheckable(true);
123  pItem->setCheckState(pNetworkEntity->isAutojoinNetwork() ? Qt::Checked : Qt::Unchecked);
124  pItem->setToolTip("Autojoin?");
125  itemArray << pItem;
126 
127  void* pointer = pNetworkEntity;
128  QtMetaPointer metaPointer = pointer;
129  QVariant variantPointer = qVariantFromValue(metaPointer);
130  pItem->setData(variantPointer);
131 
132  pItem = new QStandardItem(pNetworkEntity->description());
133  itemArray << pItem;
134 
135  pItem = new QStandardItem(QString("%1:%2").arg(pNetworkEntity->address())
136  .arg(pNetworkEntity->port()));
137 
138  itemArray << pItem;
139 
140  return itemArray;
141 }
142 
143 IRCNetworkEntity* CFGIRCNetworks::network(int row) const
144 {
145  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
146  IRCNetworkEntity* pNetwork = obtainNetworkEntity(pModel->item(row));
147  pNetwork->setAutojoinNetwork((pModel->item(row, 0)->checkState() == Qt::Checked));
148 
149  return pNetwork;
150 }
151 
152 QVector<IRCNetworkEntity*> CFGIRCNetworks::networks()
153 {
154  QVector<IRCNetworkEntity*> entityArray;
155 
156  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
157  for (int i = 0; i < pModel->rowCount(); ++i)
158  {
159  IRCNetworkEntity* pEntity = this->network(i);
160 
161  entityArray << pEntity;
162  }
163 
164  return entityArray;
165 }
166 
167 QList<IRCNetworkEntity> CFGIRCNetworks::networksAsQList() const
168 {
169  QList<IRCNetworkEntity> result;
170  for (int row = 0; row < d->gridNetworks->model()->rowCount(); ++row)
171  {
172  result << *network(row);
173  }
174  return result;
175 }
176 
177 IRCNetworkEntity* CFGIRCNetworks::obtainNetworkEntity(QStandardItem* pItem) const
178 {
179  QtMetaPointer metaPointer = qVariantValue<QtMetaPointer>(pItem->data());
180  void* pointer = metaPointer;
181  IRCNetworkEntity* pEntity = (IRCNetworkEntity*)pointer;
182 
183  return pEntity;
184 }
185 
186 void CFGIRCNetworks::prepareTable()
187 {
188  cleanUpTable();
189 
190  QStandardItemModel* pModel = new QStandardItemModel(this);
191 
192  QStringList labels;
193  labels << "" << tr("Description") << tr("Address");
194  pModel->setHorizontalHeaderLabels(labels);
195 
196  d->gridNetworks->setModel(pModel);
197 
198  d->gridNetworks->setColumnWidth(1, 180);
199  d->gridNetworks->setColumnWidth(2, 180);
200 
201  d->gridNetworks->horizontalHeader()->setHighlightSections(false);
202  d->gridNetworks->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
203 
204  d->gridNetworks->verticalHeader()->hide();
205 }
206 
208 {
209  prepareTable();
210 
211  QList<IRCNetworkEntity> cfgNetworks = ChatNetworksCfg().networks();
212  for (int i = 0; i < cfgNetworks.size(); ++i)
213  {
214  // Remember that pointers are stored within the table.
215  IRCNetworkEntity* pCopy = new IRCNetworkEntity();
216  *pCopy = cfgNetworks[i];
217 
218  addRecord(pCopy);
219  }
220 
221  d->leQuitMessage->setText(gIRCConfig.personal.quitMessage);
222 }
223 
224 void CFGIRCNetworks::removeButtonClicked()
225 {
226  int row = this->selectedRow();
227 
228  if (row >= 0)
229  {
230  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
231  pModel->removeRow(row);
232  }
233 }
234 
235 void CFGIRCNetworks::saveNetworks()
236 {
237  ChatNetworksCfg().setNetworks(networksAsQList());
238 }
239 
241 {
242  saveNetworks();
243 
244  gIRCConfig.personal.quitMessage = d->leQuitMessage->text().trimmed();
245 }
246 
247 IRCNetworkEntity* CFGIRCNetworks::selectedNetwork()
248 {
249  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
250  QItemSelectionModel* pSelectionModel = d->gridNetworks->selectionModel();
251  QModelIndexList indexList = pSelectionModel->selectedRows();
252 
253  if (!indexList.empty())
254  {
255  QModelIndex index = indexList[0];
256  return network(index.row());
257  }
258 
259  return NULL;
260 }
261 
262 int CFGIRCNetworks::selectedRow()
263 {
264  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
265  QItemSelectionModel* pSelectionModel = d->gridNetworks->selectionModel();
266  QModelIndexList indexList = pSelectionModel->selectedRows();
267 
268  if (!indexList.empty())
269  {
270  return indexList[0].row();
271  }
272 
273  return -1;
274 }
275 
276 void CFGIRCNetworks::tableDoubleClicked(const QModelIndex& index)
277 {
278  editButtonClicked();
279 }
280 
281 void CFGIRCNetworks::updateRecord(int row)
282 {
283  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
284  QStandardItem* pItemDescription = pModel->item(row, 1);
285 
286  IRCNetworkEntity* pNetwork = this->network(row);
287 
288  pItemDescription->setText(pNetwork->description());
289 
290  QStandardItem* pItemAddress = pModel->item(row, 2);
291  pItemAddress->setText(QString("%1:%2").arg(pNetwork->address()).arg(pNetwork->port()));
292 
293  this->d->gridNetworks->resizeRowsToContents();
294 }
unsigned short port() const
Port of the server or network to connect to.
const QString & description() const
A short, human-readable description for the network. (Preferably a single word).
bool isAutojoinNetwork() const
Join this network when Doomseeker starts up.
void saveSettings()
Reimplement this to write settings to config from widgets.
void readSettings()
Reimplement this to read settings from config into widgets.
Data structure that describes and defines a connection to an IRC network or server.
Base class for configuration pages.
const QString & address() const
Address of the server or network to connect to.