cfgircnetworks.cpp
1 //------------------------------------------------------------------------------
2 // cfgircnetworks.cpp
3 //------------------------------------------------------------------------------
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library 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 GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; 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 "gui/configuration/irc/cfgircdefinenetworkdialog.h"
25 #include "irc/chatlogs.h"
26 #include "irc/configuration/chatnetworkscfg.h"
27 #include "irc/configuration/ircconfig.h"
28 #include "irc/entities/ircnetworkentity.h"
29 #include "qtmetapointer.h"
30 #include "ui_cfgircnetworks.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()));
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  auto pNetworkEntity = new IRCNetworkEntity();
66  *pNetworkEntity = dialog.getNetworkEntity();
67 
68  addRecord(pNetworkEntity);
69  saveNetworks();
70  }
71 }
72 
73 void CFGIRCNetworks::addRecord(IRCNetworkEntity *pNetworkEntity)
74 {
75  auto 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  this->d->gridNetworks->resizeColumnToContents(0);
82 }
83 
84 void CFGIRCNetworks::cleanUpTable()
85 {
86  QVector<IRCNetworkEntity *> networksArray = networks();
87  for (IRCNetworkEntity *pEntity : networksArray)
88  {
89  delete pEntity;
90  }
91 }
92 
93 void CFGIRCNetworks::editButtonClicked()
94 {
95  IRCNetworkEntity *pNetwork = this->selectedNetwork();
96  if (pNetwork != nullptr)
97  {
98  CFGIRCDefineNetworkDialog dialog(*pNetwork, this);
99  dialog.setExistingNetworks(networksAsQList());
100  if (dialog.exec() == QDialog::Accepted)
101  {
102  IRCNetworkEntity editedNetwork = dialog.getNetworkEntity();
103  if (ChatLogs().renameNetwork(this, pNetwork->description(), editedNetwork.description()))
104  {
105  *pNetwork = dialog.getNetworkEntity();
106  this->updateRecord(this->selectedRow());
107  saveNetworks();
108  }
109  }
110  }
111 }
112 
113 QList<QStandardItem *> CFGIRCNetworks::generateTableRecord(IRCNetworkEntity *pNetworkEntity)
114 {
115  QList<QStandardItem *> itemArray;
116  QStandardItem *pItem;
117 
118  // Boolean item.
119  pItem = new QStandardItem();
120  pItem->setCheckable(true);
121  pItem->setCheckState(pNetworkEntity->isAutojoinNetwork() ? Qt::Checked : Qt::Unchecked);
122  pItem->setToolTip("Autojoin?");
123  itemArray << pItem;
124 
125  void *pointer = pNetworkEntity;
126  QtMetaPointer metaPointer = pointer;
127  QVariant variantPointer = QVariant::fromValue(metaPointer);
128  pItem->setData(variantPointer);
129 
130  pItem = new QStandardItem(pNetworkEntity->description());
131  itemArray << pItem;
132 
133  pItem = new QStandardItem(QString("%1:%2").arg(pNetworkEntity->address())
134  .arg(pNetworkEntity->port()));
135 
136  itemArray << pItem;
137 
138  return itemArray;
139 }
140 
141 IRCNetworkEntity *CFGIRCNetworks::network(int row) const
142 {
143  auto pModel = (QStandardItemModel *)d->gridNetworks->model();
144  IRCNetworkEntity *pNetwork = obtainNetworkEntity(pModel->item(row));
145  pNetwork->setAutojoinNetwork((pModel->item(row, 0)->checkState() == Qt::Checked));
146 
147  return pNetwork;
148 }
149 
150 QVector<IRCNetworkEntity *> CFGIRCNetworks::networks()
151 {
152  QVector<IRCNetworkEntity *> entityArray;
153 
154  auto pModel = (QStandardItemModel *)d->gridNetworks->model();
155  for (int i = 0; i < pModel->rowCount(); ++i)
156  {
157  IRCNetworkEntity *pEntity = this->network(i);
158 
159  entityArray << pEntity;
160  }
161 
162  return entityArray;
163 }
164 
165 QList<IRCNetworkEntity> CFGIRCNetworks::networksAsQList() const
166 {
167  QList<IRCNetworkEntity> result;
168  for (int row = 0; row < d->gridNetworks->model()->rowCount(); ++row)
169  result << *network(row);
170  return result;
171 }
172 
173 IRCNetworkEntity *CFGIRCNetworks::obtainNetworkEntity(QStandardItem *pItem) const
174 {
175  QtMetaPointer metaPointer = pItem->data().value<QtMetaPointer>();
176  void *pointer = metaPointer;
177  auto pEntity = (IRCNetworkEntity *)pointer;
178 
179  return pEntity;
180 }
181 
182 void CFGIRCNetworks::prepareTable()
183 {
184  cleanUpTable();
185 
186  auto pModel = new QStandardItemModel(this);
187 
188  QStringList labels;
189  labels << "" << tr("Description") << tr("Address");
190  pModel->setHorizontalHeaderLabels(labels);
191 
192  d->gridNetworks->setModel(pModel);
193 
194  d->gridNetworks->setColumnWidth(1, 180);
195  d->gridNetworks->setColumnWidth(2, 180);
196 
197  d->gridNetworks->horizontalHeader()->setHighlightSections(false);
198  d->gridNetworks->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
199 
200  d->gridNetworks->verticalHeader()->hide();
201 }
202 
204 {
205  prepareTable();
206 
207  QList<IRCNetworkEntity> cfgNetworks = ChatNetworksCfg().networks();
208  for (const auto &cfgNetwork : cfgNetworks)
209  {
210  // Remember that pointers are stored within the table.
211  auto pCopy = new IRCNetworkEntity();
212  *pCopy = cfgNetwork;
213 
214  addRecord(pCopy);
215  }
216 
217  d->leQuitMessage->setText(gIRCConfig.personal.quitMessage);
218 }
219 
220 void CFGIRCNetworks::removeButtonClicked()
221 {
222  int row = this->selectedRow();
223 
224  if (row >= 0)
225  {
226  auto pModel = (QStandardItemModel *)d->gridNetworks->model();
227  pModel->removeRow(row);
228  }
229 }
230 
231 void CFGIRCNetworks::saveNetworks()
232 {
233  ChatNetworksCfg().setNetworks(networksAsQList());
234 }
235 
237 {
238  saveNetworks();
239 
240  gIRCConfig.personal.quitMessage = d->leQuitMessage->text().trimmed();
241 }
242 
243 IRCNetworkEntity *CFGIRCNetworks::selectedNetwork()
244 {
245  QItemSelectionModel *pSelectionModel = d->gridNetworks->selectionModel();
246  QModelIndexList indexList = pSelectionModel->selectedRows();
247 
248  if (!indexList.empty())
249  {
250  QModelIndex index = indexList[0];
251  return network(index.row());
252  }
253 
254  return nullptr;
255 }
256 
257 int CFGIRCNetworks::selectedRow()
258 {
259  QItemSelectionModel *pSelectionModel = d->gridNetworks->selectionModel();
260  QModelIndexList indexList = pSelectionModel->selectedRows();
261 
262  if (!indexList.empty())
263  return indexList[0].row();
264 
265  return -1;
266 }
267 
268 void CFGIRCNetworks::tableDoubleClicked()
269 {
270  editButtonClicked();
271 }
272 
273 void CFGIRCNetworks::updateRecord(int row)
274 {
275  auto pModel = (QStandardItemModel *)d->gridNetworks->model();
276  QStandardItem *pItemDescription = pModel->item(row, 1);
277 
278  IRCNetworkEntity *pNetwork = this->network(row);
279 
280  pItemDescription->setText(pNetwork->description());
281 
282  QStandardItem *pItemAddress = pModel->item(row, 2);
283  pItemAddress->setText(QString("%1:%2").arg(pNetwork->address()).arg(pNetwork->port()));
284 
285  this->d->gridNetworks->resizeRowsToContents();
286 }