• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • ui
  • mirror
mirrormodel.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 * Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
18 ***************************************************************************/
19 
20 #include "mirrormodel.h"
21 
22 #include <QtCore/QAbstractListModel>
23 #include <QtGui/QSpinBox>
24 
25 #include <KComboBox>
26 #include <KGlobal>
27 #include <KLineEdit>
28 #include <KLocale>
29 #include <KStandardDirs>
30 
31 MirrorDelegate::MirrorDelegate(QObject *parent)
32  : QStyledItemDelegate(parent),
33  m_countrySort(0)
34 {
35 }
36 
37 MirrorDelegate::MirrorDelegate(QSortFilterProxyModel *countrySort, QObject *parent)
38  : QStyledItemDelegate(parent),
39  m_countrySort(countrySort)
40 {
41 
42 }
43 
44 QWidget *MirrorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
45 {
46  Q_UNUSED(option)
47 
48  if (index.isValid())
49  {
50  if (index.column() == MirrorItem::Url)
51  {
52  KLineEdit *line = new KLineEdit(parent);
53 
54  return line;
55  }
56  else if (index.column() == MirrorItem::Connections)
57  {
58  QSpinBox *numConnections = new QSpinBox(parent);
59  numConnections->setRange(0, 20);
60 
61  return numConnections;
62  }
63  else if (index.column() == MirrorItem::Priority)
64  {
65  QSpinBox *priority = new QSpinBox(parent);
66  priority->setRange(0, 999999);
67 
68  return priority;
69  }
70  else if (index.column() == MirrorItem::Country)
71  {
72  if (m_countrySort)
73  {
74  KComboBox *countrySort = new KComboBox(parent);
75  countrySort->setModel(m_countrySort);
76 
77  return countrySort;
78  }
79  }
80  }
81 
82  return 0;
83 }
84 
85 void MirrorDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
86 {
87  if (index.isValid() && editor) {
88  if (index.column() == MirrorItem::Url) {
89  KLineEdit *line = static_cast<KLineEdit*>(editor);
90  const KUrl url = index.data(Qt::EditRole).toUrl();
91  line->setUrl(url);
92  } else if (index.column() == MirrorItem::Connections) {
93  QSpinBox *numConnections = static_cast<QSpinBox*>(editor);
94  const int num = index.data(Qt::EditRole).toInt();
95  numConnections->setValue(num);
96  } else if (index.column() == MirrorItem::Priority) {
97  QSpinBox *priority = static_cast<QSpinBox*>(editor);
98  const int num = index.data(Qt::EditRole).toInt();
99  priority->setValue(num);
100  } else if (index.column() == MirrorItem::Country) {
101  KComboBox *countrySort = static_cast<KComboBox*>(editor);
102  const QString countryCode = index.data(Qt::EditRole).toString();
103  const int indexCountrySort = countrySort->findData(countryCode);
104  countrySort->setCurrentIndex(indexCountrySort);
105  }
106  }
107 }
108 
109 void MirrorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
110 {
111  if (index.isValid() && editor && model)
112  {
113  if (index.column() == MirrorItem::Url)
114  {
115  KLineEdit *line = static_cast<KLineEdit*>(editor);
116  if (!line->text().isEmpty())
117  {
118  model->setData(index, line->text());
119  }
120  }
121  else if (index.column() == MirrorItem::Connections)
122  {
123  QSpinBox *numConnections = static_cast<QSpinBox*>(editor);
124  model->setData(index, numConnections->value());
125  }
126  else if (index.column() == MirrorItem::Priority)
127  {
128  QSpinBox *priority = static_cast<QSpinBox*>(editor);
129  model->setData(index, priority->value());
130  }
131  else if (index.column() == MirrorItem::Country)
132  {
133  KComboBox *countrySort = static_cast<KComboBox*>(editor);
134  const QString countryCode = countrySort->itemData(countrySort->currentIndex()).toString();
135  model->setData(index, countryCode);
136  }
137  }
138 }
139 
140 void MirrorDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
141 {
142  Q_UNUSED(index)
143  editor->setGeometry(option.rect);
144 }
145 
146 QSize MirrorDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
147 {
148  //make the sizeHint a little bit nicer to have more beautiful editors
149  QSize hint;
150  hint.setWidth(QStyledItemDelegate::sizeHint(option, index).width());
151  hint.setHeight(option.fontMetrics.height() + 7);
152  return hint;
153 }
154 
155 
156 MirrorProxyModel::MirrorProxyModel(QObject *parent)
157  : QSortFilterProxyModel(parent)
158 {
159 }
160 
161 bool MirrorProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
162 {
163  if (left.column() == MirrorItem::Used) {
164  const int leftData = sourceModel()->data(left, Qt::CheckStateRole).toInt();
165  const int rightData = sourceModel()->data(right, Qt::CheckStateRole).toInt();
166  return leftData < rightData;
167  } else if (left.column() == MirrorItem::Priority) {
168  const int leftData = sourceModel()->data(left, Qt::UserRole).toInt();
169  const int rightData = sourceModel()->data(right, Qt::UserRole).toInt();
170  return (!leftData ? true : (leftData > rightData) && rightData);//0 is always smallest, otherwise larger is smaller
171  }
172 
173  return QSortFilterProxyModel::lessThan(left, right);
174 }
175 
176 
177 MirrorItem::MirrorItem()
178  : m_checked(Qt::Unchecked),
179  m_numConnections(0),
180  m_priority(0)
181 {
182 }
183 
184 QVariant MirrorItem::data(int column, int role) const
185 {
186  if (column == MirrorItem::Used)
187  {
188  if (role == Qt::CheckStateRole)
189  {
190  return m_checked;
191  }
192  }
193  else if (column == MirrorItem::Url)
194  {
195  if (role == Qt::DisplayRole)
196  {
197  return m_url.pathOrUrl();
198  }
199  else if ((role == Qt::UserRole) || (role == Qt::EditRole))
200  {
201  return QVariant(m_url);
202  }
203  }
204  else if (column == MirrorItem::Connections)
205  {
206  if (role == Qt::DisplayRole)
207  {
208  if (m_numConnections)
209  {
210  return m_numConnections;
211  }
212  else
213  {
214  return i18n("not specified");
215  }
216  }
217  else if ((role == Qt::EditRole) || (role == Qt::UserRole))
218  {
219  return m_numConnections;
220  }
221  }
222  else if (column == MirrorItem::Priority)
223  {
224  if (role == Qt::DisplayRole)
225  {
226  if (m_priority)
227  {
228  return m_priority;
229  }
230  else
231  {
232  return i18n("not specified");
233  }
234  }
235  else if ((role == Qt::EditRole) || (role == Qt::UserRole))
236  {
237  return m_priority;
238  }
239  }
240  else if (column == MirrorItem::Country)
241  {
242  if (role == Qt::DisplayRole)
243  {
244  return m_countryName;
245  }
246  else if (role == Qt::DecorationRole)
247  {
248  return m_countryFlag;
249  }
250  else if ((role == Qt::UserRole) || (role == Qt::EditRole))
251  {
252  return m_countryCode;
253  }
254  }
255 
256  return QVariant();
257 }
258 
259 Qt::ItemFlags MirrorItem::flags(int column) const
260 {
261  Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
262  if (column == MirrorItem::Used)
263  {
264  flags |= Qt::ItemIsUserCheckable;
265  }
266  else if (column == MirrorItem::Url)
267  {
268  flags |= Qt::ItemIsEditable;
269  }
270  else if (column == MirrorItem::Connections)
271  {
272  flags |= Qt::ItemIsEditable;
273  }
274  else if (column == MirrorItem::Priority)
275  {
276  flags |= Qt::ItemIsEditable;
277  }
278  else if (column == MirrorItem::Country)
279  {
280  flags |= Qt::ItemIsEditable;
281  }
282 
283  return flags;
284 }
285 
286 bool MirrorItem::setData(int column, const QVariant &value, int role)
287 {
288  if ((column == MirrorItem::Used) && (role == Qt::CheckStateRole))
289  {
290  m_checked = static_cast<Qt::CheckState>(value.toInt());
291  return true;
292  }
293  else if ((column == MirrorItem::Url) && (role == Qt::EditRole))
294  {
295  KUrl url;
296  if (value.type() == QVariant::Url)
297  {
298  url = KUrl(value.toUrl());
299  }
300  else if (value.type() == QVariant::String)
301  {
302  url = KUrl(value.toString());
303  }
304 
305  if (!url.isEmpty())
306  {
307  m_url = url;
308  return true;
309  }
310  }
311  else if ((column == MirrorItem::Connections) && (role == Qt::EditRole))
312  {
313  m_numConnections = value.toInt();
314  return true;
315  }
316  else if ((column == MirrorItem::Priority) && (role == Qt::EditRole))
317  {
318  m_priority = value.toInt();
319  return true;
320  }
321  else if ((column == MirrorItem::Country) && (role == Qt::EditRole))
322  {
323  m_countryCode = value.toString();
324  m_countryName = KGlobal::locale()->countryCodeToName(m_countryCode);
325 
326  if (!m_countryName.isEmpty())
327  {
328  QString path = KStandardDirs::locate("locale", QString::fromLatin1("l10n/%1/flag.png").arg(m_countryCode));
329  if (path.isEmpty())
330  {
331  m_countryFlag = KIcon();
332  }
333  else
334  {
335  m_countryFlag = KIcon(path);
336  }
337  }
338  else
339  {
340  m_countryFlag = KIcon();
341  }
342  return true;
343  }
344 
345  return false;
346 }
347 
348 
349 MirrorModel::MirrorModel(QObject *parent)
350 : QAbstractTableModel(parent)
351 {
352 }
353 
354 MirrorModel::~MirrorModel()
355 {
356  qDeleteAll(m_data);
357 }
358 
359 int MirrorModel::rowCount(const QModelIndex &index) const
360 {
361  if (!index.isValid())
362  {
363  return m_data.count();
364  }
365  else
366  {
367  return 0;
368  }
369 }
370 
371 int MirrorModel::columnCount(const QModelIndex &index) const
372 {
373  if (index.isValid())
374  {
375  return 0;
376  }
377 
378  return 5;
379 }
380 
381 QVariant MirrorModel::headerData(int section, Qt::Orientation orientation, int role) const
382 {
383  if (orientation == Qt::Vertical) {
384  return QVariant();
385  }
386 
387  if ((section == MirrorItem::Url) && (role == Qt::DisplayRole)) {
388  return i18nc("Mirror as in server, in url", "Mirror");
389  } else if (section == MirrorItem::Priority) {
390  if (role == Qt::DisplayRole) {
391  return i18nc("The priority of the mirror", "Priority");
392  } else if (role == Qt::DecorationRole) {
393  return KIcon("games-highscores");
394  }
395  } else if ((section == MirrorItem::Connections) && (role == Qt::DisplayRole)) {
396  return i18nc("Number of paralell connections to the mirror", "Connections");
397  } else if ((section == MirrorItem::Country) && (role == Qt::DisplayRole)) {
398  return i18nc("Location = country", "Location");
399  }
400 
401  return QVariant();
402 }
403 
404 QVariant MirrorModel::data(const QModelIndex &index, int role) const
405 {
406  if (!index.isValid()) {
407  return QVariant();
408  }
409 
410  return m_data.at(index.row())->data(index.column(), role);
411 }
412 
413 Qt::ItemFlags MirrorModel::flags(const QModelIndex &index) const
414 {
415  if (!index.isValid()) {
416  return 0;
417  }
418 
419  return m_data.at(index.row())->flags(index.column());
420 }
421 
422 bool MirrorModel::setData(const QModelIndex &index, const QVariant &value, int role)
423 {
424  if (!index.isValid()) {
425  return false;
426  }
427 
428  const bool changed = m_data.at(index.row())->setData(index.column(), value, role);
429  if (changed)
430  {
431  emit dataChanged(index, index);
432  }
433  return changed;
434 }
435 
436 bool MirrorModel::removeRows(int row, int count, const QModelIndex &parent)
437 {
438  if (parent.isValid() || (row < 0) || (count < 1) || (row + count > rowCount()))
439  {
440  return false;
441  }
442 
443  beginRemoveRows(parent, row, row + count - 1);
444  while (count)
445  {
446  MirrorItem *item = m_data[row];
447  m_data.removeAt(row);
448  delete item;
449  --count;
450  }
451  endRemoveRows();
452 
453  return true;
454 }
455 
456 void MirrorModel::addMirror(const KUrl &url, int numConnections, int priority, const QString &countryCode)
457 {
458  if (!url.isValid())
459  {
460  return;
461  }
462 
463  for (int i = 0; i < rowCount(); ++i)
464  {
465  //exists already, so remove the row
466  if (KUrl(m_data.at(i)->data(MirrorItem::Url).toString()) == url)
467  {
468  removeRow(i);
469  break;
470  }
471  }
472 
473  int index = rowCount();
474  emit beginInsertRows(QModelIndex(), index, index);
475 
476  MirrorItem *item = new MirrorItem;
477  m_data.append(item);
478  item->setData(MirrorItem::Used, Qt::Checked, Qt::CheckStateRole);//every newly added mirror is set to checked automatically
479  item->setData(MirrorItem::Url, QVariant(url));
480  item->setData(MirrorItem::Connections, numConnections);
481  item->setData(MirrorItem::Priority, priority);
482  item->setData(MirrorItem::Country, countryCode);
483 
484  emit endInsertRows();
485 }
486 
487 void MirrorModel::setMirrors(const QHash<KUrl, QPair<bool, int> > &mirrors)
488 {
489  removeRows(0, rowCount());
490 
491  QHash<KUrl, QPair<bool, int> >::const_iterator it;
492  QHash<KUrl, QPair<bool, int> >::const_iterator itEnd = mirrors.constEnd();
493  for (it = mirrors.constBegin(); it != itEnd; ++it)
494  {
495  MirrorItem *item = new MirrorItem;
496  item->setData(MirrorItem::Url, QVariant(it.key()));
497  Qt::CheckState state = (*it).first ? Qt::Checked : Qt::Unchecked;
498  item->setData(MirrorItem::Used, state, Qt::CheckStateRole);
499  item->setData(MirrorItem::Connections, (*it).second);
500  m_data.append(item);
501  }
502 
503  emit reset();
504 }
505 
506 QHash<KUrl, QPair<bool, int> > MirrorModel::availableMirrors() const
507 {
508  QHash<KUrl, QPair<bool, int> > mirrors;
509  foreach (MirrorItem *item, m_data)
510  {
511  bool used = (item->data(MirrorItem::Used, Qt::CheckStateRole).toInt() == Qt::Checked) ? true : false;
512  const KUrl url = KUrl(item->data(MirrorItem::Url).toString());
513  mirrors[url] = QPair<bool, int>(used, item->data(MirrorItem::Connections, Qt::UserRole).toInt());
514  }
515  return mirrors;
516 }
517 
518 #include "mirrormodel.moc"
MirrorItem::Connections
Definition: mirrormodel.h:69
MirrorDelegate::setModelData
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Definition: mirrormodel.cpp:109
MirrorItem::flags
Qt::ItemFlags flags(int column) const
Definition: mirrormodel.cpp:259
MirrorDelegate::createEditor
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Definition: mirrormodel.cpp:44
MirrorModel::flags
Qt::ItemFlags flags(const QModelIndex &index) const
Definition: mirrormodel.cpp:413
QWidget
MirrorProxyModel::MirrorProxyModel
MirrorProxyModel(QObject *parent=0)
Definition: mirrormodel.cpp:156
MirrorModel::columnCount
int columnCount(const QModelIndex &index=QModelIndex()) const
Definition: mirrormodel.cpp:371
MirrorItem::Url
Definition: mirrormodel.h:68
QObject
QStyledItemDelegate
MirrorModel::addMirror
void addMirror(const KUrl &url, int numConnections=0, int priority=0, const QString &countryCode=QString())
Definition: mirrormodel.cpp:456
MirrorProxyModel::lessThan
bool lessThan(const QModelIndex &left, const QModelIndex &right) const
Definition: mirrormodel.cpp:161
MirrorDelegate::sizeHint
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Definition: mirrormodel.cpp:146
MirrorModel::setMirrors
void setMirrors(const QHash< KUrl, QPair< bool, int > > &mirrors)
Definition: mirrormodel.cpp:487
MirrorDelegate::updateEditorGeometry
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
Definition: mirrormodel.cpp:140
MirrorItem::Priority
Definition: mirrormodel.h:70
MirrorItem::Used
Definition: mirrormodel.h:67
MirrorModel::availableMirrors
QHash< KUrl, QPair< bool, int > > availableMirrors() const
Definition: mirrormodel.cpp:506
MirrorModel::headerData
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
Definition: mirrormodel.cpp:381
QAbstractItemModel
MirrorModel::removeRows
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex())
Definition: mirrormodel.cpp:436
MirrorModel::rowCount
int rowCount(const QModelIndex &index=QModelIndex()) const
Definition: mirrormodel.cpp:359
MirrorItem::MirrorItem
MirrorItem()
Definition: mirrormodel.cpp:177
QSortFilterProxyModel
MirrorDelegate::setEditorData
void setEditorData(QWidget *editor, const QModelIndex &index) const
Definition: mirrormodel.cpp:85
MirrorModel::data
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Definition: mirrormodel.cpp:404
MirrorModel::MirrorModel
MirrorModel(QObject *parent)
Definition: mirrormodel.cpp:349
MirrorDelegate::MirrorDelegate
MirrorDelegate(QObject *parent=0)
Definition: mirrormodel.cpp:31
MirrorItem::setData
bool setData(int column, const QVariant &value, int role=Qt::EditRole)
Definition: mirrormodel.cpp:286
MirrorModel::~MirrorModel
~MirrorModel()
Definition: mirrormodel.cpp:354
MirrorItem::data
QVariant data(int column, int role=Qt::DisplayRole) const
Definition: mirrormodel.cpp:184
mirrormodel.h
MirrorItem::Country
Definition: mirrormodel.h:71
QAbstractTableModel
MirrorItem
Definition: mirrormodel.h:60
MirrorModel::setData
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: mirrormodel.cpp:422
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal