diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2017-11-13 13:54:07 +0100 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2017-11-14 14:54:08 +0000 |
commit | de43bd5a596ce6a5a88bf9c28b937f155d339cca (patch) | |
tree | 699d119d37de413af1bbb916e16dc4c472f4f51e /src | |
parent | 8c1a08d76093502125c391ac2b60929016cd2685 (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.cpp | 17 | ||||
-rw-r--r-- | src/plugins/qmldesigner/components/navigator/navigatorview.h | 1 |
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; |