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

KDEUI

  • 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
46Q_DECLARE_METATYPE(QModelIndex)
47
48
52//@cond PRIVATE
53class KWidgetItemDelegateEventListener
54 : public QObject
55{
56public:
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
65private:
66 KWidgetItemDelegatePoolPrivate *poolPrivate;
67};
68
69KWidgetItemDelegatePoolPrivate::KWidgetItemDelegatePoolPrivate(KWidgetItemDelegate *d)
70 : delegate(d)
71 , eventListener(new KWidgetItemDelegateEventListener(this))
72 , clearing(false)
73{
74}
75
76KWidgetItemDelegatePool::KWidgetItemDelegatePool(KWidgetItemDelegate *delegate)
77 : d(new KWidgetItemDelegatePoolPrivate(delegate))
78{
79}
80
81KWidgetItemDelegatePool::~KWidgetItemDelegatePool()
82{
83 delete d->eventListener;
84 delete d;
85}
86
87QList<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
140QList<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
158void 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
168bool 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
KWidgetItemDelegate
This class allows to create item delegates embedding simple widgets to interact with items.
Definition: kwidgetitemdelegate.h:50
QAbstractProxyModel
QList
QObject
QWidget
kWarning
#define kWarning
kdebug.h
kwidgetitemdelegate.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 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-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 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
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
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