summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2023-10-02 17:59:56 +0200
committerIvan Solovev <ivan.solovev@qt.io>2023-10-05 14:09:30 +0000
commit809020809198bf2c84c6333ac40609fd7fda4e9a (patch)
tree258a9549d1d81e0fdf456eceb5c89c96706669df
parentd69b36b28135701693ead85f93716648fafce25f (diff)
QScxmlStateMachineLoader: fix binding loops - simple cases
By using (set)ValueBypassingBindings() in the property setters. Remove the dependency of initialValues and dataModel setter from the m_stateMachine property. Task-number: QTBUG-116542 Pick-to: 6.5 Change-Id: Ic16e7fde2b319d4c3b3471356e69be8e61d9806f Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> (cherry picked from commit 36c3daa7081971549494cab8ee5ba7d6ee4b2931) Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
-rw-r--r--src/scxmlqml/statemachineloader.cpp27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/scxmlqml/statemachineloader.cpp b/src/scxmlqml/statemachineloader.cpp
index 8b225b9..c67b175 100644
--- a/src/scxmlqml/statemachineloader.cpp
+++ b/src/scxmlqml/statemachineloader.cpp
@@ -90,13 +90,15 @@ QVariantMap QScxmlStateMachineLoader::initialValues() const
void QScxmlStateMachineLoader::setInitialValues(const QVariantMap &initialValues)
{
- if (initialValues == m_initialValues.value()) {
- m_initialValues.removeBindingUnlessInWrapper();
+ m_initialValues.removeBindingUnlessInWrapper();
+ if (initialValues == m_initialValues.valueBypassingBindings())
return;
- }
- m_initialValues = initialValues;
- if (m_stateMachine.value())
- m_stateMachine.value()->setInitialValues(initialValues);
+
+ m_initialValues.setValueBypassingBindings(initialValues);
+
+ const auto stateMachine = m_stateMachine.valueBypassingBindings();
+ if (stateMachine)
+ stateMachine->setInitialValues(initialValues);
m_initialValues.notify();
}
@@ -112,16 +114,17 @@ QScxmlDataModel *QScxmlStateMachineLoader::dataModel() const
void QScxmlStateMachineLoader::setDataModel(QScxmlDataModel *dataModel)
{
- if (dataModel == m_dataModel.value()) {
- m_dataModel.removeBindingUnlessInWrapper();
+ m_dataModel.removeBindingUnlessInWrapper();
+ if (dataModel == m_dataModel.valueBypassingBindings()) {
return;
}
- m_dataModel = dataModel;
- if (m_stateMachine.value()) {
+ m_dataModel.setValueBypassingBindings(dataModel);
+ const auto stateMachine = m_stateMachine.valueBypassingBindings();
+ if (stateMachine) {
if (dataModel)
- m_stateMachine.value()->setDataModel(dataModel);
+ stateMachine->setDataModel(dataModel);
else
- m_stateMachine.value()->setDataModel(m_implicitDataModel);
+ stateMachine->setDataModel(m_implicitDataModel);
}
m_dataModel.notify();
}