summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/scxmlqml/statemachineloader.cpp22
-rw-r--r--tests/auto/qml/scxmlqmlcpp/data/smlHelper.qml6
-rw-r--r--tests/auto/qml/scxmlqmlcpp/tst_scxmlqmlcpp.cpp12
3 files changed, 29 insertions, 11 deletions
diff --git a/src/scxmlqml/statemachineloader.cpp b/src/scxmlqml/statemachineloader.cpp
index c67b175..33e3172 100644
--- a/src/scxmlqml/statemachineloader.cpp
+++ b/src/scxmlqml/statemachineloader.cpp
@@ -38,9 +38,9 @@ QT_PREPEND_NAMESPACE(QScxmlStateMachine) *QScxmlStateMachineLoader::stateMachine
void QScxmlStateMachineLoader::setStateMachine(QScxmlStateMachine* stateMachine)
{
- if (m_stateMachine.value() != stateMachine) {
- delete m_stateMachine.value();
- m_stateMachine = stateMachine;
+ if (m_stateMachine.valueBypassingBindings() != stateMachine) {
+ delete m_stateMachine.valueBypassingBindings();
+ m_stateMachine.setValueBypassingBindings(stateMachine);
}
}
@@ -65,17 +65,23 @@ void QScxmlStateMachineLoader::setSource(const QUrl &source)
if (!source.isValid())
return;
- const QUrl oldSource = m_source;
+ m_source.removeBindingUnlessInWrapper();
+
+ const QUrl oldSource = m_source.valueBypassingBindings();
+ const auto *oldStateMachine = m_stateMachine.valueBypassingBindings();
setStateMachine(nullptr);
m_implicitDataModel = nullptr;
if (parse(source))
- m_source = source;
+ m_source.setValueBypassingBindings(source);
else
- m_source = QUrl();
+ m_source.setValueBypassingBindings(QUrl());
- if (oldSource != m_source)
+ if (oldSource != m_source.valueBypassingBindings())
m_source.notify();
+
+ if (oldStateMachine != m_stateMachine.valueBypassingBindings())
+ m_stateMachine.notify();
}
QBindable<QUrl> QScxmlStateMachineLoader::bindableSource()
@@ -177,7 +183,7 @@ bool QScxmlStateMachineLoader::parse(const QUrl &source)
setStateMachine(stateMachine);
// as this is deferred any pending property updates to m_dataModel and m_initialValues
// should still occur before start().
- QMetaObject::invokeMethod(m_stateMachine.value(), "start", Qt::QueuedConnection);
+ QMetaObject::invokeMethod(m_stateMachine.valueBypassingBindings(), "start", Qt::QueuedConnection);
return true;
} else {
qmlWarning(this) << QStringLiteral("Something went wrong while parsing '%1':")
diff --git a/tests/auto/qml/scxmlqmlcpp/data/smlHelper.qml b/tests/auto/qml/scxmlqmlcpp/data/smlHelper.qml
new file mode 100644
index 0000000..8deec6e
--- /dev/null
+++ b/tests/auto/qml/scxmlqmlcpp/data/smlHelper.qml
@@ -0,0 +1,6 @@
+import QtQuick
+import QtScxml
+
+StateMachineLoader {
+ objectName: 'helper'
+}
diff --git a/tests/auto/qml/scxmlqmlcpp/tst_scxmlqmlcpp.cpp b/tests/auto/qml/scxmlqmlcpp/tst_scxmlqmlcpp.cpp
index c3c3501..5d10fa5 100644
--- a/tests/auto/qml/scxmlqmlcpp/tst_scxmlqmlcpp.cpp
+++ b/tests/auto/qml/scxmlqmlcpp/tst_scxmlqmlcpp.cpp
@@ -112,8 +112,8 @@ void tst_scxmlqmlcpp::stateMachineLoaderSourceStateMachineBinding()
{
// Test source and stateMachine together as they interact with each other
- QUrl source1(testFileUrl("statemachine.scxml"));
- QUrl source2(testFileUrl("topmachine.scxml"));
+ QUrl source1(testFileUrl("submachineA.scxml"));
+ QUrl source2(testFileUrl("submachineB.scxml"));
// The 'setSource' of the statemachineloader assumes a valid qml context
QQmlEngine engine;
const QUrl smlUrl = testFileUrl("stateMachineLoader.qml");
@@ -124,9 +124,15 @@ void tst_scxmlqmlcpp::stateMachineLoaderSourceStateMachineBinding()
qobject_cast<QScxmlStateMachineLoader*>(root->findChild<QObject*>("sml"));
QVERIFY(sml != nullptr);
+ QQmlComponent otherComponent(&engine, testFileUrl("smlHelper.qml"));
+
// -- StateMachineLoader::source
QTestPrivate::testReadWritePropertyBasics<QScxmlStateMachineLoader, QUrl>(
- *sml, source1, source2, "source");
+ *sml, source1, source2, "source",
+ [&otherComponent]() {
+ return std::unique_ptr<QScxmlStateMachineLoader>(
+ qobject_cast<QScxmlStateMachineLoader*>(otherComponent.create()));
+ });
if (QTest::currentTestFailed()) {
qWarning() << "QScxmlStateMachineLoader::source property testing failed";
return;