From 04ad9bb1faec4699ea9d51c889d489e72a5b4fdf Mon Sep 17 00:00:00 2001
From: Marco Bubke <marco.bubke@nokia.com>
Date: Mon, 8 Feb 2010 19:08:01 +0100
Subject: [PATCH] First version of a feedback system in the formeditor

---
 .../formeditor/formeditorgraphicsview.cpp     | 120 ++++++++++++++++++
 .../formeditor/formeditorgraphicsview.h       |  14 ++
 .../components/formeditor/formeditorview.cpp  |   7 +
 .../formeditor/formeditorwidget.cpp           |   5 +
 .../components/formeditor/formeditorwidget.h  |   4 +
 5 files changed, 150 insertions(+)

diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp
index 8e223cc8e49..38e4576cd1b 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp
@@ -110,6 +110,126 @@ void FormEditorGraphicsView::mouseReleaseEvent(QMouseEvent *event)
     }
 }
 
+void FormEditorGraphicsView::drawForeground(QPainter *painter, const QRectF &/*rect*/ )
+{
+    if (!m_feedbackNode.isValid())
+        return;
+
+    painter->save();
+
+    if (m_beginX != m_feedbackNode.instanceValue("x"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 12.0)), QString("x: \t\t%1").arg(m_feedbackNode.instanceValue("x").toString()));
+
+
+    if (m_beginY != m_feedbackNode.instanceValue("y"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 24.0)), QString("y: \t\t%1").arg(m_feedbackNode.instanceValue("y").toString()));
+
+
+    if (m_beginWidth != m_feedbackNode.instanceValue("width"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 36.0)), QString("width: \t\t%1").arg(m_feedbackNode.instanceValue("width").toString()));
+
+
+    if (m_beginHeight != m_feedbackNode.instanceValue("height"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 48.0)), QString("height:\t\t%1").arg(m_feedbackNode.instanceValue("height").toString()));
+
+    if (m_parentNode == m_feedbackNode.instanceParent()) {
+
+        if (m_feedbackNode.canReparent()) {
+            painter->setPen(Qt::black);
+            painter->drawText(mapToScene(QPoint(2.0, 60.0)), QString("Can reparent."));
+        } else {
+            painter->setPen(Qt::red);
+            painter->drawText(mapToScene(QPoint(2.0, 60.0)), QString("Cannot reparent."));
+        }
+    } else {
+        painter->setPen(Qt::yellow);
+        if (m_feedbackNode.instanceParent().id().isEmpty())
+            painter->drawText(mapToScene(QPoint(2.0, 60.0)), QString("Parent has changed."));
+        else
+            painter->drawText(mapToScene(QPoint(2.0, 60.0)), QString("Parent has changed to %1.").arg(m_feedbackNode.instanceParent().id()));
+    }
+
+
+    if (m_beginTopMargin != m_feedbackNode.instanceValue("anchors.leftMargin"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 72.0)), QString("leftMargin: \t\t%1").arg(m_feedbackNode.instanceValue("anchors.leftMargin").toString()));
+
+    if (m_beginRightMargin != m_feedbackNode.instanceValue("anchors.rightMargin"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 84.0)), QString("rightMargin: \t\t%1").arg(m_feedbackNode.instanceValue("anchors.rightMargin").toString()));
+
+
+
+    if (m_beginTopMargin != m_feedbackNode.instanceValue("anchors.topMargin"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 96.0)), QString("topMargin: \t\t%1").arg(m_feedbackNode.instanceValue("anchors.topMargin").toString()));
+
+
+    if (m_beginBottomMargin != m_feedbackNode.instanceValue("anchors.bottomMargin"))
+        painter->setPen(Qt::green);
+    else
+        painter->setPen(Qt::black);
+
+    painter->drawText(mapToScene(QPoint(2.0, 108.0)), QString("bottomMargin: \t%1").arg(m_feedbackNode.instanceValue("anchors.bottomMargin").toString()));
+
+    painter->restore();
+}
+
+void FormEditorGraphicsView::setFeedbackNode(const QmlItemNode &node)
+{
+    if (node == m_feedbackNode)
+        return;
+
+    m_feedbackNode = node;
+
+    if (m_feedbackNode.isValid()) {
+        m_beginX = m_feedbackNode.instanceValue("x");
+        m_beginY = m_feedbackNode.instanceValue("y");
+        m_beginWidth = m_feedbackNode.instanceValue("width");
+        m_beginHeight = m_feedbackNode.instanceValue("height");
+        m_parentNode = m_feedbackNode.instanceParent();
+        m_beginLeftMargin = m_feedbackNode.instanceValue("anchors.leftMargin");
+        m_beginRightMargin = m_feedbackNode.instanceValue("anchors.rightMargin");
+        m_beginTopMargin = m_feedbackNode.instanceValue("anchors.topMargin");
+        m_beginBottomMargin = m_feedbackNode.instanceValue("anchors.bottomMargin");
+    } else {
+        m_beginX = QVariant();
+        m_beginY = QVariant();
+        m_beginWidth = QVariant();
+        m_beginHeight = QVariant();
+        m_parentNode = QmlObjectNode();
+        m_beginLeftMargin = QVariant();
+        m_beginRightMargin = QVariant();
+        m_beginTopMargin = QVariant();
+        m_beginBottomMargin = QVariant();
+    }
+}
+
 void FormEditorGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
 {
     painter->save();
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h
index 1caf1ac24bb..bb0706b4bfb 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.h
@@ -31,6 +31,7 @@
 #define FORMEDITORGRAPHICSVIEW_H
 
 #include <QGraphicsView>
+#include <qmlitemnode.h>
 
 namespace QmlDesigner {
 
@@ -40,12 +41,25 @@ Q_OBJECT
 public:
     explicit FormEditorGraphicsView(QWidget *parent = 0);
 
+    void setFeedbackNode(const QmlItemNode &node);
 
 protected:
+    void drawForeground(QPainter *painter, const QRectF &rect );
     void drawBackground(QPainter *painter, const QRectF &rect);
     void wheelEvent(QWheelEvent *event);
     void mouseMoveEvent(QMouseEvent *event);
     void mouseReleaseEvent(QMouseEvent *event);
+private:
+    QmlItemNode m_feedbackNode;
+    QmlObjectNode m_parentNode;
+    QVariant m_beginX;
+    QVariant m_beginY;
+    QVariant m_beginWidth;
+    QVariant m_beginHeight;
+    QVariant m_beginLeftMargin;
+    QVariant m_beginRightMargin;
+    QVariant m_beginTopMargin;
+    QVariant m_beginBottomMargin;
 };
 
 } // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 02ae0dc29c7..b012e6f3200 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -251,6 +251,11 @@ void FormEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNodeLi
             item->update();
     }
 
