aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2019-08-28 12:03:12 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2019-08-28 14:02:14 +0000
commitc61702fca43bf8cdb53d1d87d785e4a0992cbd28 (patch)
tree5f9f9741c0b800ec45bc12da4f67983c1b6a94c6
parent217f0c0305ed57041d3375a5bb08ec6a255e0b89 (diff)
QmlDesigner: Fix potential crash
The new selected ModelNode (m_selectedNode) was set to early, since we defer the creation of the QML frontend. We have to set m_selectedNode when the QML frontend is actually created. Otherwise, we might access an uninitialized QML frontend. Change-Id: I630b103246c414c737c977e233180723df0c3160 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp37
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h3
2 files changed, 24 insertions, 16 deletions
diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp
index 9dd0a2da24..cacdab072e 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp
@@ -389,6 +389,8 @@ void PropertyEditorView::resetView()
if (model() == nullptr)
return;
+ setSelelectedModelNode();
+
m_locked = true;
if (debug)
@@ -526,21 +528,16 @@ void PropertyEditorView::removePropertyFromModel(const PropertyName &propertyNam
m_locked = false;
}
-void PropertyEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
- const QList<ModelNode> &lastSelectedNodeList)
+void PropertyEditorView::selectedNodesChanged(const QList<ModelNode> &,
+ const QList<ModelNode> &)
{
- Q_UNUSED(lastSelectedNodeList);
-
- if (selectedNodeList.isEmpty())
- select(ModelNode());
- else
- select(selectedNodeList.constFirst());
+ select();
}
void PropertyEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode)
{
if (m_selectedNode.isValid() && removedNode.isValid() && m_selectedNode == removedNode)
- select(m_selectedNode.parentProperty().parentModelNode());
+ select();
}
void PropertyEditorView::modelAttached(Model *model)
@@ -686,19 +683,29 @@ void PropertyEditorView::nodeIdChanged(const ModelNode& node, const QString& new
}
}
-void PropertyEditorView::select(const ModelNode &node)
+void PropertyEditorView::select()
{
if (m_qmlBackEndForCurrentType)
m_qmlBackEndForCurrentType->emitSelectionToBeChanged();
- if (QmlObjectNode(node).isValid())
- m_selectedNode = node;
- else
- m_selectedNode = ModelNode();
-
delayedResetView();
}
+void PropertyEditorView::setSelelectedModelNode()
+{
+ const auto selectedNodeList = selectedModelNodes();
+
+ m_selectedNode = ModelNode();
+
+ if (selectedNodeList.isEmpty())
+ return;
+
+ const ModelNode node = selectedNodeList.constFirst();
+
+ if (QmlObjectNode(node).isValid())
+ m_selectedNode = node;
+}
+
bool PropertyEditorView::hasWidget() const
{
return true;
diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h
index e7f57cf186..20047fde40 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h
+++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h
@@ -105,7 +105,8 @@ private: //functions
void updateSize();
void setupPanes();
- void select(const ModelNode& node);
+ void select();
+ void setSelelectedModelNode();
void delayedResetView();
void setupQmlBackend();