diff options
author | Juha Vuolle <juha.vuolle@insta.fi> | 2021-03-03 12:29:05 +0200 |
---|---|---|
committer | Juha Vuolle <juha.vuolle@insta.fi> | 2021-05-03 13:51:59 +0300 |
commit | 4e28b3753e297541baaa45ef6c5651989ff7ce82 (patch) | |
tree | 618ac9ff4534505733a0a19ae2941cb1657d6383 | |
parent | 28c1702e69800dc89748c184d449b775a049968f (diff) |
QtStateMachine QML-facing properties' bindable support part 3
This commit covers these QML-facing classes:
QSignalTransition
Task-number: QTBUG-91375
Change-Id: I0f55f55c5198d30260762583ec10d35351e217b6
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
-rw-r--r-- | src/statemachine/qsignaltransition.cpp | 33 | ||||
-rw-r--r-- | src/statemachine/qsignaltransition.h | 8 | ||||
-rw-r--r-- | src/statemachine/qsignaltransition_p.h | 17 | ||||
-rw-r--r-- | src/statemachine/qstatemachine.cpp | 4 | ||||
-rw-r--r-- | tests/auto/qstatemachine/qstatemachine/tst_qstatemachine.cpp | 13 |
5 files changed, 61 insertions, 14 deletions
diff --git a/src/statemachine/qsignaltransition.cpp b/src/statemachine/qsignaltransition.cpp index ff60a66..516298a 100644 --- a/src/statemachine/qsignaltransition.cpp +++ b/src/statemachine/qsignaltransition.cpp @@ -107,7 +107,6 @@ QT_BEGIN_NAMESPACE QSignalTransitionPrivate::QSignalTransitionPrivate() { - sender = nullptr; signalIndex = -1; } @@ -143,8 +142,8 @@ QSignalTransition::QSignalTransition(const QObject *sender, const char *signal, : QAbstractTransition(*new QSignalTransitionPrivate, sourceState) { Q_D(QSignalTransition); - d->sender = sender; - d->signal = signal; + d->senderObject.setValueBypassingBindings(sender); + d->signal.setValueBypassingBindings(signal); d->maybeRegister(); } @@ -172,7 +171,7 @@ QSignalTransition::~QSignalTransition() const QObject *QSignalTransition::senderObject() const { Q_D(const QSignalTransition); - return d->sender; + return d->senderObject; } /*! @@ -181,14 +180,23 @@ const QObject *QSignalTransition::senderObject() const void QSignalTransition::setSenderObject(const QObject *sender) { Q_D(QSignalTransition); - if (sender == d->sender) + if (sender == d->senderObject.value()) { + d->senderObject.removeBindingUnlessInWrapper(); return; + } d->unregister(); - d->sender = sender; + d->senderObject = sender; d->maybeRegister(); + d->senderObject.notify(); emit senderObjectChanged(QPrivateSignal()); } +QBindable<const QObject*> QSignalTransition::bindableSenderObject() +{ + Q_D(QSignalTransition); + return &d->senderObject; +} + /*! Returns the signal associated with this signal transition. */ @@ -204,14 +212,23 @@ QByteArray QSignalTransition::signal() const void QSignalTransition::setSignal(const QByteArray &signal) { Q_D(QSignalTransition); - if (signal == d->signal) + if (signal == d->signal.value()) { + d->signal.removeBindingUnlessInWrapper(); return; + } d->unregister(); d->signal = signal; d->maybeRegister(); + d->signal.notify(); emit signalChanged(QPrivateSignal()); } +QBindable<QByteArray> QSignalTransition::bindableSignal() +{ + Q_D(QSignalTransition); + return &d->signal; +} + /*! \reimp @@ -226,7 +243,7 @@ bool QSignalTransition::eventTest(QEvent *event) if (d->signalIndex == -1) return false; QStateMachine::SignalEvent *se = static_cast<QStateMachine::SignalEvent*>(event); - return (se->sender() == d->sender) + return (se->sender() == d->senderObject.value()) && (se->signalIndex() == d->signalIndex); } return false; diff --git a/src/statemachine/qsignaltransition.h b/src/statemachine/qsignaltransition.h index d431474..d0e8044 100644 --- a/src/statemachine/qsignaltransition.h +++ b/src/statemachine/qsignaltransition.h @@ -51,8 +51,10 @@ class QSignalTransitionPrivate; class Q_STATEMACHINE_EXPORT QSignalTransition : public QAbstractTransition { Q_OBJECT - Q_PROPERTY(const QObject* senderObject READ senderObject WRITE setSenderObject NOTIFY senderObjectChanged) - Q_PROPERTY(QByteArray signal READ signal WRITE setSignal NOTIFY signalChanged) + Q_PROPERTY(const QObject* senderObject READ senderObject WRITE setSenderObject + NOTIFY senderObjectChanged BINDABLE bindableSenderObject) + Q_PROPERTY(QByteArray signal READ signal WRITE setSignal + NOTIFY signalChanged BINDABLE bindableSignal) public: QSignalTransition(QState *sourceState = nullptr); @@ -75,9 +77,11 @@ public: const QObject *senderObject() const; void setSenderObject(const QObject *sender); + QBindable<const QObject*> bindableSenderObject(); QByteArray signal() const; void setSignal(const QByteArray &signal); + QBindable<QByteArray> bindableSignal(); protected: bool eventTest(QEvent *event) override; diff --git a/src/statemachine/qsignaltransition_p.h b/src/statemachine/qsignaltransition_p.h index b3de334..0d8b444 100644 --- a/src/statemachine/qsignaltransition_p.h +++ b/src/statemachine/qsignaltransition_p.h @@ -52,6 +52,7 @@ // #include "private/qabstracttransition_p.h" +#include <QtCore/private/qproperty_p.h> QT_REQUIRE_CONFIG(statemachine); @@ -72,8 +73,20 @@ public: void callOnTransition(QEvent *e) override; - const QObject *sender; - QByteArray signal; + void setSenderObject(const QObject* sender) + { + q_func()->setSenderObject(sender); + } + Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QSignalTransitionPrivate, const QObject*, + senderObject, &QSignalTransitionPrivate::setSenderObject, + nullptr); + + void setSignal(const QByteArray& signal) + { + q_func()->setSignal(signal); + } + Q_OBJECT_COMPAT_PROPERTY(QSignalTransitionPrivate, QByteArray, + signal, &QSignalTransitionPrivate::setSignal); int signalIndex; int originalSignalIndex; }; diff --git a/src/statemachine/qstatemachine.cpp b/src/statemachine/qstatemachine.cpp index ffa9b32..c7aa631 100644 --- a/src/statemachine/qstatemachine.cpp +++ b/src/statemachine/qstatemachine.cpp @@ -2250,7 +2250,7 @@ void QStateMachinePrivate::registerSignalTransition(QSignalTransition *transitio Q_Q(QStateMachine); if (QSignalTransitionPrivate::get(transition)->signalIndex != -1) return; // already registered - const QObject *sender = QSignalTransitionPrivate::get(transition)->sender; + const QObject *sender = QSignalTransitionPrivate::get(transition)->senderObject; if (!sender) return; QByteArray signal = QSignalTransitionPrivate::get(transition)->signal; @@ -2310,7 +2310,7 @@ void QStateMachinePrivate::unregisterSignalTransition(QSignalTransition *transit int signalIndex = QSignalTransitionPrivate::get(transition)->signalIndex; if (signalIndex == -1) return; // not registered - const QObject *sender = QSignalTransitionPrivate::get(transition)->sender; + const QObject *sender = QSignalTransitionPrivate::get(transition)->senderObject; QSignalTransitionPrivate::get(transition)->signalIndex = -1; connectionsMutex.lock(); diff --git a/tests/auto/qstatemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/qstatemachine/qstatemachine/tst_qstatemachine.cpp index 4aecf8f..0c1d4a8 100644 --- a/tests/auto/qstatemachine/qstatemachine/tst_qstatemachine.cpp +++ b/tests/auto/qstatemachine/qstatemachine/tst_qstatemachine.cpp @@ -6915,6 +6915,19 @@ void tst_QStateMachine::bindings() QTRY_COMPARE(endState_activeSpy.count(), 1); // Verify that the "active" value changed via binding QVERIFY(active); + + // -- QSignalTransition::senderObject + QSignalTransition signalTransition; + QObject sender1; + QObject sender2; + testWritableBindableBasics<QSignalTransition, const QObject*>( + signalTransition, &sender1, &sender2, "senderObject"); + + // -- QSignalTransition::signal + QByteArray arr1("arr1"); + QByteArray arr2("arr2"); + testWritableBindableBasics<QSignalTransition, QByteArray>( + signalTransition, arr1, arr2, "signal"); } QTEST_MAIN(tst_QStateMachine) |