statemachine: Get rid of hidden start state
authorKent Hansen <kent.hansen@nokia.com>
Sat, 7 Jul 2012 02:33:30 +0000 (04:33 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 11 Jul 2012 06:42:24 +0000 (08:42 +0200)
The hidden start state was used as a mechanism for performing the
initial transition (to the real initial state,
QStateMachine::setInitialState()), but it mutated the state machine
in a way that causes problems when the root state is a parallel
state group (see future commit).

Change-Id: I41ac4f6bcabf3bec0a412e46282a1373928105a3
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
src/corelib/statemachine/qstatemachine.cpp
src/corelib/statemachine/qstatemachine_p.h

index 5bc883b..2e37af3 100644 (file)
@@ -186,7 +186,6 @@ QStateMachinePrivate::QStateMachinePrivate()
     isMachine = true;
 
     state = NotRunning;
-    _startState = 0;
     processing = false;
     processingScheduled = false;
     stop = false;
@@ -511,9 +510,11 @@ QList<QAbstractState*> QStateMachinePrivate::computeStatesToEnter(const QList<QA
             QList<QAbstractState*> lst = t->targetStates();
             if (lst.isEmpty())
                 continue;
-            lst.prepend(t->sourceState());
+            QAbstractState *src = t->sourceState();
+            if (src)
+                lst.prepend(src);
             QState *lca = findLCA(lst);
-            for (int j = 1; j < lst.size(); ++j) {
+            for (int j = src ? 1 : 0; j < lst.size(); ++j) {
                 QAbstractState *s = lst.at(j);
                 addStatesToEnter(s, lca, statesToEnter, statesForDefaultEntry);
                 if (isParallel(lca)) {
@@ -1282,16 +1283,6 @@ void QStateMachinePrivate::initializeAnimations(QAbstractState *state, const QLi
 
 namespace {
 
-class StartState : public QState
-{
-public:
-    StartState(QState *parent)
-        : QState(parent) {}
-protected:
-    void onEntry(QEvent *) {}
-    void onExit(QEvent *) {}
-};
-
 class InitialTransition : public QAbstractTransition
 {
 public:
@@ -1305,20 +1296,6 @@ protected:
 
 } // namespace
 
-QState *QStateMachinePrivate::startState()
-{
-    Q_Q(QStateMachine);
-    if (_startState == 0)
-        _startState = new StartState(q);
-    return _startState;
-}
-
-void QStateMachinePrivate::removeStartState()
-{
-    delete _startState;
-    _startState = 0;
-}
-
 void QStateMachinePrivate::clearHistory()
 {
     Q_Q(QStateMachine);
@@ -1348,22 +1325,13 @@ void QStateMachinePrivate::_q_start()
     state = Running;
     processingScheduled = true; // we call _q_process() below
 
-    QState *start = startState();
-    Q_ASSERT(start != 0);
-
-    QList<QAbstractTransition*> transitions = QStatePrivate::get(start)->transitions();
-
-    // If a transition has already been added, then we skip this step, as the
-    // initial transition in that case has been overridden.
-    if (transitions.isEmpty()) {
-        QAbstractTransition *initialTransition = new InitialTransition(initial);
-        start->addTransition(initialTransition);
-        transitions.append(initialTransition);
-    }
+    QList<QAbstractTransition*> transitions;
+    QAbstractTransition *initialTransition = new InitialTransition(initial);
+    transitions.append(initialTransition);
 
     QEvent nullEvent(QEvent::None);
     executeTransitionContent(&nullEvent, transitions);
-    QList<QAbstractState*> exitedStates = QList<QAbstractState*>() << start;
+    QList<QAbstractState*> exitedStates = QList<QAbstractState*>();
     QSet<QAbstractState*> statesForDefaultEntry;
     QList<QAbstractState*> enteredStates = computeStatesToEnter(transitions,
                                                                 statesForDefaultEntry);
@@ -1379,7 +1347,7 @@ void QStateMachinePrivate::_q_start()
                 , selectedAnimations
 #endif
                 );
-    removeStartState();
+    delete initialTransition;
 
 #ifdef QSTATEMACHINE_DEBUG
     qDebug() << q << ": initial configuration:" << configuration;
index 2f57f54..c68ff41 100644 (file)
@@ -127,9 +127,6 @@ public:
 
     QState *rootState() const;
 
-    QState *startState();
-    void removeStartState();
-
     void clearHistory();
 
     void microstep(QEvent *event, const QList<QAbstractTransition*> &transitionList);
@@ -208,7 +205,6 @@ public:
 #endif
 
     State state;
-    QState *_startState;
     bool processing;
     bool processingScheduled;
     bool stop;