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.
This commit is contained in:
Michael Zanetti 2018-06-25 12:03:43 +02:00
parent 7d9cdd31e1
commit e2ceadc7a1
4 changed files with 11 additions and 11 deletions

View File

@ -27,6 +27,7 @@ QHash<int, QByteArray> StateEvaluators::roleNames() const
void StateEvaluators::addStateEvaluator(StateEvaluator *stateEvaluator)
{
stateEvaluator->setParent(this);
beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
m_list.append(stateEvaluator);
endInsertRows();

View File

@ -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;

View File

@ -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

View File

@ -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() {