diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-10-02 17:59:56 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-10-05 16:24:20 +0000 |
commit | b6919ced51d7d4c910ab9864c8807edfd4056341 (patch) | |
tree | 9f3008e27303df8f2556626d2bab0dd0aeb72ef1 | |
parent | 24154f43c7611aba0085ca1693b6b831390f2aa1 (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
Change-Id: Ic16e7fde2b319d4c3b3471356e69be8e61d9806f
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
(cherry picked from commit 36c3daa7081971549494cab8ee5ba7d6ee4b2931)
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
(cherry picked from commit 809020809198bf2c84c6333ac40609fd7fda4e9a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-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(); } |