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