+    if (selectedNodeList.count() == 1)
+        m_formEditorWidget->setFeedbackNode(QmlItemNode(selectedNodeList.first()));
+    else
+        m_formEditorWidget->setFeedbackNode(QmlItemNode());
+
     m_scene->update();
 }
 
@@ -482,6 +487,8 @@ void FormEditorView::transformChanged(const QmlObjectNode &qmlObjectNode)
         m_scene->synchronizeTransformation(itemNode);
         m_currentTool->formEditorItemsChanged(QList<FormEditorItem*>() << m_scene->itemForQmlItemNode(itemNode));
     }
+
+    scene()->update();
 }
 
 void FormEditorView::parentChanged(const QmlObjectNode &qmlObjectNode)
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
index e7bb9953374..e8ded838265 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
@@ -284,6 +284,11 @@ double FormEditorWidget::margins() const
     return m_snappingMarginAction->currentValue().toDouble();
 }
 
+void FormEditorWidget::setFeedbackNode(const QmlItemNode &node)
+{
+    m_graphicsView->setFeedbackNode(node);
+}
+
 }
 
 
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
index 20cda56723a..688ef583938 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
@@ -42,6 +42,8 @@ class FormEditorScene;
 class FormEditorGraphicsView;
 class ToolBox;
 class NumberSeriesAction;
+class QmlItemNode;
+
 
 class FormEditorWidget : public QWidget
 {
@@ -63,6 +65,8 @@ public:
     double spacing() const;
     double margins() const;
 
+    void setFeedbackNode(const QmlItemNode &node);
+
 
 protected:
     void enterEvent(QEvent *event);
-- 
GitLab