diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2015-03-17 03:08:20 +0400 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2015-03-18 08:02:32 +0000 |
commit | a97f06addbfcc5018a7c42ff99de9eaef25d5cc4 (patch) | |
tree | 3b65783618e2c21e8f7f09057ebd4f1433225904 /src/core | |
parent | 5d816e2a5de1ba69e51167f6d5ec555d4a08b184 (diff) |
[QTransform] Track the transforms list and notify when it changes
This also guarantees QTransform doesn't access a deleted sub-transform.
Change-Id: Id172caa14a5ed791cb6b22fb50fcc83e9129ae44
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/transforms/qtransform.cpp | 36 | ||||
-rw-r--r-- | src/core/transforms/qtransform.h | 3 | ||||
-rw-r--r-- | src/core/transforms/qtransform_p.h | 1 |
3 files changed, 32 insertions, 8 deletions
diff --git a/src/core/transforms/qtransform.cpp b/src/core/transforms/qtransform.cpp index 6ac1403b9..0e98fdb0f 100644 --- a/src/core/transforms/qtransform.cpp +++ b/src/core/transforms/qtransform.cpp @@ -50,6 +50,15 @@ QTransformPrivate::QTransformPrivate(QTransform *qq) { } +void QTransformPrivate::_q_transformDestroyed(QObject *obj) +{ + QAbstractTransform *transform = static_cast<QAbstractTransform *>(obj); + if (m_transforms.removeOne(transform)) { + emit q_func()->transformsChanged(); + _q_update(); + } +} + void QTransformPrivate::_q_update() { if (!m_transformsDirty) @@ -59,13 +68,10 @@ void QTransformPrivate::_q_update() QMatrix4x4 QTransformPrivate::applyTransforms() const { - if (!m_transforms.isEmpty()) { - QMatrix4x4 matrix; - Q_FOREACH (const QAbstractTransform *t, m_transforms) - matrix = t->transformMatrix() * matrix; - return matrix; - } - return QMatrix4x4(); + QMatrix4x4 matrix; + Q_FOREACH (const QAbstractTransform *t, m_transforms) + matrix = t->transformMatrix() * matrix; + return matrix; } @@ -92,6 +98,13 @@ QTransform::QTransform(QTransformPrivate &dd, QNode *parent) { } +QTransform::~QTransform() +{ + Q_D(QTransform); + // boost destruction by avoiding _q_update()-s + d->m_transforms.clear(); +} + void QTransform::copy(const QNode *ref) { QComponent::copy(ref); @@ -110,16 +123,23 @@ QList<QAbstractTransform *> QTransform::transforms() const void QTransform::addTransform(QAbstractTransform *transform) { Q_D(QTransform); + if (transform == Q_NULLPTR || d->m_transforms.contains(transform)) + return; d->m_transforms.append(transform); QObject::connect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update())); + QObject::connect(transform, SIGNAL(destroyed(QObject*)), this, SLOT(_q_transformDestroyed(QObject*))); + emit transformsChanged(); d->_q_update(); } void QTransform::removeTransform(QAbstractTransform *transform) { Q_D(QTransform); - d->m_transforms.removeOne(transform); + if (!d->m_transforms.removeOne(transform)) + return; QObject::disconnect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update())); + QObject::disconnect(transform, SIGNAL(destroyed(QObject*)), this, SLOT(_q_transformDestroyed(QObject*))); + emit transformsChanged(); d->_q_update(); } diff --git a/src/core/transforms/qtransform.h b/src/core/transforms/qtransform.h index 9cb8741d6..722dcf688 100644 --- a/src/core/transforms/qtransform.h +++ b/src/core/transforms/qtransform.h @@ -57,6 +57,7 @@ public: explicit QTransform(QNode *parent = 0); QTransform(QList<QAbstractTransform *> transforms, QNode *parent = 0); QTransform(QAbstractTransform *transform, QNode *parent = 0); + ~QTransform(); QList<QAbstractTransform *> transforms() const; void addTransform(QAbstractTransform *xform); @@ -66,6 +67,7 @@ public: Q_SIGNALS: void matrixChanged(); + void transformsChanged(); protected: QTransform(QTransformPrivate &dd, QNode *parent = 0); @@ -74,6 +76,7 @@ protected: private: Q_DECLARE_PRIVATE(QTransform) QT3D_CLONEABLE(QTransform) + Q_PRIVATE_SLOT(d_func(), void _q_transformDestroyed(QObject *obj)) Q_PRIVATE_SLOT(d_func(), void _q_update()) }; diff --git a/src/core/transforms/qtransform_p.h b/src/core/transforms/qtransform_p.h index c233f7ad7..ef2e86b1b 100644 --- a/src/core/transforms/qtransform_p.h +++ b/src/core/transforms/qtransform_p.h @@ -51,6 +51,7 @@ class QTransformPrivate : public QComponentPrivate public: QTransformPrivate(QTransform *qq); + void _q_transformDestroyed(QObject *obj); void _q_update(); QMatrix4x4 applyTransforms() const; |