diff options
author | Jan Arne Petersen <jan.petersen@kdab.com> | 2016-12-06 20:59:36 +0100 |
---|---|---|
committer | Jani Heikkinen <jani.heikkinen@qt.io> | 2016-12-08 05:11:51 +0000 |
commit | cfade3a4a723c09bb6653c115afc961f8bc42b35 (patch) | |
tree | 8db1a203d1762775ca198bc1046b2da5dac55e4e | |
parent | 249b698b3963a0207aafc2cf65ce2dd9e5835676 (diff) |
Emit runningChanged signal when running changes
The QScxmlStateMachine::runningChanged signal was never emitted. Emit it
when the running property changes.
Change-Id: I9b6cb8d48c9c8d893b0af2b8f87ecd74f4e64055
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Kevin Funk <kevin.funk@kdab.com>
-rw-r--r-- | src/scxml/qscxmlstatemachine.cpp | 15 | ||||
-rw-r--r-- | tests/auto/statemachine/tst_statemachine.cpp | 21 |
2 files changed, 35 insertions, 1 deletions
diff --git a/src/scxml/qscxmlstatemachine.cpp b/src/scxml/qscxmlstatemachine.cpp index 61a37ef..6bc7ab5 100644 --- a/src/scxml/qscxmlstatemachine.cpp +++ b/src/scxml/qscxmlstatemachine.cpp @@ -609,17 +609,27 @@ void QScxmlStateMachinePrivate::submitError(const QString &type, const QString & void QScxmlStateMachinePrivate::start() { + Q_Q(QScxmlStateMachine); + if (m_stateTable->binding == StateTable::LateBinding) m_isFirstStateEntry.resize(m_stateTable->stateCount, true); + bool running = isRunnable() && !isPaused(); m_runningState = Starting; Q_ASSERT(m_stateTable->initialTransition != StateTable::InvalidIndex); + + if (!running) + emit q->runningChanged(true); } void QScxmlStateMachinePrivate::pause() { - if (isRunnable() && !isPaused()) + Q_Q(QScxmlStateMachine); + + if (isRunnable() && !isPaused()) { m_runningState = Paused; + emit q->runningChanged(false); + } } void QScxmlStateMachinePrivate::processEvents() @@ -1106,7 +1116,10 @@ void QScxmlStateMachinePrivate::enterStates(const OrderedSet &enabledTransitions m_executionEngine->execute(dhc); if (state.type == StateTable::State::Final) { if (state.parentIsScxmlElement()) { + bool running = isRunnable() && !isPaused(); m_runningState = Finished; + if (running) + emit q->runningChanged(false); } else { const auto &parent = m_stateTable->state(state.parent); m_executionEngine->execute(state.doneData, m_tableData->string(parent.name)); diff --git a/tests/auto/statemachine/tst_statemachine.cpp b/tests/auto/statemachine/tst_statemachine.cpp index f09ad42..99d6661 100644 --- a/tests/auto/statemachine/tst_statemachine.cpp +++ b/tests/auto/statemachine/tst_statemachine.cpp @@ -51,6 +51,7 @@ private Q_SLOTS: void eventOccurred(); void doneDotStateEvent(); + void running(); }; void tst_StateMachine::stateNames_data() @@ -365,6 +366,26 @@ void tst_StateMachine::doneDotStateEvent() QVERIFY(stateMachine->activeStateNames(true).contains(QLatin1String("success"))); } +void tst_StateMachine::running() +{ + QScopedPointer<QScxmlStateMachine> stateMachine( + QScxmlStateMachine::fromFile(QString(":/tst_statemachine/statenames.scxml"))); + QVERIFY(!stateMachine.isNull()); + + QSignalSpy runningChangedSpy(stateMachine.data(), SIGNAL(runningChanged(bool))); + + QCOMPARE(stateMachine->isRunning(), false); + + stateMachine->start(); + + QCOMPARE(runningChangedSpy.count(), 1); + QCOMPARE(stateMachine->isRunning(), true); + + stateMachine->stop(); + + QCOMPARE(runningChangedSpy.count(), 2); + QCOMPARE(stateMachine->isRunning(), false); +} QTEST_MAIN(tst_StateMachine) |