Change animation grouping and ownership model.
authorMichael Brasser <michael.brasser@nokia.com>
Tue, 29 May 2012 01:15:11 +0000 (11:15 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 30 May 2012 01:14:15 +0000 (03:14 +0200)
Don't rely on QObject ownership.

Change-Id: Id1b27a5f8a15ef24c34b206d5736aad344bf9ada
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
src/quick/util/qquickanimation.cpp
src/quick/util/qquickanimation_p.h

index bc39355..f6e2e57 100644 (file)
@@ -89,6 +89,8 @@ QQuickAbstractAnimation::QQuickAbstractAnimation(QObject *parent)
 QQuickAbstractAnimation::~QQuickAbstractAnimation()
 {
     Q_D(QQuickAbstractAnimation);
+    if (d->group)
+        setGroup(0);    //remove from group
     delete d->animationInstance;
 }
 
@@ -431,15 +433,12 @@ void QQuickAbstractAnimation::setGroup(QQuickAnimationGroup *g)
     if (d->group == g)
         return;
     if (d->group)
-        static_cast<QQuickAnimationGroupPrivate *>(d->group->d_func())->animations.removeAll(this);
+        d->group->d_func()->animations.removeAll(this);
 
     d->group = g;
 
-    if (d->group && !static_cast<QQuickAnimationGroupPrivate *>(d->group->d_func())->animations.contains(this))
-        static_cast<QQuickAnimationGroupPrivate *>(d->group->d_func())->animations.append(this);
-
-    //if (g) //if removed from a group, then the group should no longer be the parent
-        setParent(g);
+    if (d->group && !d->group->d_func()->animations.contains(this))
+        d->group->d_func()->animations.append(this);
 }
 
 /*!
@@ -1620,6 +1619,10 @@ void QQuickAnimationGroupPrivate::clear_animation(QQmlListProperty<QQuickAbstrac
 
 QQuickAnimationGroup::~QQuickAnimationGroup()
 {
+    Q_D(QQuickAnimationGroup);
+    for (int i = 0; i < d->animations.count(); ++i)
+        d->animations.at(i)->d_func()->group = 0;
+    d->animations.clear();
 }
 
 QQmlListProperty<QQuickAbstractAnimation> QQuickAnimationGroup::animations()
index 5a51319..0fd746c 100644 (file)
@@ -139,6 +139,7 @@ private:
     void notifyRunningChanged(bool running);
     friend class QQuickBehavior;
     friend class QQuickBehaviorPrivate;
+    friend class QQuickAnimationGroup;
 };
 
 class QQuickPauseAnimationPrivate;