Internal state class refactoring.
authorMichael Brasser <michael.brasser@nokia.com>
Fri, 19 Aug 2011 00:14:59 +0000 (10:14 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 19 Aug 2011 01:53:11 +0000 (03:53 +0200)
Change-Id: I6e5fe3fa4459f99a50e3aa79c3a87106600f083a
Reviewed-on: http://codereview.qt.nokia.com/3231
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Charles Yin <charles.yin@nokia.com>
src/declarative/util/qdeclarativestate.cpp
src/declarative/util/qdeclarativestate_p.h
src/declarative/util/qdeclarativestate_p_p.h
src/declarative/util/qdeclarativestategroup.cpp
src/declarative/util/qdeclarativestategroup_p.h
src/declarative/util/qdeclarativetransition.cpp
src/declarative/util/qdeclarativetransitionmanager.cpp

index 63cb95d..4779208 100644 (file)
@@ -315,13 +315,15 @@ void QDeclarativeStatePrivate::complete()
     }
     reverting.clear();
 
+    if (group)
+        group->stateAboutToComplete();
     emit q->completed();
 }
 
 // Generate a list of actions for this state.  This includes coelescing state
 // actions that this state "extends"
 QDeclarativeStateOperation::ActionList
-QDeclarativeStatePrivate::generateActionList(QDeclarativeStateGroup *group) const
+QDeclarativeStatePrivate::generateActionList() const
 {
     QDeclarativeStateOperation::ActionList applyList;
     if (inState)
@@ -331,11 +333,11 @@ QDeclarativeStatePrivate::generateActionList(QDeclarativeStateGroup *group) cons
     inState = true;
 
     if (!extends.isEmpty()) {
-        QList<QDeclarativeState *> states = group->states();
+        QList<QDeclarativeState *> states = group ? group->states() : QList<QDeclarativeState *>();
         for (int ii = 0; ii < states.count(); ++ii)
             if (states.at(ii)->name() == extends) {
                 qmlExecuteDeferred(states.at(ii));
-                applyList = static_cast<QDeclarativeStatePrivate*>(states.at(ii)->d_func())->generateActionList(group);
+                applyList = static_cast<QDeclarativeStatePrivate*>(states.at(ii)->d_func())->generateActionList();
             }
     }
 
@@ -559,7 +561,7 @@ bool QDeclarativeState::isStateActive() const
     return stateGroup() && stateGroup()->state() == name();
 }
 
-void QDeclarativeState::apply(QDeclarativeStateGroup *group, QDeclarativeTransition *trans, QDeclarativeState *revert)
+void QDeclarativeState::apply(QDeclarativeTransition *trans, QDeclarativeState *revert)
 {
     Q_D(QDeclarativeState);
 
@@ -579,7 +581,7 @@ void QDeclarativeState::apply(QDeclarativeStateGroup *group, QDeclarativeTransit
     }
 
     // List of actions caused by this state
-    QDeclarativeStateOperation::ActionList applyList = d->generateActionList(group);
+    QDeclarativeStateOperation::ActionList applyList = d->generateActionList();
 
     // List of actions that need to be reverted to roll back (just) this state
     QDeclarativeStatePrivate::SimpleActionList additionalReverts;
index d24304c..a7aafe3 100644 (file)
@@ -174,7 +174,7 @@ public:
 
     QDeclarativeState &operator<<(QDeclarativeStateOperation *);
 
-    void apply(QDeclarativeStateGroup *, QDeclarativeTransition *, QDeclarativeState *revert);
+    void apply(QDeclarativeTransition *, QDeclarativeState *revert);
     void cancel();
 
     QDeclarativeStateGroup *stateGroup() const;
index 195b935..2479413 100644 (file)
@@ -246,7 +246,7 @@ public:
     mutable bool inState;
     QDeclarativeStateGroup *group;
 
-    QDeclarativeStateOperation::ActionList generateActionList(QDeclarativeStateGroup *) const;
+    QDeclarativeStateOperation::ActionList generateActionList() const;
     void complete();
 };
 
