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() << target); + emit targetStateChanged(QPrivateSignal()); } /*! @@ -229,18 +234,26 @@ QList QAbstractTransition::targetStates() const void QAbstractTransition::setTargetStates(const QList &targets) { Q_D(QAbstractTransition); - + QList > 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()); } /*! @@ -323,6 +336,24 @@ QList QAbstractTransition::animations() const onTransition() has been called). */ +/*! + \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 */ 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 targetStates READ targetStates WRITE setTargetStates) + Q_PROPERTY(QAbstractState* targetState READ targetState WRITE setTargetState NOTIFY targetStateChanged) + Q_PROPERTY(QList targetStates READ targetStates WRITE setTargetStates NOTIFY targetStatesChanged) public: QAbstractTransition(QState *sourceState = 0); virtual ~QAbstractTransition(); @@ -89,6 +89,16 @@ Q_SIGNALS: void triggered( #if !defined(Q_QDOC) QPrivateSignal +#endif + ); + void targetStateChanged( +#if !defined(Q_QDOC) + QPrivateSignal +#endif + ); + void targetStatesChanged( +#if !defined(Q_QDOC) + QPrivateSignal #endif );