Use QQuickChangeListener for better performance
authorGunnar Sletta <gunnar.sletta@nokia.com>
Tue, 15 Nov 2011 08:44:40 +0000 (09:44 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 16 Nov 2011 17:07:00 +0000 (18:07 +0100)
Change-Id: Ia959cf905fd0a03f7f69b6b65b2eeed8e4a62153
Reviewed-by: Kim M. Kalland <kim.kalland@nokia.com>

src/declarative/items/qquickshadereffectsource.cpp
src/declarative/items/qquickshadereffectsource_p.h

index 92e2072..e0aa9ed 100644 (file)
@@ -500,8 +500,11 @@ QQuickShaderEffectSource::~QQuickShaderEffectSource()
     if (m_provider)
         m_provider->deleteLater();
 
-    if (m_sourceItem)
-        QQuickItemPrivate::get(m_sourceItem)->derefFromEffectItem(m_hideSource);
+    if (m_sourceItem) {
+        QQuickItemPrivate *sd = QQuickItemPrivate::get(m_sourceItem);
+        sd->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
+        sd->derefFromEffectItem(m_hideSource);
+    }
 }
 
 void QQuickShaderEffectSource::ensureTexture()
@@ -580,14 +583,21 @@ QQuickItem *QQuickShaderEffectSource::sourceItem() const
     return m_sourceItem;
 }
 
+void QQuickShaderEffectSource::itemGeometryChanged(QQuickItem *item, const QRectF &newRect, const QRectF &oldRect)
+{
+    Q_ASSERT(item == m_sourceItem);
+    if (newRect.size() != oldRect.size())
+        update();
+}
+
 void QQuickShaderEffectSource::setSourceItem(QQuickItem *item)
 {
     if (item == m_sourceItem)
         return;
     if (m_sourceItem) {
-        QQuickItemPrivate::get(m_sourceItem)->derefFromEffectItem(m_hideSource);
-        disconnect(m_sourceItem, SIGNAL(widthChanged()), this, SLOT(update()));
-        disconnect(m_sourceItem, SIGNAL(heightChanged()), this, SLOT(update()));
+        QQuickItemPrivate *d = QQuickItemPrivate::get(m_sourceItem);
+        d->derefFromEffectItem(m_hideSource);
+        d->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
     }
     m_sourceItem = item;
     if (m_sourceItem) {
@@ -599,9 +609,9 @@ void QQuickShaderEffectSource::setSourceItem(QQuickItem *item)
             m_sourceItem->setParentItem(this);
             m_sourceItem->setVisible(false);
         }
-        QQuickItemPrivate::get(m_sourceItem)->refFromEffectItem(m_hideSource);
-        connect(m_sourceItem, SIGNAL(widthChanged()), this, SLOT(update()));
-        connect(m_sourceItem, SIGNAL(heightChanged()), this, SLOT(update()));
+        QQuickItemPrivate *d = QQuickItemPrivate::get(m_sourceItem);
+        d->refFromEffectItem(m_hideSource);
+        d->addItemChangeListener(this, QQuickItemPrivate::Geometry);
     }
     update();
     emit sourceItemChanged();
index b61170a..fee361c 100644 (file)
@@ -47,6 +47,7 @@
 #include <private/qsgadaptationlayer_p.h>
 #include <private/qsgcontext_p.h>
 #include <private/qsgdefaultimagenode_p.h>
+#include <private/qquickitemchangelistener_p.h>
 
 #include "qpointer.h"
 #include "qsize.h"
@@ -153,7 +154,7 @@ private:
     uint m_grab : 1;
 };
 
-class Q_DECLARATIVE_EXPORT QQuickShaderEffectSource : public QQuickItem
+class Q_DECLARATIVE_EXPORT QQuickShaderEffectSource : public QQuickItem, public QQuickItemChangeListener
 {
     Q_OBJECT
     Q_PROPERTY(WrapMode wrapMode READ wrapMode WRITE setWrapMode NOTIFY wrapModeChanged)
@@ -232,6 +233,8 @@ Q_SIGNALS:
 protected:
     virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
 
+    virtual void itemGeometryChanged(QQuickItem *item, const QRectF &newRect, const QRectF &oldRect);
+
 private:
     void ensureTexture();