index df16c16..4f95930 100644 (file)
@@ -474,15 +474,17 @@ void QDeclarativeStateGroupPrivate::setCurrentStateInternal(const QString &state
     }
 
     if (oldState == 0 || newState == 0) {
-        if (!nullState) { nullState = new QDeclarativeState; QDeclarative_setParent_noEvent(nullState, q); }
+        if (!nullState) {
+            nullState = new QDeclarativeState;
+            QDeclarative_setParent_noEvent(nullState, q);
+            nullState->setStateGroup(q);
+        }
         if (!oldState) oldState = nullState;
         if (!newState) newState = nullState;
     }
 
-    newState->apply(q, transition, oldState);
-    applyingState = false;
-    if (!transition)
-        static_cast<QDeclarativeStatePrivate*>(QObjectPrivate::get(newState))->complete();
+    newState->apply(transition, oldState);
+    applyingState = false;  //### consider removing this (don't allow state changes in transition)
 }
 
 QDeclarativeState *QDeclarativeStateGroup::findState(const QString &name) const
@@ -503,6 +505,12 @@ void QDeclarativeStateGroup::removeState(QDeclarativeState *state)
     d->states.removeOne(state);
 }
 
+void QDeclarativeStateGroup::stateAboutToComplete()
+{
+    Q_D(QDeclarativeStateGroup);
+    d->applyingState = false;
+}
+
 QT_END_NAMESPACE
 
 
index 65d9536..e539f3f 100644 (file)
@@ -74,6 +74,7 @@ public:
     QDeclarativeListProperty<QDeclarativeTransition> transitionsProperty();
 
     QDeclarativeState *findState(const QString &name) const;
+    void removeState(QDeclarativeState *state);
 
     virtual void classBegin();
     virtual void componentComplete();
@@ -82,8 +83,9 @@ Q_SIGNALS:
 
 private:
     friend class QDeclarativeState;
+    friend class QDeclarativeStatePrivate;
     bool updateAutoState();
-    void removeState(QDeclarativeState *state);
+    void stateAboutToComplete();
 };
 
 QT_END_NAMESPACE
index 5351f8a..df22a57 100644 (file)
@@ -113,7 +113,7 @@ class QDeclarativeTransitionPrivate : public QObjectPrivate
 public:
     QDeclarativeTransitionPrivate()
     : fromState(QLatin1String("*")), toState(QLatin1String("*")),
-      reversed(false), reversible(false), enabled(true), endState(0)
+      reversed(false), reversible(false), enabled(true), manager(0)
     {
         group.trans = this;
     }
@@ -124,11 +124,11 @@ public:
     bool reversible;
     bool enabled;
     ParallelAnimationWrapper group;
-    QDeclarativeTransitionManager *endState;
+    QDeclarativeTransitionManager *manager;
 
     void complete()
     {
-        endState->complete();
+        manager->complete();
     }
     static void append_animation(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list, QDeclarativeAbstractAnimation *a);
     static int animation_count(QDeclarativeListProperty<QDeclarativeAbstractAnimation> *list);
@@ -203,7 +203,7 @@ void QDeclarativeTransition::setReversed(bool r)
 
 void QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &actions,
                             QList<QDeclarativeProperty> &after,
-                            QDeclarativeTransitionManager *endState)
+                            QDeclarativeTransitionManager *manager)
 {
     Q_D(QDeclarativeTransition);
 
@@ -219,7 +219,7 @@ void QDeclarativeTransition::prepare(QDeclarativeStateOperation::ActionList &act
         }
     }
 
-    d->endState = endState;
+    d->manager = manager;
     d->group.setDirection(d->reversed ? QAbstractAnimation::Backward : QAbstractAnimation::Forward);
     d->group.start();
 }
index 6e96ac9..0b549b7 100644 (file)
@@ -246,7 +246,7 @@ void QDeclarativeTransitionManager::transition(const QList<QDeclarativeAction> &
     }
 #endif
     if (!transition)
-        d->applyBindings();
+        complete();
 }
 
 void QDeclarativeTransitionManager::cancel()