From 31311a4db61c4ae6d6ac323928512ae5ec650cad Mon Sep 17 00:00:00 2001
From: Marco Bubke <marco.bubke@nokia.com>
Date: Tue, 6 Sep 2011 17:50:56 +0200
Subject: [PATCH] QmlDesigner.NodeInstances: Show stripes for items without
 content

Change-Id: I6c737616d485445d77efd8b6d73b2d8259e5120b
Reviewed-on: http://codereview.qt.nokia.com/4288
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
---
 .../components/formeditor/formeditoritem.cpp  | 52 ++++++++++++++++++-
 .../components/formeditor/formeditoritem.h    |  1 +
 .../components/formeditor/formeditorview.cpp  |  6 +++
 .../formeditor/formeditorwidget.cpp           |  2 +-
 .../designercore/include/nodeinstance.h       |  4 +-
 .../designercore/include/qmlitemnode.h        |  1 +
 .../designercore/instances/nodeinstance.cpp   | 16 ++++--
 .../instances/nodeinstanceview.cpp            |  2 +-
 .../designercore/model/qmlitemnode.cpp        |  5 ++
 9 files changed, 79 insertions(+), 10 deletions(-)

diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp
index fd3d824a153..3839662b6d1 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp
@@ -53,7 +53,7 @@
 
 namespace QmlDesigner {
 
-
+QPixmap FormEditorItem::s_invisibleItemPixmap = QPixmap();
 
 FormEditorScene *FormEditorItem::scene() const {
     return qobject_cast<FormEditorScene*>(QGraphicsItem::scene());
@@ -242,6 +242,7 @@ void FormEditorItem::paintBoundingRect(QPainter *painter) const
 
     QPen pen;
     pen.setJoinStyle(Qt::MiterJoin);
+    pen.setStyle(Qt::DotLine);
 
     switch(scene()->paintMode()) {
         case FormEditorScene::AnchorMode: {
@@ -280,8 +281,55 @@ void FormEditorItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
 
     painter->save();
 
-    if (isContentVisible())
+    if (qmlItemNode().instanceIsRenderPixmapNull()) {
+        if (scene()->showBoundingRects()) {
+            if (s_invisibleItemPixmap.isNull()) {
+                QImage invisibleItemImage(14, 14, QImage::Format_ARGB32_Premultiplied);
+
+                invisibleItemImage.fill(0xFF999999);
+                QPainter fillPainter(&invisibleItemImage);
+                fillPainter.setCompositionMode(QPainter::CompositionMode_Source);
+                fillPainter.rotate(-45);
+                fillPainter.translate(-10, 0);
+                fillPainter.fillRect(0, -4, 20, 7, QColor(100, 100, 100, 0));
+                fillPainter.translate(0, 10);
+                fillPainter.fillRect(0, -4, 20, 7, QColor(100, 100, 100, 0));
+                fillPainter.translate(0, 9);
+                fillPainter.fillRect(0, -3, 20, 6, QColor(100, 100, 100, 0));
+
+
+
+
+                s_invisibleItemPixmap = QPixmap::fromImage(invisibleItemImage);
+            }
+
+            painter->drawTiledPixmap(boundingRect(), s_invisibleItemPixmap);
+
+
+
+            QString displayText = qmlItemNode().id();
+
+            if (displayText.isEmpty())
+                displayText = qmlItemNode().simplifiedTypeName();
+
+            QTextOption textOption;
+            textOption.setAlignment(Qt::AlignCenter);
+            textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
+
+            painter->save();
+
+            QFont font;
+            font.setPixelSize(18);
+            painter->setFont(font);
+
+            painter->drawText(boundingRect(), displayText, textOption);
+
+            painter->restore();
+        }
+
+    } else {
         qmlItemNode().paintInstance(painter);
+    }
 
     if (!qmlItemNode().isRootModelNode())
         paintBoundingRect(painter);
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.h b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h
index b3874cabf13..3b1175cf3ac 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.h
@@ -133,6 +133,7 @@ private: // variables
     bool m_highlightBoundingRect;
     bool m_isContentVisible;
     bool m_isFormEditorVisible;
+    static QPixmap s_invisibleItemPixmap;
 };
 
 
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 08e63291d53..a84fca20f40 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -285,6 +285,12 @@ FormEditorWidget *FormEditorView::widget() const
 void FormEditorView::nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId)
 {
     QmlModelView::nodeIdChanged(node, newId, oldId);
+    QmlItemNode itemNode(node);
+
+    if (itemNode.isValid()) {
+        FormEditorItem *item = m_scene->itemForQmlItemNode(itemNode);
+        item->update();
+    }
 }
 
 void FormEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
index 56e90605102..86e25caab75 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
@@ -112,7 +112,7 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view)
     addAction(separatorAction);
     upperActions.append(separatorAction);
 
-    m_showBoundingRectAction = new QAction(tr("Show bounding rectangles (A)"), this);
+    m_showBoundingRectAction = new QAction(tr("Show bounding rectangles and stripes for empty items (Press Key A)"), this);
     m_showBoundingRectAction->setShortcut(Qt::Key_A);
     m_showBoundingRectAction->setShortcutContext(Qt::WidgetWithChildrenShortcut);
     m_showBoundingRectAction->setCheckable(true);
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h
index cb630b4fac0..4f609c05268 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h
@@ -83,6 +83,8 @@ public:
     qint32 parentId() const;
     qint32 instanceId() const;
 
+    QPixmap renderPixmap() const;
+
 protected:
     void setProperty(const QString &name, const QVariant &value);
     InformationName setInformation(InformationName name,
@@ -108,7 +110,7 @@ protected:
     InformationName setInformationHasBindingForProperty(const QString &property, bool hasProperty);
 
     void setParentId(qint32 instanceId);
-    void setRenderImage(const QImage &image);
+    void setRenderPixmap(const QImage &image);
     NodeInstance(ProxyNodeInstanceData *d);
 
 private:
diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h
index ac1dcabb6fe..6003f1ce7ab 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h
@@ -84,6 +84,7 @@ public:
     QPointF instancePosition() const;
     QSizeF instanceSize() const;
     int instancePenWidth() const;
+    bool instanceIsRenderPixmapNull() const;
 
 
     void paintInstance(QPainter *painter);
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp
index cdbb363a9ed..072a5486195 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp
@@ -75,7 +75,7 @@ public:
     QHash<QString, bool> hasAnchors;
     QHash<QString, QString> instanceTypes;
 
-    QImage renderImage;
+    QPixmap renderPixmap;
     QHash<QString, QPair<QString, qint32> > anchors;
 };
 
@@ -249,8 +249,8 @@ int NodeInstance::penWidth() const
 
 void NodeInstance::paint(QPainter *painter)
 {
-    if (isValid() && !d->renderImage.isNull())
-        painter->drawImage(boundingRect().topLeft(), d->renderImage);
+    if (isValid() && !d->renderPixmap.isNull())
+        painter->drawPixmap(boundingRect().topLeft(), d->renderPixmap);
 }
 
 QVariant NodeInstance::property(const QString &name) const
@@ -307,9 +307,15 @@ void NodeInstance::setProperty(const QString &name, const QVariant &value)
     d->propertyValues.insert(name, value);
 }
 
