diff options
Diffstat (limited to 'src/corelib/statemachine')
-rw-r--r-- | src/corelib/statemachine/qabstractstate.cpp | 39 | ||||
-rw-r--r-- | src/corelib/statemachine/qabstractstate.h | 4 | ||||
-rw-r--r-- | src/corelib/statemachine/qabstractstate_p.h | 3 | ||||
-rw-r--r-- | src/corelib/statemachine/qabstracttransition.cpp | 33 | ||||
-rw-r--r-- | src/corelib/statemachine/qabstracttransition.h | 14 | ||||
-rw-r--r-- | src/corelib/statemachine/qhistorystate.cpp | 28 | ||||
-rw-r--r-- | src/corelib/statemachine/qhistorystate.h | 16 | ||||
-rw-r--r-- | src/corelib/statemachine/qsignaltransition.cpp | 21 | ||||
-rw-r--r-- | src/corelib/statemachine/qsignaltransition.h | 17 | ||||
-rw-r--r-- | src/corelib/statemachine/qstate.cpp | 42 | ||||
-rw-r--r-- | src/corelib/statemachine/qstate.h | 21 | ||||
-rw-r--r-- | src/corelib/statemachine/qstatemachine.cpp | 42 | ||||
-rw-r--r-- | src/corelib/statemachine/qstatemachine.h | 4 |
13 files changed, 265 insertions, 19 deletions
diff --git a/src/corelib/statemachine/qabstractstate.cpp b/src/corelib/statemachine/qabstractstate.cpp index 62b7e448f5..da1eff9b4c 100644 --- a/src/corelib/statemachine/qabstractstate.cpp +++ b/src/corelib/statemachine/qabstractstate.cpp @@ -79,8 +79,17 @@ QT_BEGIN_NAMESPACE function to perform custom processing when the state is exited. */ +/*! + \property QAbstractState::active + \since 5.4 + + \brief the active property of this state. A state is active between + entered() and exited() signals. +*/ + + QAbstractStatePrivate::QAbstractStatePrivate(StateType type) - : stateType(type), isMachine(false), parentState(0) + : stateType(type), isMachine(false), active(false), parentState(0) { } @@ -121,11 +130,19 @@ void QAbstractStatePrivate::emitEntered() { Q_Q(QAbstractState); emit q->entered(QAbstractState::QPrivateSignal()); + if (!active) { + active = true; + emit q->activeChanged(true); + } } void QAbstractStatePrivate::emitExited() { Q_Q(QAbstractState); + if (active) { + active = false; + emit q->activeChanged(false); + } emit q->exited(QAbstractState::QPrivateSignal()); } @@ -174,6 +191,17 @@ QStateMachine *QAbstractState::machine() const } /*! + Returns whether this state is active. + + \sa activeChanged(bool), entered(), exited() +*/ +bool QAbstractState::active() const +{ + Q_D(const QAbstractState); + return d->active; +} + +/*! \fn QAbstractState::onExit(QEvent *event) This function is called when the state is exited. The given \a event is what @@ -204,6 +232,15 @@ QStateMachine *QAbstractState::machine() const */ /*! + \fn QAbstractState::activeChanged(bool active) + \since 5.4 + + This signal is emitted when the active property is changed. + + \sa QAbstractState::active, entered(), exited() +*/ + +/*! \reimp */ bool QAbstractState::event(QEvent *e) diff --git a/src/corelib/statemachine/qabstractstate.h b/src/corelib/statemachine/qabstractstate.h index a6ac248b85..4318a5b419 100644 --- a/src/corelib/statemachine/qabstractstate.h +++ b/src/corelib/statemachine/qabstractstate.h @@ -56,12 +56,15 @@ class QAbstractStatePrivate; class Q_CORE_EXPORT QAbstractState : public QObject { Q_OBJECT + Q_PROPERTY(bool active READ active NOTIFY activeChanged) public: ~QAbstractState(); QState *parentState() const; QStateMachine *machine() const; + bool active() const; + Q_SIGNALS: void entered( #if !defined(Q_QDOC) @@ -73,6 +76,7 @@ Q_SIGNALS: QPrivateSignal #endif ); + void activeChanged(bool active); protected: QAbstractState(QState *parent = 0); diff --git a/src/corelib/statemachine/qabstractstate_p.h b/src/corelib/statemachine/qabstractstate_p.h index b0334dfbb5..40431a8fcb 100644 --- a/src/corelib/statemachine/qabstractstate_p.h +++ b/src/corelib/statemachine/qabstractstate_p.h @@ -85,8 +85,9 @@ public: void emitEntered(); void emitExited(); - uint stateType:31; + uint stateType:30; uint isMachine:1; + bool active:1; mutable QState *parentState; }; diff --git a/src/corelib/statemachine/qabstracttransition.cpp b/src/corelib/statemachine/qabstracttransition.cpp index 49091de8a8..e446c69519 100644 --- a/src/corelib/statemachine/qabstracttransition.cpp +++ b/src/corelib/statemachine/qabstracttransition.cpp @@ -201,10 +201,15 @@ QAbstractState *QAbstractTransition::targetState() const void QAbstractTransition::setTargetState(QAbstractState* target) { Q_D(QAbstractTransition); + if ((d->targetStates.size() == 1 && target == d->targetStates.at(0).data()) || + (d->targetStates.isEmpty() && target == 0)) { + return; + } if (!target) d->targetStates.clear(); else setTargetStates(QList<QAbstractState*>() << target); + emit targetStateChanged(QPrivateSignal()); } /*! @@ -229,18 +234,26 @@ QList<QAbstractState*> QAbstractTransition::targetStates() const void QAbstractTransition::setTargetStates(const QList<QAbstractState*> &targets) { Q_D(QAbstractTransition); - + QList<QPointer<QAbstractState> > copy(d->targetStates); + bool sameList = true; for (int i = 0; i < targets.size(); ++i) { QAbstractState *target = targets.at(i); if (!target) { qWarning("QAbstractTransition::setTargetStates: target state(s) cannot be null"); return; + } else { + sameList &= copy.removeOne(target); } } + sameList &= copy.isEmpty(); + d->targetStates.clear(); for (int i = 0; i < targets.size(); ++i) d->targetStates.append(targets.at(i)); + + if (!sameList) + emit targetStatesChanged(QPrivateSignal()); } /*! @@ -324,6 +337,24 @@ QList<QAbstractAnimation*> QAbstractTransition::animations() const */ /*! + \fn QAbstractTransition::targetStateChanged() + \since 5.4 + + This signal is emitted when the targetState property is changed. + + \sa QAbstractTransition::targetState +*/ + +/*! + \fn QAbstractTransition::targetStatesChanged() + \since 5.4 + + This signal is emitted when the targetStates property is changed. + + \sa QAbstractTransition::targetStates +*/ + +/*! \reimp */ bool QAbstractTransition::event(QEvent *e) diff --git a/src/corelib/statemachine/qabstracttransition.h b/src/corelib/statemachine/qabstracttransition.h index a35ad4ca96..ac3b40e55e 100644 --- a/src/corelib/statemachine/qabstracttransition.h +++ b/src/corelib/statemachine/qabstracttransition.h @@ -65,8 +65,8 @@ class Q_CORE_EXPORT QAbstractTransition : public QObject { Q_OBJECT Q_PROPERTY(QState* sourceState READ sourceState) - Q_PROPERTY(QAbstractState* targetState READ targetState WRITE setTargetState) - Q_PROPERTY(QList<QAbstractState*> targetStates READ targetStates WRITE setTargetStates) + Q_PROPERTY(QAbstractState* targetState READ targetState WRITE setTargetState NOTIFY targetStateChanged) + Q_PROPERTY(QList<QAbstractState*> targetStates READ targetStates WRITE setTargetStates NOTIFY targetStatesChanged) public: QAbstractTransition(QState *sourceState = 0); virtual ~QAbstractTransition(); @@ -91,6 +91,16 @@ Q_SIGNALS: QPrivateSignal #endif ); + void targetStateChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + void targetStatesChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); protected: virtual bool eventTest(QEvent *event) = 0; diff --git a/src/corelib/statemachine/qhistorystate.cpp b/src/corelib/statemachine/qhistorystate.cpp index 65ac2a77a0..1706d86afd 100644 --- a/src/corelib/statemachine/qhistorystate.cpp +++ b/src/corelib/statemachine/qhistorystate.cpp @@ -181,7 +181,10 @@ void QHistoryState::setDefaultState(QAbstractState *state) "to this history state's group (%p)", state, parentState()); return; } - d->defaultState = state; + if (d->defaultState != state) { + d->defaultState = state; + emit defaultStateChanged(QHistoryState::QPrivateSignal()); + } } /*! @@ -199,7 +202,10 @@ QHistoryState::HistoryType QHistoryState::historyType() const void QHistoryState::setHistoryType(HistoryType type) { Q_D(QHistoryState); - d->historyType = type; + if (d->historyType != type) { + d->historyType = type; + emit historyTypeChanged(QHistoryState::QPrivateSignal()); + } } /*! @@ -226,6 +232,24 @@ bool QHistoryState::event(QEvent *e) return QAbstractState::event(e); } +/*! + \fn QHistoryState::defaultStateChanged() + \since 5.4 + + This signal is emitted when the defaultState property is changed. + + \sa QHistoryState::defaultState +*/ + +/*! + \fn QHistoryState::historyTypeChanged() + \since 5.4 + + This signal is emitted when the historyType property is changed. + + \sa QHistoryState::historyType +*/ + QT_END_NAMESPACE #endif //QT_NO_STATEMACHINE diff --git a/src/corelib/statemachine/qhistorystate.h b/src/corelib/statemachine/qhistorystate.h index 62278ac47a..024c7e4b1f 100644 --- a/src/corelib/statemachine/qhistorystate.h +++ b/src/corelib/statemachine/qhistorystate.h @@ -53,8 +53,8 @@ class QHistoryStatePrivate; class Q_CORE_EXPORT QHistoryState : public QAbstractState { Q_OBJECT - Q_PROPERTY(QAbstractState* defaultState READ defaultState WRITE setDefaultState) - Q_PROPERTY(HistoryType historyType READ historyType WRITE setHistoryType) + Q_PROPERTY(QAbstractState* defaultState READ defaultState WRITE setDefaultState NOTIFY defaultStateChanged) + Q_PROPERTY(HistoryType historyType READ historyType WRITE setHistoryType NOTIFY historyTypeChanged) Q_ENUMS(HistoryType) public: enum HistoryType { @@ -72,6 +72,18 @@ public: HistoryType historyType() const; void setHistoryType(HistoryType type); +Q_SIGNALS: + void defaultStateChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + void historyTypeChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + protected: void onEntry(QEvent *event); void onExit(QEvent *event); diff --git a/src/corelib/statemachine/qsignaltransition.cpp b/src/corelib/statemachine/qsignaltransition.cpp index f1f4786bcc..259aaf52e9 100644 --- a/src/corelib/statemachine/qsignaltransition.cpp +++ b/src/corelib/statemachine/qsignaltransition.cpp @@ -185,6 +185,7 @@ void QSignalTransition::setSenderObject(const QObject *sender) d->unregister(); d->sender = sender; d->maybeRegister(); + emit senderObjectChanged(QPrivateSignal()); } /*! @@ -207,6 +208,7 @@ void QSignalTransition::setSignal(const QByteArray &signal) d->unregister(); d->signal = signal; d->maybeRegister(); + emit signalChanged(QPrivateSignal()); } /*! @@ -245,6 +247,24 @@ bool QSignalTransition::event(QEvent *e) return QAbstractTransition::event(e); } +/*! + \fn QSignalTransition::senderObjectChanged() + \since 5.4 + + This signal is emitted when the senderObject property is changed. + + \sa QSignalTransition::senderObject +*/ + +/*! + \fn QSignalTransition::signalChanged() + \since 5.4 + + This signal is emitted when the signal property is changed. + + \sa QSignalTransition::signal +*/ + void QSignalTransitionPrivate::callOnTransition(QEvent *e) { Q_Q(QSignalTransition); @@ -260,6 +280,7 @@ void QSignalTransitionPrivate::callOnTransition(QEvent *e) } } + QT_END_NAMESPACE #endif //QT_NO_STATEMACHINE diff --git a/src/corelib/statemachine/qsignaltransition.h b/src/corelib/statemachine/qsignaltransition.h index 12f021d78e..792fb12a14 100644 --- a/src/corelib/statemachine/qsignaltransition.h +++ b/src/corelib/statemachine/qsignaltransition.h @@ -53,8 +53,9 @@ class QSignalTransitionPrivate; class Q_CORE_EXPORT QSignalTransition : public QAbstractTransition { Q_OBJECT - Q_PROPERTY(QObject* senderObject READ senderObject WRITE setSenderObject) - Q_PROPERTY(QByteArray signal READ signal WRITE setSignal) + Q_PROPERTY(QObject* senderObject READ senderObject WRITE setSenderObject NOTIFY senderObjectChanged) + Q_PROPERTY(QByteArray signal READ signal WRITE setSignal NOTIFY signalChanged) + public: QSignalTransition(QState *sourceState = 0); QSignalTransition(const QObject *sender, const char *signal, @@ -73,6 +74,18 @@ protected: bool event(QEvent *e); +Q_SIGNALS: + void senderObjectChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + void signalChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + private: Q_DISABLE_COPY(QSignalTransition) Q_DECLARE_PRIVATE(QSignalTransition) diff --git a/src/corelib/statemachine/qstate.cpp b/src/corelib/statemachine/qstate.cpp index f3b4c5f235..e9baddc569 100644 --- a/src/corelib/statemachine/qstate.cpp +++ b/src/corelib/statemachine/qstate.cpp @@ -309,7 +309,10 @@ void QState::setErrorState(QAbstractState *state) return; } - d->errorState = state; + if (d->errorState != state) { + d->errorState = state; + emit errorStateChanged(QState::QPrivateSignal()); + } } /*! @@ -491,7 +494,10 @@ void QState::setInitialState(QAbstractState *state) state, this); return; } - d->initialState = state; + if (d->initialState != state) { + d->initialState = state; + emit initialStateChanged(QState::QPrivateSignal()); + } } /*! @@ -509,7 +515,10 @@ QState::ChildMode QState::childMode() const void QState::setChildMode(ChildMode mode) { Q_D(QState); - d->childMode = mode; + if (d->childMode != mode) { + d->childMode = mode; + emit childModeChanged(QState::QPrivateSignal()); + } } /*! @@ -549,6 +558,33 @@ bool QState::event(QEvent *e) \sa QState::assignProperty(), QAbstractTransition::addAnimation() */ +/*! + \fn QState::childModeChanged() + \since 5.4 + + This signal is emitted when the childMode property is changed. + + \sa QState::childMode +*/ + +/*! + \fn QState::initialStateChanged() + \since 5.4 + + This signal is emitted when the initialState property is changed. + + \sa QState::initialState +*/ + +/*! + \fn QState::errorStateChanged() + \since 5.4 + + This signal is emitted when the errorState property is changed. + + \sa QState::errorState +*/ + QT_END_NAMESPACE #endif //QT_NO_STATEMACHINE diff --git a/src/corelib/statemachine/qstate.h b/src/corelib/statemachine/qstate.h index a5f2509ffb..09c98c30c6 100644 --- a/src/corelib/statemachine/qstate.h +++ b/src/corelib/statemachine/qstate.h @@ -58,9 +58,9 @@ class QStatePrivate; class Q_CORE_EXPORT QState : public QAbstractState { Q_OBJECT - Q_PROPERTY(QAbstractState* initialState READ initialState WRITE setInitialState) - Q_PROPERTY(QAbstractState* errorState READ errorState WRITE setErrorState) - Q_PROPERTY(ChildMode childMode READ childMode WRITE setChildMode) + Q_PROPERTY(QAbstractState* initialState READ initialState WRITE setInitialState NOTIFY initialStateChanged) + Q_PROPERTY(QAbstractState* errorState READ errorState WRITE setErrorState NOTIFY errorStateChanged) + Q_PROPERTY(ChildMode childMode READ childMode WRITE setChildMode NOTIFY childModeChanged) Q_ENUMS(ChildMode RestorePolicy) public: enum ChildMode { @@ -108,6 +108,21 @@ Q_SIGNALS: QPrivateSignal #endif ); + void childModeChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + void initialStateChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + void errorStateChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); protected: void onEntry(QEvent *event); diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index a79f9d30d2..0e6fad48df 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -163,6 +163,13 @@ QT_BEGIN_NAMESPACE QState::DontRestoreProperties. */ +/*! + \property QStateMachine::running + \since 5.4 + + \brief the running state of this state machine +*/ + #ifndef QT_NO_ANIMATION /*! \property QStateMachine::animated @@ -1358,6 +1365,11 @@ void QStateMachinePrivate::_q_start() { Q_Q(QStateMachine); Q_ASSERT(state == Starting); + foreach (QAbstractState *state, configuration) { + QAbstractStatePrivate *abstractStatePrivate = QAbstractStatePrivate::get(state); + abstractStatePrivate->active = false; + emit state->activeChanged(false); + } configuration.clear(); qDeleteAll(internalEventQueue); internalEventQueue.clear(); @@ -1405,6 +1417,7 @@ void QStateMachinePrivate::_q_start() #endif emit q->started(QStateMachine::QPrivateSignal()); + emit q->runningChanged(true); if (stopProcessingReason == Finished) { // The state machine immediately reached a final state. @@ -1412,6 +1425,7 @@ void QStateMachinePrivate::_q_start() state = NotRunning; unregisterAllTransitions(); emitFinished(); + emit q->runningChanged(false); } else { _q_process(); } @@ -1494,12 +1508,14 @@ void QStateMachinePrivate::_q_process() cancelAllDelayedEvents(); unregisterAllTransitions(); emitFinished(); + emit q->runningChanged(false); break; case Stopped: state = NotRunning; cancelAllDelayedEvents(); unregisterAllTransitions(); emit q->stopped(QStateMachine::QPrivateSignal()); + emit q->runningChanged(false); break; } } @@ -2113,7 +2129,7 @@ bool QStateMachine::isRunning() const the main application event loop started with QCoreApplication::exec() or QApplication::exec(). - \sa started(), finished(), stop(), initialState() + \sa started(), finished(), stop(), initialState(), setRunning() */ void QStateMachine::start() { @@ -2141,7 +2157,7 @@ void QStateMachine::start() Stops this state machine. The state machine will stop processing events and then emit the stopped() signal. - \sa stopped(), start() + \sa stopped(), start(), setRunning() */ void QStateMachine::stop() { @@ -2161,6 +2177,19 @@ void QStateMachine::stop() } /*! + Convenience functions to start/stop this state machine. + + \sa start(), stop(), started(), finished(), stopped() +*/ +void QStateMachine::setRunning(bool running) +{ + if (running) + start(); + else + stop(); +} + +/*! \threadsafe Posts the given \a event of the given \a priority for processing by this @@ -2708,6 +2737,15 @@ QStateMachine::WrappedEvent::~WrappedEvent() Returns a clone of the original event. */ +/*! + \fn QStateMachine::runningChanged(bool running) + \since 5.4 + + This signal is emitted when the running property is changed. + + \sa QStateMachine::running +*/ + QT_END_NAMESPACE #include "qstatemachine.moc" diff --git a/src/corelib/statemachine/qstatemachine.h b/src/corelib/statemachine/qstatemachine.h index 9305676bb5..0092c4d0c5 100644 --- a/src/corelib/statemachine/qstatemachine.h +++ b/src/corelib/statemachine/qstatemachine.h @@ -62,6 +62,7 @@ class Q_CORE_EXPORT QStateMachine : public QState Q_OBJECT Q_PROPERTY(QString errorString READ errorString) Q_PROPERTY(QState::RestorePolicy globalRestorePolicy READ globalRestorePolicy WRITE setGlobalRestorePolicy) + Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged) #ifndef QT_NO_ANIMATION Q_PROPERTY(bool animated READ isAnimated WRITE setAnimated) #endif @@ -149,6 +150,7 @@ public: public Q_SLOTS: void start(); void stop(); + void setRunning(bool running); Q_SIGNALS: void started( @@ -161,6 +163,8 @@ Q_SIGNALS: QPrivateSignal #endif ); + void runningChanged(bool running); + protected: void onEntry(QEvent *event); |