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-04 14:22:22 +0200 |
commit | 36c3daa7081971549494cab8ee5ba7d6ee4b2931 (patch) | |
tree | 73b61ba7ee48b493d463ebbf2fe6e794523f8ee0 | |
parent | f51299c14b5afc9cfe7b1cfc6e0f2493df8d848d (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.6 6.5
Change-Id: Ic16e7fde2b319d4c3b3471356e69be8e61d9806f
Reviewed-by: Ulf Hermann <ulf.hermann@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(); } |