KDEUI
kwidgetitemdelegatepool.cpp
Go to the documentation of this file.00001
00022 #include "kwidgetitemdelegatepool_p.h"
00023
00024 #include <math.h>
00025
00026 #include <QtCore/qobjectdefs.h>
00027 #include <QtCore/QMetaObject>
00028 #include <QtCore/QMetaMethod>
00029 #include <QtCore/QMetaProperty>
00030 #include <QtCore/QPair>
00031 #include <QtCore/QHash>
00032 #include <QtCore/QList>
00033 #include <QtGui/QWidget>
00034 #include <QtGui/QAbstractItemView>
00035
00036 #include "kwidgetitemdelegate.h"
00037
00038 #define POOL_USAGE 0
00039
00044
00045 class KWidgetItemDelegatePoolPrivate
00046 {
00047 public:
00048 KWidgetItemDelegatePoolPrivate(KWidgetItemDelegate *d)
00049 : delegate(d), fakeParent(new QWidget()) { }
00050
00051 KWidgetItemDelegate *delegate;
00052 QWidget *fakeParent;
00053
00054 QList<QList<QWidget*> > allocatedWidgets;
00055 QList<QList<QWidget*> > unusedWidgets;
00056 QHash<QPersistentModelIndex, QList<QWidget*> > usedWidgets;
00057 };
00058
00059 KWidgetItemDelegatePool::KWidgetItemDelegatePool(KWidgetItemDelegate *delegate)
00060 : d(new KWidgetItemDelegatePoolPrivate(delegate))
00061 {
00062 }
00063
00064 KWidgetItemDelegatePool::~KWidgetItemDelegatePool()
00065 {
00066 foreach (const QList<QWidget*> &list, d->allocatedWidgets) {
00067 qDeleteAll(list);
00068 }
00069 delete d->fakeParent;
00070 delete d;
00071 }
00072
00073 QList<QWidget*> KWidgetItemDelegatePool::findWidgets(const QPersistentModelIndex &index,
00074 const QStyleOptionViewItem &option)
00075 {
00076 QList<QWidget*> result;
00077
00078 if (d->usedWidgets.contains(index)) {
00079 result = d->usedWidgets[index];
00080 } else {
00081 result = d->delegate->createItemWidgets();
00082 d->allocatedWidgets << result;
00083 d->usedWidgets[index] = result;
00084
00085 foreach (QWidget *widget, result) {
00086 widget->setParent(d->fakeParent);
00087 widget->setVisible(true);
00088 }
00089 }
00090
00091 d->delegate->updateItemWidgets(result, option, index);
00092
00093 return result;
00094 }
00095