diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-10-02 17:59:56 +0200 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2023-10-05 14:09:30 +0000 |
commit | 809020809198bf2c84c6333ac40609fd7fda4e9a (patch) | |
tree | 258a9549d1d81e0fdf456eceb5c89c96706669df | |
parent | d69b36b28135701693ead85f93716648fafce25f (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.cpp | 27 |
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(); } |