From aa094ee871c6955bd6c04da66a8602dfa9b29eed Mon Sep 17 00:00:00 2001
From: Marco Bubke <marco.bubke@nokia.com>
Date: Tue, 9 Feb 2010 17:28:54 +0100
Subject: [PATCH] Add feedback for overwritten expressions

---
 .../formeditor/formeditorgraphicsview.cpp     | 56 +++++++++++++------
 .../formeditor/formeditorgraphicsview.h       |  4 ++
 .../qmldesigner/core/include/qmlobjectnode.h  |  1 +
 .../qmldesigner/core/model/qmlobjectnode.cpp  | 20 +++++++
 4 files changed, 65 insertions(+), 16 deletions(-)

diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp
index bae4ac9609a..b1ff54e491d 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp
@@ -141,37 +141,53 @@ void FormEditorGraphicsView::drawForeground(QPainter *painter, const QRectF &/*r
     painter->restore();
 
 
-    if (m_beginX != m_feedbackNode.instanceValue("x"))
-        painter->setPen(changeColor);
-    else
-        painter->setPen(Qt::black);
+    if (m_beginXHasExpression != m_feedbackNode.hasBindingProperty("x")) {
+        painter->setPen(Qt::red);
+    } else {
+        if (m_beginX != m_feedbackNode.instanceValue("x"))
+            painter->setPen(changeColor);
+        else
+            painter->setPen(Qt::black);
+    }
 
     painter->drawText(QPoint(2.0, 12.0), QString("x:"));
     painter->drawText(QPoint(14.0, 12.0), m_feedbackNode.instanceValue("x").toString());
 
 
-    if (m_beginY != m_feedbackNode.instanceValue("y"))
-        painter->setPen(changeColor);
-    else
-        painter->setPen(Qt::black);
+    if (m_beginYHasExpression != m_feedbackNode.hasBindingProperty("y")) {
+        painter->setPen(Qt::red);
+    } else {
+        if (m_beginY != m_feedbackNode.instanceValue("y"))
+            painter->setPen(changeColor);
+        else
+            painter->setPen(Qt::black);
+    }
 
     painter->drawText(QPoint(50.0, 12.0), QString("y:"));
     painter->drawText(QPoint(60.0, 12.0), m_feedbackNode.instanceValue("y").toString());
 
 
-    if (m_beginWidth != m_feedbackNode.instanceValue("width"))
-        painter->setPen(changeColor);
-    else
-        painter->setPen(Qt::black);
+    if (m_beginWidthHasExpression != m_feedbackNode.hasBindingProperty("width")) {
+        painter->setPen(Qt::red);
+    } else {
+        if (m_beginWidth != m_feedbackNode.instanceValue("width"))
+            painter->setPen(changeColor);
+        else
+            painter->setPen(Qt::black);
+    }
 
     painter->drawText(QPoint(2.0, 24.0), QString("w:"));
     painter->drawText(QPoint(14.0, 24.0), m_feedbackNode.instanceValue("width").toString());
 
 
-    if (m_beginHeight != m_feedbackNode.instanceValue("height"))
-        painter->setPen(changeColor);
-    else
-        painter->setPen(Qt::black);
+    if (m_beginHeightHasExpression != m_feedbackNode.hasBindingProperty("height")) {
+        painter->setPen(Qt::red);
+    } else {
+        if (m_beginHeight != m_feedbackNode.instanceValue("height"))
+            painter->setPen(changeColor);
+        else
+            painter->setPen(Qt::black);
+    }
 
     painter->drawText(QPoint(50.0, 24.0), QString("h:"));
     painter->drawText(QPoint(60.0, 24.0),m_feedbackNode.instanceValue("height").toString());
@@ -245,6 +261,10 @@ void FormEditorGraphicsView::setFeedbackNode(const QmlItemNode &node)
         m_beginRightMargin = m_feedbackNode.instanceValue("anchors.rightMargin");
         m_beginTopMargin = m_feedbackNode.instanceValue("anchors.topMargin");
         m_beginBottomMargin = m_feedbackNode.instanceValue("anchors.bottomMargin");
+        m_beginXHasExpression = m_feedbackNode.hasBindingProperty("x");
+        m_beginYHasExpression = m_feedbackNode.hasBindingProperty("y");
+        m_beginWidthHasExpression = m_feedbackNode.hasBindingProperty("width");
+        m_beginHeightHasExpression = m_feedbackNode.hasBindingProperty("height");
     } else {
         m_beginX = QVariant();
         m_beginY = QVariant();
@@ -255,6 +275,10 @@ void FormEditorGraphicsView::setFeedbackNode(const QmlItemNode &node)
         m_beginRightMargin = QVariant();
         m_beginTopMargin = QVariant();
         m_beginBottomMargin = QVariant();
+        m_beginXHasExpression = false;
+        m_beginYHasExpression = false;
+        m_beginWidthHasExpression = false;
+        m_beginHeightHasExpression = false;
     }
 }
 
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h
index bb0706b4bfb..78763a104ec 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h
@@ -60,6 +60,10 @@ private:
     QVariant m_beginRightMargin;
     QVariant m_beginTopMargin;
     QVariant m_beginBottomMargin;
+    bool m_beginXHasExpression;
+    bool m_beginYHasExpression;
+    bool m_beginWidthHasExpression;
+    bool m_beginHeightHasExpression;
 };
 
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/core/include/qmlobjectnode.h b/src/plugins/qmldesigner/core/include/qmlobjectnode.h
index 7dc37f322af..651e37d7a78 100644
--- a/src/plugins/qmldesigner/core/include/qmlobjectnode.h
+++ b/src/plugins/qmldesigner/core/include/qmlobjectnode.h
@@ -65,6 +65,7 @@ public:
     QVariant instanceValue(const QString &name) const;
 
     bool hasProperty(const QString &name) const;
+    bool hasBindingProperty(const QString &name) const;
     bool propertyAffectedByCurrentState(const QString &name) const;
     QVariant modelValue(const QString &name) const;
     bool isInBaseState() const;
diff --git a/src/plugins/qmldesigner/core/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/core/model/qmlobjectnode.cpp
index f2a25cca35c..b78a7f75fe7 100644
--- a/src/plugins/qmldesigner/core/model/qmlobjectnode.cpp
+++ b/src/plugins/qmldesigner/core/model/qmlobjectnode.cpp
@@ -102,9 +102,29 @@ bool QmlObjectNode::hasProperty(const QString &name) const
     if (!isValid())
         throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
 
+    if (currentState().hasPropertyChanges(modelNode())) {
+        QmlPropertyChanges propertyChanges = currentState().propertyChanges(modelNode());
+        if (propertyChanges.modelNode().hasProperty(name))
+            return true;
+    }
+
     return modelNode().hasProperty(name);
 }
 
+bool QmlObjectNode::hasBindingProperty(const QString &name) const
+{
+    if (!isValid())
+        throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
+
+    if (currentState().hasPropertyChanges(modelNode())) {
+        QmlPropertyChanges propertyChanges = currentState().propertyChanges(modelNode());
+        if (propertyChanges.modelNode().hasBindingProperty(name))
+            return true;
+    }
+
+    return modelNode().hasBindingProperty(name);
+}
+
 NodeAbstractProperty QmlObjectNode::nodeAbstractProperty(const QString &name) const
 {
    return modelNode().nodeAbstractProperty(name);
-- 
GitLab