From e2ceadc7a15b2f084862c962ddf42e49c7362fa2 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 25 Jun 2018 12:03:43 +0200 Subject: [PATCH] fix a crash when editing rules there seems to be a race condition in StackView.onRemoved where it sometimes makes the QML engine crash if accessing context properties from outside the function context in the handler. Sometimes it would just print that those properties are undefined and not complete the handler code, other times however, it does actually find the properties but crash upon accessing them. --- libnymea-common/types/stateevaluators.cpp | 1 + mea/ui/MagicPage.qml | 12 ++++++------ mea/ui/magic/DeviceRulesPage.qml | 8 ++++---- mea/ui/magic/EditRulePage.qml | 1 - 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libnymea-common/types/stateevaluators.cpp b/libnymea-common/types/stateevaluators.cpp index c2086ceb..46c9ca62 100644 --- a/libnymea-common/types/stateevaluators.cpp +++ b/libnymea-common/types/stateevaluators.cpp @@ -27,6 +27,7 @@ QHash StateEvaluators::roleNames() const void StateEvaluators::addStateEvaluator(StateEvaluator *stateEvaluator) { + stateEvaluator->setParent(this); beginInsertRows(QModelIndex(), m_list.count(), m_list.count()); m_list.append(stateEvaluator); endInsertRows(); diff --git a/mea/ui/MagicPage.qml b/mea/ui/MagicPage.qml index 48c39f8f..0993d06f 100644 --- a/mea/ui/MagicPage.qml +++ b/mea/ui/MagicPage.qml @@ -19,10 +19,10 @@ Page { } function addRule() { - d.editRulePage = pageStack.push(Qt.resolvedUrl("magic/EditRulePage.qml"), {rule: Engine.ruleManager.createNewRule() }); + var newRule = Engine.ruleManager.createNewRule(); + d.editRulePage = pageStack.push(Qt.resolvedUrl("magic/EditRulePage.qml"), {rule: newRule }); d.editRulePage.StackView.onRemoved.connect(function() { - d.editRulePage.rule.destroy() - d.editRulePage = null; + newRule.destroy(); }) d.editRulePage.onAccept.connect(function() { d.editRulePage.busy = true; @@ -76,10 +76,10 @@ Page { onDeleteClicked: Engine.ruleManager.removeRule(model.id) onClicked: { - d.editRulePage = pageStack.push(Qt.resolvedUrl("magic/EditRulePage.qml"), {rule: Engine.ruleManager.rules.get(index).clone()}) + var newRule = Engine.ruleManager.rules.get(index).clone(); + d.editRulePage = pageStack.push(Qt.resolvedUrl("magic/EditRulePage.qml"), {rule: newRule}) d.editRulePage.StackView.onRemoved.connect(function() { - d.editRulePage.rule.destroy(); - d.editRulePage = null + newRule.destroy(); }) d.editRulePage.onAccept.connect(function() { d.editRulePage.busy = true; diff --git a/mea/ui/magic/DeviceRulesPage.qml b/mea/ui/magic/DeviceRulesPage.qml index 6032ea3e..fb691334 100644 --- a/mea/ui/magic/DeviceRulesPage.qml +++ b/mea/ui/magic/DeviceRulesPage.qml @@ -28,8 +28,7 @@ Page { } d.editRulePage = pageStack.push(Qt.resolvedUrl("EditRulePage.qml"), {rule: rule}); d.editRulePage.StackView.onRemoved.connect(function() { - d.editRulePage.rule.destroy(); - d.editRulePage = null + rule.destroy(); }) d.editRulePage.onAccept.connect(function() { d.editRulePage.busy = true; @@ -96,9 +95,10 @@ Page { onDeleteClicked: Engine.ruleManager.removeRule(model.id) onClicked: { - d.editRulePage = pageStack.push(Qt.resolvedUrl("EditRulePage.qml"), {rule: rulesFilterModel.get(index).clone() }) + var newRule = rulesFilterModel.get(index).clone(); + d.editRulePage = pageStack.push(Qt.resolvedUrl("EditRulePage.qml"), {rule: newRule }) d.editRulePage.StackView.onRemoved.connect(function() { - d.editRulePage.rule.destroy(); + newRule.destroy(); }) d.editRulePage.onAccept.connect(function() { d.editRulePage.busy = true diff --git a/mea/ui/magic/EditRulePage.qml b/mea/ui/magic/EditRulePage.qml index 9443da3c..e2083fa0 100644 --- a/mea/ui/magic/EditRulePage.qml +++ b/mea/ui/magic/EditRulePage.qml @@ -185,7 +185,6 @@ Page { } function selectRuleActionData(ruleActions, ruleAction) { - print("opening with ruleAction", ruleAction, ruleAction.interfaceName) var ruleActionPage = pageStack.push(Qt.resolvedUrl("SelectRuleActionPage.qml"), {text: "Select action", ruleAction: ruleAction, rule: rule }); ruleActionPage.onBackPressed.connect(function() { ruleActionPage.StackView.onRemoved.connect(function() {