summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2015-03-17 03:08:20 +0400
committerKonstantin Ritt <ritt.ks@gmail.com>2015-03-18 08:02:32 +0000
commita97f06addbfcc5018a7c42ff99de9eaef25d5cc4 (patch)
tree3b65783618e2c21e8f7f09057ebd4f1433225904 /src/core
parent5d816e2a5de1ba69e51167f6d5ec555d4a08b184 (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.cpp36
-rw-r--r--src/core/transforms/qtransform.h3
-rw-r--r--src/core/transforms/qtransform_p.h1
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;