summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuha Vuolle <juha.vuolle@insta.fi>2021-03-03 12:29:05 +0200
committerJuha Vuolle <juha.vuolle@insta.fi>2021-05-03 13:51:59 +0300
commit4e28b3753e297541baaa45ef6c5651989ff7ce82 (patch)
tree618ac9ff4534505733a0a19ae2941cb1657d6383
parent28c1702e69800dc89748c184d449b775a049968f (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.cpp33
-rw-r--r--src/statemachine/qsignaltransition.h8
-rw-r--r--src/statemachine/qsignaltransition_p.h17
-rw-r--r--src/statemachine/qstatemachine.cpp4
-rw-r--r--tests/auto/qstatemachine/qstatemachine/tst_qstatemachine.cpp13
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)