From b0c5380d556516dc238d0eb26fa1377cf62ed81c Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@digia.com>
Date: Tue, 14 Jan 2014 12:28:25 +0100
Subject: [PATCH] QmlDesigner.FormEditor: crash fix

Anchors and/or anchor targets might be invalid.
e.g.: anchors.left: parent

We have to check this.

Task-number: QTCREATORBUG-11255
Change-Id: Ib939292d0f89cc1d22119972627c03f1e85043db
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
---
 .../anchorindicatorgraphicsitem.cpp           | 28 ++++++++++---------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/src/plugins/qmldesigner/components/formeditor/anchorindicatorgraphicsitem.cpp b/src/plugins/qmldesigner/components/formeditor/anchorindicatorgraphicsitem.cpp
index 7e7a21a67bb..38d8db1e4b1 100644
--- a/src/plugins/qmldesigner/components/formeditor/anchorindicatorgraphicsitem.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/anchorindicatorgraphicsitem.cpp
@@ -211,24 +211,26 @@ static void updateAnchorLinePoints(QPointF *firstPoint, QPointF *secondPoint, co
 
 void AnchorIndicatorGraphicsItem::updateAnchorIndicator(const AnchorLine &sourceAnchorLine, const AnchorLine targetAnchorLine)
 {
-    m_sourceAnchorLineType = sourceAnchorLine.type();
-    m_targetAnchorLineType = targetAnchorLine.type();
+    if (sourceAnchorLine.isValid() && targetAnchorLine.isValid()) {
+        m_sourceAnchorLineType = sourceAnchorLine.type();
+        m_targetAnchorLineType = targetAnchorLine.type();
 
-    m_startPoint = createAnchorPoint(sourceAnchorLine.qmlItemNode(), sourceAnchorLine.type());
+        m_startPoint = createAnchorPoint(sourceAnchorLine.qmlItemNode(), sourceAnchorLine.type());
 
-    if (targetAnchorLine.qmlItemNode() == sourceAnchorLine.qmlItemNode().instanceParentItem())
-        m_endPoint = createParentAnchorPoint(targetAnchorLine.qmlItemNode(), targetAnchorLine.type(), sourceAnchorLine.qmlItemNode());
-    else
-        m_endPoint = createAnchorPoint(targetAnchorLine.qmlItemNode(), targetAnchorLine.type());
+        if (targetAnchorLine.qmlItemNode() == sourceAnchorLine.qmlItemNode().instanceParentItem())
+            m_endPoint = createParentAnchorPoint(targetAnchorLine.qmlItemNode(), targetAnchorLine.type(), sourceAnchorLine.qmlItemNode());
+        else
+            m_endPoint = createAnchorPoint(targetAnchorLine.qmlItemNode(), targetAnchorLine.type());
 
-    m_firstControlPoint = createControlPoint(m_startPoint, sourceAnchorLine.type(), m_endPoint);
-    m_secondControlPoint = createControlPoint(m_endPoint, targetAnchorLine.type(), m_startPoint);
+        m_firstControlPoint = createControlPoint(m_startPoint, sourceAnchorLine.type(), m_endPoint);
+        m_secondControlPoint = createControlPoint(m_endPoint, targetAnchorLine.type(), m_startPoint);
 
-    updateAnchorLinePoints(&m_sourceAnchorLineFirstPoint, &m_sourceAnchorLineSecondPoint, sourceAnchorLine);
-    updateAnchorLinePoints(&m_targetAnchorLineFirstPoint, &m_targetAnchorLineSecondPoint, targetAnchorLine);
+        updateAnchorLinePoints(&m_sourceAnchorLineFirstPoint, &m_sourceAnchorLineSecondPoint, sourceAnchorLine);
+        updateAnchorLinePoints(&m_targetAnchorLineFirstPoint, &m_targetAnchorLineSecondPoint, targetAnchorLine);
 
-    updateBoundingRect();
-    update();
+        updateBoundingRect();
+        update();
+    }
 }
 
 void AnchorIndicatorGraphicsItem::updateBoundingRect()
-- 
GitLab