-void NodeInstance::setRenderImage(const QImage &image)
+QPixmap NodeInstance::renderPixmap() const
 {
-    d->renderImage = image;
+    return d->renderPixmap;
+}
+
+void NodeInstance::setRenderPixmap(const QImage &image)
+{
+    if (!image.isNull())
+        d->renderPixmap = QPixmap::fromImage(image);
 }
 
 void NodeInstance::setParentId(qint32 instanceId)
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
index 241663e7088..adfdae29b3b 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -1069,7 +1069,7 @@ void NodeInstanceView::pixmapChanged(const PixmapChangedCommand &command)
         if (hasInstanceForId(container.instanceId())) {
             NodeInstance instance = instanceForId(container.instanceId());
             if (instance.isValid()) {
-                instance.setRenderImage(container.image());
+                instance.setRenderPixmap(container.image());
                 renderImageChangeSet.insert(instance.modelNode());
             }
         }
diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
index c313ea9ac1e..a847a4385be 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
@@ -270,6 +270,11 @@ int QmlItemNode::instancePenWidth() const
     return nodeInstance().penWidth();
 }
 
+bool QmlItemNode::instanceIsRenderPixmapNull() const
+{
+    return nodeInstance().renderPixmap().isNull();
+}
+
 void QmlItemNode::paintInstance(QPainter *painter)
 {
     if (nodeInstance().isValid())
-- 
GitLab