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

KDEUI

  • sources
  • kde-4.12
  • kdelibs
  • kdeui
  • itemviews
kwidgetitemdelegatepool.cpp
Go to the documentation of this file.
1 
22 #include "kwidgetitemdelegatepool_p.h"
23 
24 #include <math.h>
25 
26 #include <QtCore/qobjectdefs.h>
27 #include <QtCore/QMetaObject>
28 #include <QtCore/QMetaMethod>
29 #include <QtCore/QMetaProperty>
30 #include <QtCore/QPair>
31 #include <QtCore/QHash>
32 #include <QtCore/QList>
33 #include <QtGui/QWidget>
34 #include <QtGui/QAbstractItemView>
35 #include <QtGui/QApplication>
36 #include <QtGui/QInputEvent>
37 #include <QtGui/QAbstractProxyModel>
38 
39 #include <kdebug.h>
40 
41 #include "kwidgetitemdelegate.h"
42 #include "kwidgetitemdelegate_p.h"
43 
44 #define POOL_USAGE 0
45 
46 Q_DECLARE_METATYPE(QModelIndex)
47 
48 
52 //@cond PRIVATE
53 class KWidgetItemDelegateEventListener
54  : public QObject
55 {
56 public:
57  KWidgetItemDelegateEventListener(KWidgetItemDelegatePoolPrivate *poolPrivate, QObject *parent = 0)
58  : QObject(parent)
59  , poolPrivate(poolPrivate)
60  {
61  }
62 
63  virtual bool eventFilter(QObject *watched, QEvent *event);
64 
65 private:
66  KWidgetItemDelegatePoolPrivate *poolPrivate;
67 };
68 
69 KWidgetItemDelegatePoolPrivate::KWidgetItemDelegatePoolPrivate(KWidgetItemDelegate *d)
70  : delegate(d)
71  , eventListener(new KWidgetItemDelegateEventListener(this))
72  , clearing(false)
73 {
74 }
75 
76 KWidgetItemDelegatePool::KWidgetItemDelegatePool(KWidgetItemDelegate *delegate)
77  : d(new KWidgetItemDelegatePoolPrivate(delegate))
78 {
79 }
80 
81 KWidgetItemDelegatePool::~KWidgetItemDelegatePool()
82 {
83  delete d->eventListener;
84  delete d;
85 }
86 
87 QList<QWidget*> KWidgetItemDelegatePool::findWidgets(const QPersistentModelIndex &idx,
88  const QStyleOptionViewItem &option,
89  UpdateWidgetsEnum updateWidgets) const
90 {
91  QList<QWidget*> result;
92 
93  if (!idx.isValid()) {
94  return result;
95  }
96 
97  QModelIndex index;
98  if (const QAbstractProxyModel *proxyModel = qobject_cast<const QAbstractProxyModel*>(idx.model())) {
99  index = proxyModel->mapToSource(idx);
100  } else {
101  index = idx;
102  }
103 
104  if (!index.isValid()) {
105  return result;
106  }
107 
108  if (d->usedWidgets.contains(index)) {
109  result = d->usedWidgets[index];
110  } else {
111  // ### KDE5 This sets a property on the delegate because we can't add an argument to createItemWidgets
112  d->delegate->setProperty("goya:creatingWidgetForIndex", QVariant::fromValue(index));
113  result = d->delegate->createItemWidgets();
114  d->delegate->setProperty("goya:creatingWidgetForIndex", QVariant());
115  d->allocatedWidgets << result;
116  d->usedWidgets[index] = result;
117  foreach (QWidget *widget, result) {
118  d->widgetInIndex[widget] = index;
119  widget->setParent(d->delegate->d->itemView->viewport());
120  widget->installEventFilter(d->eventListener);
121  widget->setVisible(true);
122  }
123  }
124 
125  if (updateWidgets == UpdateWidgets) {
126  foreach (QWidget *widget, result) {
127  widget->setVisible(true);
128  }
129 
130  d->delegate->updateItemWidgets(result, option, idx);
131 
132  foreach (QWidget *widget, result) {
133  widget->move(widget->x() + option.rect.left(), widget->y() + option.rect.top());
134  }
135  }
136 
137  return result;
138 }
139 
140 QList<QWidget*> KWidgetItemDelegatePool::invalidIndexesWidgets() const
141 {
142  QList<QWidget*> result;
143  foreach (QWidget *widget, d->widgetInIndex.keys()) {
144  const QAbstractProxyModel *proxyModel = qobject_cast<const QAbstractProxyModel*>(d->delegate->d->model);
145  QModelIndex index;
146  if (proxyModel) {
147  index = proxyModel->mapFromSource(d->widgetInIndex[widget]);
148  } else {
149  index = d->widgetInIndex[widget];
150  }
151  if (!index.isValid()) {
152  result << widget;
153  }
154  }
155  return result;
156 }
157 
158 void KWidgetItemDelegatePool::fullClear()
159 {
160  d->clearing = true;
161  qDeleteAll(d->widgetInIndex.keys());
162  d->clearing = false;
163  d->allocatedWidgets.clear();
164  d->usedWidgets.clear();
165  d->widgetInIndex.clear();
166 }
167 
168 bool KWidgetItemDelegateEventListener::eventFilter(QObject *watched, QEvent *event)
169 {
170  QWidget *widget = static_cast<QWidget*>(watched);
171 
172  if (event->type() == QEvent::Destroy && !poolPrivate->clearing) {
173  kWarning() << "User of KWidgetItemDelegate should not delete widgets created by createItemWidgets!";
174  // assume the application has kept a list of widgets and tries to delete them manually
175  // they have been reparented to the view in any case, so no leaking occurs
176  poolPrivate->widgetInIndex.remove(widget);
177  QWidget *viewport = poolPrivate->delegate->d->itemView->viewport();
178  QApplication::sendEvent(viewport, event);
179  }
180  if (dynamic_cast<QInputEvent*>(event) && !poolPrivate->delegate->blockedEventTypes(widget).contains(event->type())) {
181  QWidget *viewport = poolPrivate->delegate->d->itemView->viewport();
182  switch(event->type()) {
183  case QEvent::MouseMove:
184  case QEvent::MouseButtonPress:
185  case QEvent::MouseButtonRelease:
186  case QEvent::MouseButtonDblClick: {
187  QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
188  QMouseEvent evt(event->type(), viewport->mapFromGlobal(mouseEvent->globalPos()),
189  mouseEvent->button(), mouseEvent->buttons(), mouseEvent->modifiers());
190  QApplication::sendEvent(viewport, &evt);
191  }
192  break;
193  case QEvent::Wheel: {
194  QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
195  QWheelEvent evt(viewport->mapFromGlobal(wheelEvent->globalPos()),
196  wheelEvent->delta(), wheelEvent->buttons(), wheelEvent->modifiers(),
197  wheelEvent->orientation());
198  QApplication::sendEvent(viewport, &evt);
199  }
200  break;
201  case QEvent::TabletMove:
202  case QEvent::TabletPress:
203  case QEvent::TabletRelease:
204  case QEvent::TabletEnterProximity:
205  case QEvent::TabletLeaveProximity: {
206  QTabletEvent *tabletEvent = static_cast<QTabletEvent*>(event);
207  QTabletEvent evt(event->type(), viewport->mapFromGlobal(tabletEvent->globalPos()),
208  tabletEvent->globalPos(), tabletEvent->hiResGlobalPos(), tabletEvent->device(),
209  tabletEvent->pointerType(), tabletEvent->pressure(), tabletEvent->xTilt(),
210  tabletEvent->yTilt(), tabletEvent->tangentialPressure(), tabletEvent->rotation(),
211  tabletEvent->z(), tabletEvent->modifiers(), tabletEvent->uniqueId());
212  QApplication::sendEvent(viewport, &evt);
213  }
214  break;
215  default:
216  QApplication::sendEvent(viewport, event);
217  break;
218  }
219  }
220 
221  return QObject::eventFilter(watched, event);
222 }
223 //@endcond
QVariant
kdebug.h
QWidget
QObject
KWidgetItemDelegate
This class allows to create item delegates embedding simple widgets to interact with items...
Definition: kwidgetitemdelegate.h:49
QAbstractProxyModel
kwidgetitemdelegate.h
kWarning
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
QList< QWidget * >
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:49:16 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDEUI

Skip menu "KDEUI"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

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