[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