aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2017-11-13 13:54:07 +0100
committerThomas Hartmann <thomas.hartmann@qt.io>2017-11-14 14:54:08 +0000
commitde43bd5a596ce6a5a88bf9c28b937f155d339cca (patch)
tree699d119d37de413af1bbb916e16dc4c472f4f51e /src
parent8c1a08d76093502125c391ac2b60929016cd2685 (diff)
QmlDesigner: Catch potential exceptions
This fixes any crashes related to uncaught exceptions when reparenting in the navigator. Task-number: QTCREATORBUG-19272 Change-Id: If087b866059cd285413d54f57d7c4199bfc50ba7 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp17
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.h1
2 files changed, 14 insertions, 4 deletions
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index 48531cf82e..a90800d76f 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -327,11 +327,11 @@ void NavigatorView::leftButtonClicked()
if (!node.isRootNode() && !node.parentProperty().parentModelNode().isRootNode()) {
if (QmlItemNode::isValidQmlItemNode(node)) {
QPointF scenePos = QmlItemNode(node).instanceScenePosition();
- node.parentProperty().parentProperty().reparentHere(node);
+ reparentAndCatch(node.parentProperty().parentProperty(), node);
if (!scenePos.isNull())
setScenePos(node, scenePos);
} else {
- node.parentProperty().parentProperty().reparentHere(node);
+ reparentAndCatch(node.parentProperty().parentProperty(), node);
}
}
}
@@ -357,12 +357,12 @@ void NavigatorView::rightButtonClicked()
&& QmlItemNode::isValidQmlItemNode(newParent)
&& !newParent.metaInfo().defaultPropertyIsComponent()) {
QPointF scenePos = QmlItemNode(node).instanceScenePosition();
- newParent.nodeAbstractProperty(newParent.metaInfo().defaultPropertyName()).reparentHere(node);
+ reparentAndCatch(newParent.nodeAbstractProperty(newParent.metaInfo().defaultPropertyName()), node);
if (!scenePos.isNull())
setScenePos(node, scenePos);
} else {
if (newParent.metaInfo().isValid() && !newParent.metaInfo().defaultPropertyIsComponent())
- newParent.nodeAbstractProperty(newParent.metaInfo().defaultPropertyName()).reparentHere(node);
+ reparentAndCatch(newParent.nodeAbstractProperty(newParent.metaInfo().defaultPropertyName()), node);
}
}
}
@@ -493,4 +493,13 @@ void NavigatorView::expandRecursively(const QModelIndex &index)
}
}
+void NavigatorView::reparentAndCatch(NodeAbstractProperty property, const ModelNode &modelNode)
+{
+ try {
+ property.reparentHere(modelNode);
+ } catch (Exception &exception) {
+ exception.showException();
+ }
+}
+
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h
index d02a0d38fe..d0cdbfd0c7 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h
@@ -106,6 +106,7 @@ protected: //functions
NavigatorTreeModel *treeModel();
bool blockSelectionChangedSignal(bool block);
void expandRecursively(const QModelIndex &index);
+ void reparentAndCatch(NodeAbstractProperty property, const ModelNode &modelNode);
private:
bool m_blockSelectionChangedSignal;