• 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
  • history
rangetreewidget.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2 
3  Copyright (C) 2008 Javier Goday <jgoday@gmail.com>
4 
5  This program is free software; you can redistribute it and/or
6  modify it under the terms of the GNU General Public
7  License as published by the Free Software Foundation; either
8  version 2 of the License, or (at your option) any later version.
9 */
10 
11 #include "rangetreewidget.h"
12 #include "settings.h"
13 
14 #include <KIcon>
15 #include <KDebug>
16 
17 #include <QApplication>
18 #include <QDate>
19 #include <QFont>
20 #include <QHeaderView>
21 #include <QHBoxLayout>
22 #include <QLabel>
23 #include <QLinearGradient>
24 #include <QList>
25 #include <QPainter>
26 #include <QPalette>
27 #include <QStyledItemDelegate>
28 #include <QStandardItem>
29 #include <QStandardItemModel>
30 #include <QSortFilterProxyModel>
31 #include <QVariant>
32 #include <QUrl>
33 
34 class RangeTreeWidget::Range
35 {
36 public:
37  Range()
38  {
39  };
40 
41  bool check(const QVariant &data) const
42  {
43  if (data.type() == QVariant::String) {
44  return (QString::compare(data.toString(), min.toString()) == 0);
45  }
46  else if (data.type() == QVariant::Int || data.type() == QVariant::Double) {
47  if (data.toDouble() >= min.toDouble() && (data.toDouble() <= max.toDouble() || max.toDouble() < 0)) {
48  // the last range ends with -1
49  return true;
50  }
51  }
52 
53  return false;
54  }
55 
56  int id;
57  QVariant min;
58  QVariant max;
59  QString title;
60 };
61 
62 RangeSortFilterProxyModel::RangeSortFilterProxyModel(QObject *parent):
63  QSortFilterProxyModel(parent)
64 {
65 }
66 
67 RangeSortFilterProxyModel::~RangeSortFilterProxyModel()
68 {
69 }
70 
71 bool RangeSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
72 {
73  // if the row is a range row, we include in the filter always
74  if(source_parent.isValid()) {
75  return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
76  }
77 
78  return true;
79 }
80 
81 RangeTreeWidget::RangeTreeWidget(QWidget *parent) : QTreeView(parent),
82  m_data(),
83  m_ranges(),
84  m_rangeDelegate(0)
85 {
86  setDragEnabled(false);
87  setAlternatingRowColors(true);
88  setEditTriggers(QAbstractItemView::NoEditTriggers);
89  header()->setMovable(false);
90 
91  // initialize the standard item model of the tree
92  m_model = new QStandardItemModel(this);
93  m_proxyModel = new RangeSortFilterProxyModel(this);
94 
95  m_proxyModel->setSourceModel(m_model);
96  setModel(m_proxyModel);
97 
98  // delegate for the range title
99  RangeTreeWidgetItemDelegate *delegate = new RangeTreeWidgetItemDelegate(this);
100  setItemDelegate(delegate);
101 }
102 
103 RangeTreeWidget::~RangeTreeWidget()
104 {
105  QList<int> list;
106  for (int i = 0; i < 5; i++)
107  {
108  list.append(columnWidth(i));
109  }
110  Settings::setHistoryColumnWidths(list);
111  Settings::self()->writeConfig();
112  clear();
113 
114  delete m_rangeDelegate;
115 }
116 
117 int RangeTreeWidget::addRange(const QVariant &min, const QVariant &max, const QString &title)
118 {
119  int row = m_data.size();
120 
121  Range range;
122  range.min = min;
123  range.max = max;
124  range.title = title;
125  range.id = row;
126  m_ranges << range;
127 
128  m_data [row] = new QStandardItem(title);
129  m_model->insertRow(row, m_data [row]);
130  setFirstColumnSpanned(row, QModelIndex(), true);
131  // openPersistentEditor(model()->index(row, 0, QModelIndex()));
132 
133  // expand the first row
134  if(row == 0) {
135  setExpanded(model()->index(row, 0, QModelIndex()), true);
136  }
137 
138  return row;
139 }
140 
141 void RangeTreeWidget::clear()
142 {
143  m_model->clear();
144  m_data.clear();
145  m_ranges.clear();
146 }
147 
148 void RangeTreeWidget::add(const QVariant &data, const QString &column)
149 {
150  QVariantList list;
151  list << QVariant(column);
152 
153  add(data, list);
154 }
155 
156 void RangeTreeWidget::add(const QVariant &data, const QVariantList &columns)
157 {
158  QStandardItem *parent = getRange(data);
159 
160  QList <QStandardItem *> list;
161  foreach(const QVariant &item, columns) {
162  list << new QStandardItem(item.toString());
163  }
164 
165  parent->appendRow(list);
166  // TODO: need to find a better way to update rangetitlewidget count from the QStandardItem children count
167  // closePersistentEditor(parent->index());
168  // openPersistentEditor(parent->index());
169 }
170 
171 void RangeTreeWidget::addLabel(const QString &title)
172 {
173  int index = header()->count();
174  m_model->setColumnCount(index + 1);
175  m_model->setHeaderData(index, Qt::Horizontal, title);
176 }
177 
178 void RangeTreeWidget::setLabels(const QStringList &labels)
179 {
180  m_model->setColumnCount(labels.size());
181 
182  for(int i=0; i<labels.size(); i++) {
183  m_model->setHeaderData(i, Qt::Horizontal, labels.at(i));
184  }
185 }
186 
187 void RangeTreeWidget::setRangeDelegate(RangeDelegate *delegate)
188 {
189  delete m_rangeDelegate;
190  m_rangeDelegate = delegate;
191 }
192 
193 QList <QVariantList> RangeTreeWidget::data()
194 {
195  QList <QVariantList> list;
196  foreach(const Range &range, m_ranges) {
197  QStandardItem *parent = m_model->itemFromIndex(model()->index(range.id, 0, QModelIndex()));
198 
199  for(int y=0; y<parent->rowCount(); y++) {
200  QVariantList items;
201  for(int x=0; x<header()->count(); x++) {
202  QStandardItem *item = parent->child(y, x);
203  items << item->data(Qt::DisplayRole);
204  }
205  list << items;
206  }
207  }
208 
209  return list;
210 }
211 
212 QStandardItem *RangeTreeWidget::currentItem(int column)
213 {
214  QStandardItem *item = 0;
215  if (column >= 0) {
216  item = m_model->itemFromIndex(m_model->index(m_proxyModel->mapToSource(currentIndex()).row(),
217  column,
218  m_proxyModel->mapToSource(currentIndex()).parent()));
219  }
220  else {
221  item = m_model->itemFromIndex(m_proxyModel->mapToSource(currentIndex()));
222  }
223  return item;
224 }
225 
226 QStandardItem *RangeTreeWidget::item(const QModelIndex &index, int column)
227 {
228  return m_model->item(m_proxyModel->mapToSource(index).row(), column);
229 }
230 
231 void RangeTreeWidget::removeRow(int row, const QModelIndex &parent)
232 {
233  m_model->removeRow(row, parent);
234 }
235 
236 void RangeTreeWidget::setFilterRegExp(const QString &text)
237 {
238  m_proxyModel->setFilterRegExp(text);
239 }
240 
241 QStandardItem *RangeTreeWidget::getRange(const QVariant &data)
242 {
243  QVariant rangeData = data;
244  if (m_rangeDelegate) {
245  rangeData = m_rangeDelegate->getRangeData(data);
246  }
247 
248  foreach (const Range &range, m_ranges) {
249  if(range.check(rangeData)) {
250  return m_data [range.id];
251  }
252  }
253 
254  if (m_rangeDelegate) {
255  int id = addRange(rangeData, rangeData, rangeData.toString());
256  return m_data [id];
257  }
258  else {
259  // if no range found, return the last one
260  return m_data [m_data.size() - 1];
261  }
262 }
263 
264 RangeDelegate::RangeDelegate(QObject *parent) : QObject(parent)
265 {
266 }
267 
268 RangeDelegate::~RangeDelegate()
269 {
270 }
271 
272 HostRangeDelegate::HostRangeDelegate(QObject *parent) : RangeDelegate(parent)
273 {
274 }
275 
276 HostRangeDelegate::~HostRangeDelegate()
277 {
278 }
279 
280 QVariant HostRangeDelegate::getRangeData(const QVariant &data)
281 {
282  return QUrl(data.toString()).host();
283 }
284 
285 RangeTreeWidgetItemDelegate::RangeTreeWidgetItemDelegate(QAbstractItemView *parent) : QStyledItemDelegate(parent)
286 {
287 }
288 
289 void RangeTreeWidgetItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
290 {
291  if(index.parent().isValid()) {
292  QStyledItemDelegate::paint(painter, option, index);
293  }
294  else if(index.isValid()) {
295  QStyleOptionViewItemV4 opt(option);
296  QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
297  style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
298 
299  const QSortFilterProxyModel *model = static_cast <const QSortFilterProxyModel *>(index.model());
300  const QStandardItemModel *s_model = static_cast <const QStandardItemModel *>(model->sourceModel());
301  QStandardItem *item = s_model->itemFromIndex(model->mapToSource(index));
302  // draw the range title
303  painter->save();
304  QFont font;
305  font.setBold(true);
306  painter->setFont(font);
307  painter->drawText(option.rect.left() + 10,
308  option.rect.top() + 5,
309  option.rect.width() - 20, 15,
310  Qt::AlignLeft,
311  item->data(Qt::DisplayRole).toString() +
312  " (" + QString::number(model->rowCount(index)) + ')');
313  painter->restore();
314 
315  // Draw the line under the title
316  QColor color = option.palette.color(QPalette::Text);
317  if (option.state & QStyle::State_Selected) {
318  color = option.palette.color(QPalette::HighlightedText);
319  }
320 
321  QRect lineRect(option.rect.left() + 10, option.rect.bottom() - 2,
322  500, 1);
323 
324  QLinearGradient gradient(option.rect.left() + 10, option.rect.top(),
325  500, option.rect.height());
326  gradient.setColorAt(0, color);
327  gradient.setColorAt(1, Qt::transparent);
328 
329  painter->fillRect(lineRect, gradient);
330  }
331 }
332 
333 QSize RangeTreeWidgetItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
334 {
335  Q_UNUSED(option)
336  Q_UNUSED(index)
337 
338  return QSize(0, 30);
339 }
340 
341 #include "rangetreewidget.moc"
RangeSortFilterProxyModel::RangeSortFilterProxyModel
RangeSortFilterProxyModel(QObject *parent=0)
Definition: rangetreewidget.cpp:62
RangeTreeWidgetItemDelegate::RangeTreeWidgetItemDelegate
RangeTreeWidgetItemDelegate(QAbstractItemView *parent)
Definition: rangetreewidget.cpp:285
RangeTreeWidget::setRangeDelegate
void setRangeDelegate(RangeDelegate *delegate)
Set a delegate in case you want to create the ranges dinamically Ej, the host ranges delegate...
Definition: rangetreewidget.cpp:187
RangeTreeWidget::item
QStandardItem * item(const QModelIndex &index=QModelIndex(), int column=0)
Definition: rangetreewidget.cpp:226
RangeTreeWidget::addLabel
void addLabel(const QString &title)
Definition: rangetreewidget.cpp:171
RangeSortFilterProxyModel
We need to override the qsortfilterproxymodel behavior to avoid include the range rows in the search ...
Definition: rangetreewidget.h:30
RangeTreeWidget::setLabels
void setLabels(const QStringList &labels)
Definition: rangetreewidget.cpp:178
rangetreewidget.h
QWidget
HostRangeDelegate::HostRangeDelegate
HostRangeDelegate(QObject *parent=0)
Definition: rangetreewidget.cpp:272
QStandardItemModel
Settings::setHistoryColumnWidths
static void setHistoryColumnWidths(const QList< int > &v)
Set The width of the columns in the history view.
Definition: settings.h:990
QObject
RangeDelegate::~RangeDelegate
~RangeDelegate()
Definition: rangetreewidget.cpp:268
QStyledItemDelegate
RangeTreeWidget::removeRow
void removeRow(int row, const QModelIndex &parent=QModelIndex())
Definition: rangetreewidget.cpp:231
RangeTreeWidgetItemDelegate::sizeHint
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
Definition: rangetreewidget.cpp:333
Settings::self
static Settings * self()
Definition: settings.cpp:17
HostRangeDelegate::getRangeData
QVariant getRangeData(const QVariant &data)
Returns the current range of the incoming data.
Definition: rangetreewidget.cpp:280
RangeTreeWidgetItemDelegate
Definition: rangetreewidget.h:123
RangeDelegate
Creates ranges dinamically, based on the item data.
Definition: rangetreewidget.h:97
QTreeView
RangeTreeWidget::data
QList< QVariantList > data()
Definition: rangetreewidget.cpp:193
RangeTreeWidget::currentItem
QStandardItem * currentItem(int column=-1)
Definition: rangetreewidget.cpp:212
RangeDelegate::RangeDelegate
RangeDelegate(QObject *parent=0)
Definition: rangetreewidget.cpp:264
QSortFilterProxyModel
RangeTreeWidget::RangeTreeWidget
RangeTreeWidget(QWidget *parent=0)
Definition: rangetreewidget.cpp:81
RangeTreeWidget::setFilterRegExp
void setFilterRegExp(const QString &text)
Filters the data throws the qsortfilterproxymodel.
Definition: rangetreewidget.cpp:236
RangeTreeWidget::~RangeTreeWidget
~RangeTreeWidget()
Definition: rangetreewidget.cpp:103
settings.h
RangeTreeWidget::addRange
int addRange(const QVariant &min, const QVariant &max, const QString &title)
Creates a range with a title between two values.
Definition: rangetreewidget.cpp:117
RangeTreeWidget::clear
void clear()
Definition: rangetreewidget.cpp:141
HostRangeDelegate::~HostRangeDelegate
~HostRangeDelegate()
Definition: rangetreewidget.cpp:276
RangeTreeWidget::add
void add(const QVariant &data, const QString &column)
Definition: rangetreewidget.cpp:148
RangeDelegate::getRangeData
virtual QVariant getRangeData(const QVariant &data)=0
Returns the current range of the incoming data.
QStandardItem
RangeSortFilterProxyModel::filterAcceptsRow
virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
Definition: rangetreewidget.cpp:71
RangeSortFilterProxyModel::~RangeSortFilterProxyModel
~RangeSortFilterProxyModel()
Definition: rangetreewidget.cpp:67
RangeTreeWidgetItemDelegate::paint
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
Definition: rangetreewidget.cpp:289
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