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 : ConfigPage(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 = pItem->data().value<QtMetaPointer>();
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 #if QT_VERSION >= 0x050000
203  d->gridNetworks->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
204 #else
205  d->gridNetworks->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
206 #endif
207 
208  d->gridNetworks->verticalHeader()->hide();
209 }
210 
212 {
213  prepareTable();
214 
215  QList<IRCNetworkEntity> cfgNetworks = ChatNetworksCfg().networks();
216  for (int i = 0; i < cfgNetworks.size(); ++i)
217  {
218  // Remember that pointers are stored within the table.
219  IRCNetworkEntity* pCopy = new IRCNetworkEntity();
220  *pCopy = cfgNetworks[i];
221 
222  addRecord(pCopy);
223  }
224 
225  d->leQuitMessage->setText(gIRCConfig.personal.quitMessage);
226 }
227 
228 void CFGIRCNetworks::removeButtonClicked()
229 {
230  int row = this->selectedRow();
231 
232  if (row >= 0)
233  {
234  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
235  pModel->removeRow(row);
236  }
237 }
238 
239 void CFGIRCNetworks::saveNetworks()
240 {
241  ChatNetworksCfg().setNetworks(networksAsQList());
242 }
243 
245 {
246  saveNetworks();
247 
248  gIRCConfig.personal.quitMessage = d->leQuitMessage->text().trimmed();
249 }
250 
251 IRCNetworkEntity* CFGIRCNetworks::selectedNetwork()
252 {
253  QItemSelectionModel* pSelectionModel = d->gridNetworks->selectionModel();
254  QModelIndexList indexList = pSelectionModel->selectedRows();
255 
256  if (!indexList.empty())
257  {
258  QModelIndex index = indexList[0];
259  return network(index.row());
260  }
261 
262  return NULL;
263 }
264 
265 int CFGIRCNetworks::selectedRow()
266 {
267  QItemSelectionModel* pSelectionModel = d->gridNetworks->selectionModel();
268  QModelIndexList indexList = pSelectionModel->selectedRows();
269 
270  if (!indexList.empty())
271  {
272  return indexList[0].row();
273  }
274 
275  return -1;
276 }
277 
278 void CFGIRCNetworks::tableDoubleClicked(const QModelIndex& index)
279 {
280  editButtonClicked();
281 }
282 
283 void CFGIRCNetworks::updateRecord(int row)
284 {
285  QStandardItemModel* pModel = (QStandardItemModel*)d->gridNetworks->model();
286  QStandardItem* pItemDescription = pModel->item(row, 1);
287 
288  IRCNetworkEntity* pNetwork = this->network(row);
289 
290  pItemDescription->setText(pNetwork->description());
291 
292  QStandardItem* pItemAddress = pModel->item(row, 2);
293  pItemAddress->setText(QString("%1:%2").arg(pNetwork->address()).arg(pNetwork->port()));
294 
295  this->d->gridNetworks->resizeRowsToContents();
296 }
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.
const QString & address() const
Address of the server or network to connect to.
Base class for configuration pages.
Definition: configpage.h:43