[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kdelibs] kdeui/itemviews: Compress update (initModel) requests to reduce the number of times the de
From: Andras Mantia <amantia () kde ! org>
Date: 2013-08-22 15:08:00
Message-ID: E1VCWUS-0007iJ-7N () scm ! kde ! org
[Download RAW message or body]
Git commit 2d99b2924ae5c3128e009b32366796949b521c7c by Andras Mantia.
Committed on 22/08/2013 at 14:50.
Pushed by amantia into branch 'master'.
Compress update (initModel) requests to reduce the number of times the delegate's \
updateItemWidgets is called (through KWidgetItemDelegatePool::findWidgets). If the \
sizeHint of an item changes, call updateItemWidgets to do a re-layout. Useful for \
models loading the data on request.
M +28 -9 kdeui/itemviews/kwidgetitemdelegate.cpp
M +2 -1 kdeui/itemviews/kwidgetitemdelegate.h
M +4 -0 kdeui/itemviews/kwidgetitemdelegate_p.h
http://commits.kde.org/kdelibs/2d99b2924ae5c3128e009b32366796949b521c7c
diff --git a/kdeui/itemviews/kwidgetitemdelegate.cpp \
b/kdeui/itemviews/kwidgetitemdelegate.cpp index d4ecf59..508e6b1 100644
--- a/kdeui/itemviews/kwidgetitemdelegate.cpp
+++ b/kdeui/itemviews/kwidgetitemdelegate.cpp
@@ -60,7 +60,10 @@ KWidgetItemDelegatePrivate::KWidgetItemDelegatePrivate(KWidgetItemDelegate \
*q, Q , selectionModel(0)
, viewDestroyed(false)
, q(q)
+ , initializeTimer(new QTimer(this))
{
+ initializeTimer->setInterval(50);
+ connect(initializeTimer, SIGNAL(timeout()), this, SLOT(initializeModel()));
}
KWidgetItemDelegatePrivate::~KWidgetItemDelegatePrivate()
@@ -107,13 +110,13 @@ void KWidgetItemDelegatePrivate::_k_slotLayoutChanged()
foreach (QWidget *widget, widgetPool->invalidIndexesWidgets()) {
widget->setVisible(false);
}
- QTimer::singleShot(0, this, SLOT(initializeModel()));
+ initializeModelRequested();
}
void KWidgetItemDelegatePrivate::_k_slotModelReset()
{
widgetPool->fullClear();
- QTimer::singleShot(0, this, SLOT(initializeModel()));
+ initializeModelRequested();
}
void KWidgetItemDelegatePrivate::_k_slotSelectionChanged(const QItemSelection \
&selected, const QItemSelection &deselected) @@ -126,6 +129,13 @@ void \
KWidgetItemDelegatePrivate::_k_slotSelectionChanged(const QItemSelection &s }
}
+
+void KWidgetItemDelegatePrivate::_k_sizeHintChanged(const QModelIndex &idx)
+{
+ //we need to call the initializeModel() directly, or some widgets will not be \
created/updated + QTimer::singleShot(0, this, SLOT(initializeModel()));
+}
+
void KWidgetItemDelegatePrivate::updateRowRange(const QModelIndex &parent, int \
start, int end, bool isRemoving) {
int i = start;
@@ -133,7 +143,9 @@ void KWidgetItemDelegatePrivate::updateRowRange(const QModelIndex \
&parent, int s for (int j = 0; j < model->columnCount(parent); ++j) {
const QModelIndex index = model->index(i, j, parent);
QList<QWidget*> widgetList = widgetPool->findWidgets(index, \
optionView(index), isRemoving ? \
KWidgetItemDelegatePool::NotUpdateWidgets
- \
: KWidgetItemDelegatePool::UpdateWidgets); + \
: KWidgetItemDelegatePool::UpdateWidgets, + \
true + );
if (isRemoving) {
widgetPool->d->allocatedWidgets.removeAll(widgetList);
foreach (QWidget *widget, widgetList) {
@@ -157,6 +169,11 @@ inline QStyleOptionViewItemV4 \
KWidgetItemDelegatePrivate::optionView(const QMode return optionView;
}
+void KWidgetItemDelegatePrivate::initializeModelRequested()
+{
+ initializeTimer->start();
+}
+
void KWidgetItemDelegatePrivate::initializeModel(const QModelIndex &parent)
{
if (!model) {
@@ -173,7 +190,7 @@ void KWidgetItemDelegatePrivate::initializeModel(const \
QModelIndex &parent) // all possible indexes that are shown.
const QModelIndex index = model->index(i, 0, parent);
if (index.isValid() && model->hasChildren(index)) {
- initializeModel(index);
+ initializeModel(parent);
}
}
}
@@ -195,10 +212,12 @@ KWidgetItemDelegate::KWidgetItemDelegate(QAbstractItemView \
*itemView, QObject *p
if(qobject_cast<QTreeView*>(itemView)) {
connect(itemView, SIGNAL(collapsed(QModelIndex)),
- d, SLOT(initializeModel()));
+ d, SLOT(initializeModelRequested()));
connect(itemView, SIGNAL(expanded(QModelIndex)),
- d, SLOT(initializeModel()));
+ d, SLOT(initializeModelRequested()));
}
+
+ connect(this, SIGNAL(sizeHintChanged(QModelIndex)), this, \
SLOT(_k_sizeHintChanged(QModelIndex))); }
KWidgetItemDelegate::~KWidgetItemDelegate()
@@ -264,7 +283,7 @@ bool KWidgetItemDelegatePrivate::eventFilter(QObject *watched, \
QEvent *event)
connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), q, \
SLOT(_k_slotDataChanged(QModelIndex,QModelIndex)));
connect(model, SIGNAL(layoutChanged()), q, SLOT(_k_slotLayoutChanged()));
connect(model, SIGNAL(modelReset()), q, SLOT(_k_slotModelReset()));
- QTimer::singleShot(0, this, SLOT(initializeModel()));
+ initializeModelRequested();
}
if (selectionModel != itemView->selectionModel()) {
@@ -273,14 +292,14 @@ bool KWidgetItemDelegatePrivate::eventFilter(QObject *watched, \
QEvent *event) }
selectionModel = itemView->selectionModel();
connect(selectionModel, \
SIGNAL(selectionChanged(QItemSelection,QItemSelection)), q, \
SLOT(_k_slotSelectionChanged(QItemSelection,QItemSelection)));
- QTimer::singleShot(0, this, SLOT(initializeModel()));
+ initializeModelRequested();
}
switch (event->type()) {
case QEvent::Polish:
case QEvent::Resize:
if (!qobject_cast<QAbstractItemView*>(watched)) {
- QTimer::singleShot(0, this, SLOT(initializeModel()));
+ initializeModelRequested();
}
break;
case QEvent::FocusIn:
diff --git a/kdeui/itemviews/kwidgetitemdelegate.h \
b/kdeui/itemviews/kwidgetitemdelegate.h index 232864a..420461a 100644
--- a/kdeui/itemviews/kwidgetitemdelegate.h
+++ b/kdeui/itemviews/kwidgetitemdelegate.h
@@ -89,7 +89,7 @@ protected:
* do it here.
*
* @note If you want to know the index for which you are creating widgets, it is
- * available as a QModelIndex Q_PROPERTY called \
"goya:creatingWidgetsForIndex". + * available as a QModelIndex Q_PROPERTY \
called "goya:creatingWidgetForIndex".
* Ensure to add Q_DECLARE_METATYPE(QModelIndex) before your method \
definition
* to tell QVariant about QModelIndex.
*
@@ -165,6 +165,7 @@ private:
Q_PRIVATE_SLOT(d, void _k_slotLayoutChanged())
Q_PRIVATE_SLOT(d, void _k_slotModelReset())
Q_PRIVATE_SLOT(d, void _k_slotSelectionChanged(const QItemSelection&,const \
QItemSelection&)) + Q_PRIVATE_SLOT(d, void _k_sizeHintChanged(const QModelIndex&))
//@endcond
};
diff --git a/kdeui/itemviews/kwidgetitemdelegate_p.h \
b/kdeui/itemviews/kwidgetitemdelegate_p.h index 5f1cf90..1783835 100644
--- a/kdeui/itemviews/kwidgetitemdelegate_p.h
+++ b/kdeui/itemviews/kwidgetitemdelegate_p.h
@@ -30,6 +30,7 @@
#include <QtGui/QItemSelectionModel>
+class QTimer;
class KWidgetItemDelegate;
class KWidgetItemDelegatePrivate
@@ -48,11 +49,13 @@ public:
void _k_slotLayoutChanged();
void _k_slotModelReset();
void _k_slotSelectionChanged (const QItemSelection &selected, const \
QItemSelection &deselected); + void _k_sizeHintChanged(const QModelIndex &index);
void updateRowRange(const QModelIndex &parent, int start, int end, bool \
isRemoving); QStyleOptionViewItemV4 optionView(const QModelIndex &index);
public Q_SLOTS:
+ void initializeModelRequested();
void initializeModel(const QModelIndex &parent = QModelIndex());
protected:
@@ -64,6 +67,7 @@ public:
QAbstractItemModel *model;
QItemSelectionModel *selectionModel;
bool viewDestroyed;
+ QTimer *initializeTimer;
KWidgetItemDelegate *q;
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic