QDeclarative: fixed clean animation lists
authorChristiaan Janssen <christiaan.janssen@nokia.com>
Mon, 23 May 2011 14:44:29 +0000 (16:44 +0200)
committerChristiaan Janssen <christiaan.janssen@nokia.com>
Tue, 31 May 2011 10:49:23 +0000 (12:49 +0200)
Change-Id: I9dd8b4fcd3f04193410710981a511b9f69e5dc19

src/declarative/util/qdeclarativeanimation.cpp
src/declarative/util/qdeclarativetransition.cpp
src/declarative/util/qdeclarativetransitionmanager.cpp

index efaa7f0..ce21bcd 100644 (file)
@@ -1522,6 +1522,7 @@ void QDeclarativeAnimationGroupPrivate::append_animation(QDeclarativeListPropert
     QDeclarativeAnimationGroup *q = qobject_cast<QDeclarativeAnimationGroup *>(list->object);
     if (q) {
         a->setGroup(q);
+        // This is an optimization for the parenting that already occurs via addAnimation
         QDeclarative_setParent_noEvent(a->qtAnimation(), q->d_func()->ag);
         q->d_func()->ag->addAnimation(a->qtAnimation());
     }
@@ -1531,9 +1532,12 @@ void QDeclarativeAnimationGroupPrivate::clear_animation(QDeclarativeListProperty
 {
     QDeclarativeAnimationGroup *q = qobject_cast<QDeclarativeAnimationGroup *>(list->object);
     if (q) {
-        for (int i = 0; i < q->d_func()->animations.count(); ++i)
-            q->d_func()->animations.at(i)->setGroup(0);
-        q->d_func()->animations.clear();
+        while (q->d_func()->animations.count()) {
+            QDeclarativeAbstractAnimation *firstAnim = q->d_func()->animations.at(0);
+            QDeclarative_setParent_noEvent(firstAnim->qtAnimation(), 0);
+            q->d_func()->ag->removeAnimation(firstAnim->qtAnimation());
+            firstAnim->setGroup(0);
+        }
     }
 }
 
index 273060b..b63407c 100644 (file)
@@ -130,6 +130,9 @@ public:
         endState->complete();
     }
     static void append_animation(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, QDeclarativeAbstractAnimation *a);
+    static int animation_count(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list);
+    static QDeclarativeAbstractAnimation* animation_at(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, int pos);
+    static void clear_animations(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list);
     QList<QDeclarativeAbstractAnimation *> animations;
 };
 
@@ -141,6 +144,28 @@ void QDeclarativeTransitionPrivate::append_animation(QDeclarativeListProperty<QD
     a->setDisableUserControl();
 }
 
+int QDeclarativeTransitionPrivate::animation_count(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list)
+{
+    QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object);
+    return q->d_func()->animations.count();
+}
+
+QDeclarativeAbstractAnimation* QDeclarativeTransitionPrivate::animation_at(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, int pos)
+{
+    QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object);
+    return q->d_func()->animations.at(pos);
+}
+
+void QDeclarativeTransitionPrivate::clear_animations(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list)
+{
+    QDeclarativeTransition *q = static_cast<QDeclarativeTransition *>(list->object);
+    while (q->d_func()->animations.count()) {
+        QDeclarativeAbstractAnimation *firstAnim = q->d_func()->animations.at(0);
+        q->d_func()->group.removeAnimation(firstAnim->qtAnimation());
+        q->d_func()->animations.removeAll(firstAnim);
+    }
+}
+
 void ParallelAnimationWrapper::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
 {
     QParallelAnimationGroup::updateState(newState, oldState);
@@ -309,7 +334,10 @@ void QDeclarativeTransition::setToState(const QString &t)
 QDeclarativeListProperty<QDeclarativeAbstractAnimation> QDeclarativeTransition::animations()
 {
     Q_D(QDeclarativeTransition);
-    return QDeclarativeListProperty<QDeclarativeAbstractAnimation>(this, &d->animations, QDeclarativeTransitionPrivate::append_animation);
+    return QDeclarativeListProperty<QDeclarativeAbstractAnimation>(this, &d->animations, QDeclarativeTransitionPrivate::append_animation,
+                                                                   QDeclarativeTransitionPrivate::animation_count,
+                                                                   QDeclarativeTransitionPrivate::animation_at,
+                                                                   QDeclarativeTransitionPrivate::clear_animations);
 }
 
 QT_END_NAMESPACE
index 944b37f..6e96ac9 100644 (file)
@@ -56,12 +56,12 @@ class QDeclarativeTransitionManagerPrivate
 {
 public:
     QDeclarativeTransitionManagerPrivate()
-    : state(0), transition(0) {}
+        : state(0) {}
 
     void applyBindings();
     typedef QList<QDeclarativeSimpleAction> SimpleActionList;
     QDeclarativeState *state;
-    QDeclarativeTransition *transition;
+    QDeclarativeGuard<QDeclarativeTransition> transition;
     QDeclarativeStateOperation::ActionList bindingsList;
     SimpleActionList completeList;
 };
@@ -253,7 +253,7 @@ void QDeclarativeTransitionManager::cancel()
 {
     if (d->transition) {
         // ### this could potentially trigger a complete in rare circumstances
-        d->transition->stop();  
+        d->transition->stop();
         d->transition = 0;
     }