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()
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) {
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();
#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"
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)
protected:
virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+ virtual void itemGeometryChanged(QQuickItem *item, const QRectF &newRect, const QRectF &oldRect);
+
private:
void ensureTexture();