diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h b/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h index 10e0a6470af..7cad0bdcd39 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/commondefines.h @@ -55,7 +55,9 @@ enum InformationName IsAnchoredBySibling, HasContent, HasBindingForProperty, - ContentTransform + ContentTransform, + ContentItemTransform, + ContentItemBoundingRect }; } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 8c36033a46b..8a8886490c9 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -887,8 +887,10 @@ static QVector createInformationVector(const QListparentItem() + && nodeInstanceServer->hasInstanceForObject(item->parentItem()) + && nodeInstanceServer->instanceForObject(item->parentItem()).internalInstance()->contentItem() == item; +} + static QTransform transformForItem(QQuickItem *item, NodeInstanceServer *nodeInstanceServer) { + if (isContentItem(item, nodeInstanceServer)) + return QTransform(); + QTransform toParentTransform = DesignerSupport::parentTransform(item); - if (item->parentItem() && !nodeInstanceServer->hasInstanceForObject(item->parentItem())) + if (item->parentItem() && !nodeInstanceServer->hasInstanceForObject(item->parentItem())) { + return transformForItem(item->parentItem(), nodeInstanceServer) * toParentTransform; + } return toParentTransform; } @@ -109,6 +122,35 @@ QuickItemNodeInstance::Pointer QuickItemNodeInstance::create(QObject *object) return instance; } +QQuickItem *QuickItemNodeInstance::contentItem() const +{ + return m_contentItem.data(); +} + +void QuickItemNodeInstance::doComponentComplete() +{ + GraphicalNodeInstance::doComponentComplete(); + + QQmlProperty contentItemProperty(quickItem(), "contentItem", engine()); + if (contentItemProperty.isValid()) + m_contentItem = contentItemProperty.read().value(); +} + +QRectF QuickItemNodeInstance::contentItemBoundingBox() const +{ + if (contentItem()) { + QTransform contentItemTransform = DesignerSupport::parentTransform(contentItem()); + return contentItemTransform.mapRect(contentItem()->boundingRect()); + } + + return QRectF(); +} + +QTransform QuickItemNodeInstance::contentItemTransform() const +{ + return DesignerSupport::parentTransform(contentItem()); +} + bool QuickItemNodeInstance::isQuickItem() const { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h index f978e769a24..1896036c68b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickitemnodeinstance.h @@ -50,7 +50,12 @@ public: static Pointer create(QObject *objectToBeWrapped); + virtual QQuickItem *contentItem() const; + + QRectF contentItemBoundingBox() const Q_DECL_OVERRIDE; + QTransform transform() const Q_DECL_OVERRIDE; + QTransform contentItemTransform() const Q_DECL_OVERRIDE; QObject *parent() const Q_DECL_OVERRIDE; @@ -61,6 +66,8 @@ public: bool isMovable() const Q_DECL_OVERRIDE; bool isQuickItem() const Q_DECL_OVERRIDE; + void doComponentComplete(); + protected: QuickItemNodeInstance(QQuickItem*); QQuickItem *quickItem() const; @@ -68,6 +75,7 @@ protected: void setResizable(bool resizable); private: //variables + QPointer m_contentItem; bool m_isResizable; bool m_isMovable; }; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp index 07645ff281f..82834da7dd7 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quickwindownodeinstance.cpp @@ -88,7 +88,6 @@ QuickWindowNodeInstance::Pointer QuickWindowNodeInstance::create(QObject *object QQuickItemPrivate *privateItem = static_cast(QObjectPrivate::get(quickWindow->contentItem())); if (privateItem->window) { - qDebug() << "removing from window"; if (!privateItem->parentItem) QQuickWindowPrivate::get(privateItem->window)->parentlessItems.remove(quickWindow->contentItem()); privateItem->derefWindow(); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp index be1dde6e3a9..a40019c5794 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.cpp @@ -315,6 +315,11 @@ QRectF ServerNodeInstance::boundingRect() const return boundingRect; } +QRectF ServerNodeInstance::contentItemBoundingRect() const +{ + return m_nodeInstance->contentItemBoundingBox(); +} + void ServerNodeInstance::setPropertyVariant(const PropertyName &name, const QVariant &value) { m_nodeInstance->setPropertyVariant(name, value); @@ -515,6 +520,11 @@ QTransform ServerNodeInstance::contentTransform() const return m_nodeInstance->contentTransform(); } +QTransform ServerNodeInstance::contentItemTransform() const +{ + return m_nodeInstance->contentItemTransform(); +} + double ServerNodeInstance::rotation() const { return m_nodeInstance->rotation(); @@ -631,11 +641,6 @@ qint32 ServerNodeInstance::instanceId() const } } -QObject* ServerNodeInstance::testHandle() const -{ - return internalObject(); -} - QList ServerNodeInstance::stateInstances() const { return m_nodeInstance->stateInstances(); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h index 84fdee61190..bb11386bb8f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h @@ -105,12 +105,14 @@ public: bool equalGraphicsItem(QGraphicsItem *item) const; QRectF boundingRect() const; + QRectF contentItemBoundingRect() const; QPointF position() const; QSizeF size() const; QTransform transform() const; QTransform customTransform() const; QTransform sceneTransform() const; QTransform contentTransform() const; + QTransform contentItemTransform() const; double rotation() const; double scale() const; QList transformations() const; @@ -156,7 +158,6 @@ public: QString id() const; qint32 instanceId() const; - QObject* testHandle() const; QSharedPointer internalInstance() const; QList stateInstances() const; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp index 17f556d15d7..8bfcd042065 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -91,7 +91,7 @@ void FormEditorItem::updateGeometry() prepareGeometryChange(); m_boundingRect = qmlItemNode().instanceBoundingRect().adjusted(0, 0, 1., 1.); m_paintedBoundingRect = qmlItemNode().instancePaintedBoundingRect().united(m_boundingRect); - setTransform(qmlItemNode().instanceTransform()); + setTransform(qmlItemNode().instanceTransformWithContentTransform()); setTransform(m_attentionTransform, true); //the property for zValue is called z in QGraphicsObject if (qmlItemNode().instanceValue("z").isValid()) @@ -142,7 +142,7 @@ void FormEditorItem::setAttentionScale(double sinusScale) m_attentionTransform.translate(-centerPoint.x(), -centerPoint.y()); m_inverseAttentionTransform = m_attentionTransform.inverted(); prepareGeometryChange(); - setTransform(qmlItemNode().instanceTransform()); + setTransform(qmlItemNode().instanceTransformWithContentTransform()); setTransform(m_attentionTransform, true); } else { m_attentionTransform.reset(); @@ -391,7 +391,7 @@ SnapLineMap FormEditorItem::rightSnappingOffsets() const void FormEditorItem::updateSnappingLines(const QList &exceptionList, FormEditorItem *transformationSpaceItem) { - m_snappingLineCreator.update(exceptionList, transformationSpaceItem); + m_snappingLineCreator.update(exceptionList, transformationSpaceItem, this); } diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index 4d353429241..b1e1800ddf9 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -116,8 +116,9 @@ void MoveManipulator::updateHashes() // foreach (FormEditorItem* item, m_itemList) // m_beginItemRectHash[item] = item->mapRectToParent(item->qmlItemNode().instanceBoundingRect()); + QTransform fromSceneToContentItemTransform = m_snapper.containerFormEditorItem()->qmlItemNode().instanceSceneContentItemTransform().inverted(); foreach (FormEditorItem* item, m_itemList) { - QPointF positionInParentSpace = m_snapper.containerFormEditorItem()->mapFromScene(m_beginPositionInSceneSpaceHash.value(item)); + QPointF positionInParentSpace = fromSceneToContentItemTransform.map(m_beginPositionInSceneSpaceHash.value(item)); m_beginItemRectHash[item].translate(positionInParentSpace - m_beginPositionHash.value(item)); m_beginPositionHash.insert(item, positionInParentSpace); } @@ -147,17 +148,19 @@ void MoveManipulator::begin(const QPointF &beginPoint) m_beginItemRectHash.insert(item, m_snapper.containerFormEditorItem()->mapRectFromItem(item, item->qmlItemNode().instanceBoundingRect())); } + QTransform fromContentItemToSceneTransform = m_snapper.containerFormEditorItem()->qmlItemNode().instanceSceneContentItemTransform(); foreach (FormEditorItem* item, m_itemList) { if (item && item->qmlItemNode().isValid()) { QPointF positionInParentSpace(item->qmlItemNode().instancePosition()); - QPointF positionInScenesSpace = m_snapper.containerFormEditorItem()->mapToScene(positionInParentSpace); + QPointF positionInScenesSpace = fromContentItemToSceneTransform.map(positionInParentSpace); m_beginPositionInSceneSpaceHash.insert(item, positionInScenesSpace); } } + QTransform fromSceneToContentItemTransform = m_snapper.containerFormEditorItem()->qmlItemNode().instanceSceneContentItemTransform().inverted(); foreach (FormEditorItem* item, m_itemList) { if (item && item->qmlItemNode().isValid()) { - QPointF positionInParentSpace = m_snapper.containerFormEditorItem()->mapFromScene(m_beginPositionInSceneSpaceHash.value(item)); + QPointF positionInParentSpace = fromSceneToContentItemTransform.map(m_beginPositionInSceneSpaceHash.value(item)); m_beginPositionHash.insert(item, positionInParentSpace); QmlAnchors anchors(item->qmlItemNode().anchors()); @@ -270,8 +273,9 @@ void MoveManipulator::update(const QPointF& updatePoint, Snapper::Snapping useSn if (m_itemList.isEmpty()) { return; } else { - QPointF updatePointInContainerSpace(m_snapper.containerFormEditorItem()->mapFromScene(updatePoint)); - QPointF beginPointInContainerSpace(m_snapper.containerFormEditorItem()->mapFromScene(m_beginPoint)); + QTransform fromSceneToContentItemTransform = m_snapper.containerFormEditorItem()->qmlItemNode().instanceSceneContentItemTransform().inverted(); + QPointF updatePointInContainerSpace(fromSceneToContentItemTransform.map(updatePoint)); + QPointF beginPointInContainerSpace(fromSceneToContentItemTransform.map(m_beginPoint)); QPointF offsetVector(updatePointInContainerSpace - beginPointInContainerSpace); diff --git a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp index 5d92f0f4aa7..e35b2ede565 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.cpp @@ -77,8 +77,9 @@ void ResizeManipulator::begin(const QPointF &/*beginPoint*/) if (m_resizeController.isValid()) { m_isActive = true; m_beginBoundingRect = m_resizeController.formEditorItem()->qmlItemNode().instanceBoundingRect(); - m_beginToSceneTransform = m_resizeController.formEditorItem()->qmlItemNode().instanceSceneTransform(); - m_beginFromSceneTransform = m_beginToSceneTransform.inverted(); + m_beginFromContentItemToSceneTransform = m_resizeController.formEditorItem()->qmlItemNode().instanceSceneContentItemTransform(); + m_beginFromSceneToContentItemTransform = m_beginFromContentItemToSceneTransform.inverted(); + m_beginFromItemToSceneTransform = m_resizeController.formEditorItem()->qmlItemNode().instanceSceneTransform(); m_beginToParentTransform = m_resizeController.formEditorItem()->qmlItemNode().instanceTransform(); m_rewriterTransaction = m_view->beginRewriterTransaction(); m_snapper.updateSnappingLines(m_resizeController.formEditorItem()); @@ -116,7 +117,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapper::Snapping use if (!containerItem) return; - QPointF updatePointInLocalSpace = m_beginFromSceneTransform.map(updatePoint); + QPointF updatePointInLocalSpace = m_beginFromSceneToContentItemTransform.map(updatePoint); QmlAnchors anchors(formEditorItem->qmlItemNode().anchors()); QRectF boundingRect(m_beginBoundingRect); @@ -372,7 +373,7 @@ void ResizeManipulator::update(const QPointF& updatePoint, Snapper::Snapping use if (snap) m_graphicsLineList = m_snapper.generateSnappingLines(boundingRect, m_layerItem.data(), - m_beginToSceneTransform); + m_beginFromItemToSceneTransform); } } @@ -484,8 +485,9 @@ void ResizeManipulator::clear() deleteSnapLines(); m_beginBoundingRect = QRectF(); - m_beginFromSceneTransform = QTransform(); - m_beginToSceneTransform = QTransform(); + m_beginFromSceneToContentItemTransform = QTransform(); + m_beginFromContentItemToSceneTransform = QTransform(); + m_beginFromItemToSceneTransform = QTransform(); m_beginToParentTransform = QTransform(); m_beginTopMargin = 0.0; m_beginLeftMargin = 0.0; diff --git a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.h b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.h index 61a8e23044e..2654a365989 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizemanipulator.h +++ b/src/plugins/qmldesigner/components/formeditor/resizemanipulator.h @@ -72,8 +72,9 @@ private: QWeakPointer m_view; QList m_graphicsLineList; ResizeController m_resizeController; // hold the controller so that the handle cant be deleted - QTransform m_beginFromSceneTransform; - QTransform m_beginToSceneTransform; + QTransform m_beginFromSceneToContentItemTransform; + QTransform m_beginFromContentItemToSceneTransform; + QTransform m_beginFromItemToSceneTransform; QTransform m_beginToParentTransform; QRectF m_beginBoundingRect; QPointF m_beginBottomRightPoint; diff --git a/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.cpp b/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.cpp index 83ea59b3f52..0179af9d369 100644 --- a/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.cpp @@ -32,6 +32,8 @@ #include "formeditoritem.h" #include "formeditorview.h" +#include + namespace QmlDesigner { SnappingLineCreator::SnappingLineCreator(FormEditorItem *formEditorItem) @@ -117,7 +119,7 @@ void SnappingLineCreator::generateLines(const QList &exceptionL } } -void SnappingLineCreator::setContainerPadding(double containerPadding) +void SnappingLineCreator::setContainerPaddingByGloablPadding(double containerPadding) { m_topPadding = containerPadding; m_bottomPadding = containerPadding; @@ -125,6 +127,14 @@ void SnappingLineCreator::setContainerPadding(double containerPadding) m_rightPadding = containerPadding; } +void SnappingLineCreator::setContainerPaddingByContentItem(const QRectF &contentRectangle, const QRectF &itemBoundingRectangle) +{ + m_topPadding = contentRectangle.top() - itemBoundingRectangle.top(); + m_bottomPadding = itemBoundingRectangle.bottom() - contentRectangle.bottom(); + m_leftPadding = contentRectangle.left() - itemBoundingRectangle.left(); + m_rightPadding = itemBoundingRectangle.right() - contentRectangle.right(); +} + void SnappingLineCreator::setSpacing(double spacing) { m_topOffset = spacing; @@ -134,10 +144,11 @@ void SnappingLineCreator::setSpacing(double spacing) } void SnappingLineCreator::update(const QList &exceptionList, - FormEditorItem *transformationSpaceItem) + FormEditorItem *transformationSpaceItem, + FormEditorItem *containerFormEditorItem) { clearLines(); - setContainerPadding(m_formEditorItem->formEditorView()->containerPadding()); + setContainerPaddingItem(containerFormEditorItem); setSpacing(m_formEditorItem->formEditorView()->spacing()); generateLines(exceptionList, transformationSpaceItem); } @@ -192,4 +203,15 @@ SnapLineMap SnappingLineCreator::rightOffsets() const return m_rightOffsetMap; } +void SnappingLineCreator::setContainerPaddingItem(FormEditorItem *transformationSpaceItem) +{ + QmlItemNode containerItemNode = transformationSpaceItem->qmlItemNode(); + QRectF contentRect = containerItemNode.instanceContentItemBoundingRect(); + + if (contentRect.isValid()) + setContainerPaddingByContentItem(contentRect, containerItemNode.instanceBoundingRect()); + else + setContainerPaddingByGloablPadding(m_formEditorItem->formEditorView()->containerPadding()); +} + } diff --git a/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h b/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h index 7c6adc804b6..e3b4e7e2ac4 100644 --- a/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h +++ b/src/plugins/qmldesigner/components/formeditor/snappinglinecreator.h @@ -48,7 +48,8 @@ public: SnappingLineCreator(FormEditorItem *formEditorItem); void update(const QList &exceptionList, - FormEditorItem *transformationSpaceItem); + FormEditorItem *transformationSpaceItem, + FormEditorItem *containerFormEditorItem); SnapLineMap topLines() const; @@ -63,7 +64,9 @@ public: SnapLineMap leftOffsets() const; SnapLineMap rightOffsets() const; - void setContainerPadding(double containerPadding); + void setContainerPaddingItem(FormEditorItem *transformationSpaceItem); + void setContainerPaddingByGloablPadding(double containerPadding); + void setContainerPaddingByContentItem(const QRectF &contentRectangle, const QRectF &itemBoundingRectangle); void setSpacing(double spacing); protected: diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index 284059f103e..2f21d5cd1ed 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h @@ -59,6 +59,7 @@ public: bool isValid() const; void makeInvalid(); QRectF boundingRect() const; + QRectF contentItemBoundingRect() const; bool hasContent() const; bool isAnchoredBySibling() const; bool isAnchoredByChildren() const; @@ -66,6 +67,7 @@ public: bool isResizable() const; QTransform transform() const; QTransform contentTransform() const; + QTransform contentItemTransform() const; QTransform sceneTransform() const; bool isInLayoutable() const; QPointF position() const; @@ -93,8 +95,10 @@ protected: InformationName setInformationSize(const QSizeF &size); InformationName setInformationBoundingRect(const QRectF &rectangle); + InformationName setInformationContentItemBoundingRect(const QRectF &rectangle); InformationName setInformationTransform(const QTransform &transform); InformationName setInformationContentTransform(const QTransform &contentTransform); + InformationName setInformationContentItemTransform(const QTransform &contentItemTransform); InformationName setInformationPenWith(int penWidth); InformationName setInformationPosition(const QPointF &position); InformationName setInformationIsInLayoutable(bool isInLayoutable); diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index 1d37ad4416e..cebb50b5909 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -53,6 +53,8 @@ public: bool isValid() const; bool isRootNode() const; + static bool isItemOrWindow(const ModelNode &modelNode); + QmlModelStateGroup states() const; QList children() const; QList resources() const; @@ -75,8 +77,12 @@ public: QRectF instanceBoundingRect() const; QRectF instancePaintedBoundingRect() const; + QRectF instanceContentItemBoundingRect() const; QTransform instanceTransform() const; + QTransform instanceTransformWithContentTransform() const; + QTransform instanceTransformWithContentItemTransform() const; QTransform instanceSceneTransform() const; + QTransform instanceSceneContentItemTransform() const; QPointF instanceScenePosition() const; QPointF instancePosition() const; QSizeF instanceSize() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index bbbecdbe6f5..092b19f6c0a 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -50,8 +50,10 @@ public: bool hasNodeParent() const; bool hasInstanceParent() const; + bool hasInstanceParentItem() const; void setParentProperty(const NodeAbstractProperty &parentProeprty); QmlObjectNode instanceParent() const; + QmlItemNode instanceParentItem() const; void setId(const QString &id); QString id() const; @@ -105,6 +107,7 @@ public: protected: NodeInstance nodeInstance() const; QmlObjectNode nodeForInstance(const NodeInstance &instance) const; + QmlItemNode itemForInstance(const NodeInstance &instance) const; protected: QList allDefinedStates() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index e787d46c394..efc4ad080b6 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -53,10 +53,12 @@ public: qint32 parentInstanceId; ModelNode modelNode; QRectF boundingRect; + QRectF contentItemBoundingRect; QPointF position; QSizeF size; QTransform transform; QTransform contentTransform; + QTransform contentItemTransform; QTransform sceneTransform; int penWidth; bool isAnchoredBySibling; @@ -144,6 +146,14 @@ QRectF NodeInstance::boundingRect() const return QRectF(); } +QRectF NodeInstance::contentItemBoundingRect() const +{ + if (isValid()) + return d->contentItemBoundingRect; + else + return QRectF(); +} + bool NodeInstance::hasContent() const { if (isValid()) @@ -199,6 +209,14 @@ QTransform NodeInstance::contentTransform() const else return QTransform(); } + +QTransform NodeInstance::contentItemTransform() const +{ + if (isValid()) + return d->contentItemTransform; + else + return QTransform(); +} QTransform NodeInstance::sceneTransform() const { if (isValid()) @@ -333,6 +351,16 @@ InformationName NodeInstance::setInformationBoundingRect(const QRectF &rectangle return NoInformationChange; } +InformationName NodeInstance::setInformationContentItemBoundingRect(const QRectF &rectangle) +{ + if (d->contentItemBoundingRect != rectangle) { + d->contentItemBoundingRect = rectangle; + return ContentItemBoundingRect; + } + + return NoInformationChange; +} + InformationName NodeInstance::setInformationTransform(const QTransform &transform) { if (d->transform != transform) { @@ -353,6 +381,16 @@ InformationName NodeInstance::setInformationContentTransform(const QTransform &c return NoInformationChange; } +InformationName NodeInstance::setInformationContentItemTransform(const QTransform &contentItemTransform) +{ + if (d->contentItemTransform != contentItemTransform) { + d->contentItemTransform = contentItemTransform; + return ContentItemTransform; + } + + return NoInformationChange; +} + InformationName NodeInstance::setInformationPenWith(int penWidth) { if (d->penWidth != penWidth) { @@ -489,8 +527,10 @@ InformationName NodeInstance::setInformation(InformationName name, const QVarian switch (name) { case Size: return setInformationSize(information.toSizeF()); case BoundingRect: return setInformationBoundingRect(information.toRectF()); + case ContentItemBoundingRect: setInformationContentItemBoundingRect(information.toRectF()); case Transform: return setInformationTransform(information.value()); case ContentTransform: return setInformationContentTransform(information.value()); + case ContentItemTransform: return setInformationContentItemTransform(information.value()); case PenWidth: return setInformationPenWith(information.toInt()); case Position: return setInformationPosition(information.toPointF()); case IsInLayoutable: return setInformationIsInLayoutable(information.toBool()); diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index f9626b18fce..0da7a5445cd 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -37,9 +37,7 @@ namespace QmlDesigner { -namespace { - -bool isItemOrWindow(const ModelNode &modelNode) +bool QmlItemNode::isItemOrWindow(const ModelNode &modelNode) { if (modelNode.metaInfo().isSubclassOf("QtQuick.Item", -1, -1)) return true; @@ -50,8 +48,6 @@ bool isItemOrWindow(const ModelNode &modelNode) return false; } -} - bool QmlItemNode::isValid() const { return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && isItemOrWindow(modelNode()); @@ -239,16 +235,36 @@ QRectF QmlItemNode::instancePaintedBoundingRect() const return nodeInstance().boundingRect(); } +QRectF QmlItemNode::instanceContentItemBoundingRect() const +{ + return nodeInstance().contentItemBoundingRect(); +} + QTransform QmlItemNode::instanceTransform() const { return nodeInstance().transform(); } +QTransform QmlItemNode::instanceTransformWithContentTransform() const +{ + return nodeInstance().transform() * nodeInstance().contentTransform(); +} + +QTransform QmlItemNode::instanceTransformWithContentItemTransform() const +{ + return nodeInstance().transform() * nodeInstance().contentItemTransform(); +} + QTransform QmlItemNode::instanceSceneTransform() const { return nodeInstance().sceneTransform(); } +QTransform QmlItemNode::instanceSceneContentItemTransform() const +{ + return nodeInstance().sceneTransform() * nodeInstance().contentItemTransform(); +} + QPointF QmlItemNode::instanceScenePosition() const { QmlItemNode parentNode = instanceParent().toQmlItemNode(); diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 42643ed82fb..42c41dc6ab8 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -444,6 +444,11 @@ QmlObjectNode QmlObjectNode::nodeForInstance(const NodeInstance &instance) const return QmlObjectNode(ModelNode(instance.modelNode(), qmlModelView())); } +QmlItemNode QmlObjectNode::itemForInstance(const NodeInstance &instance) const +{ + return QmlItemNode(ModelNode(instance.modelNode(), qmlModelView())); +} + bool QmlObjectNode::hasNodeParent() const { return modelNode().hasParentProperty(); @@ -454,6 +459,13 @@ bool QmlObjectNode::hasInstanceParent() const return nodeInstance().parentId() >= 0 && qmlModelView()->nodeInstanceView()->hasInstanceForId(nodeInstance().parentId()); } +bool QmlObjectNode::hasInstanceParentItem() const +{ + return nodeInstance().parentId() >= 0 + && qmlModelView()->nodeInstanceView()->hasInstanceForId(nodeInstance().parentId()) + && QmlItemNode::isItemOrWindow(qmlModelView()->modelNodeForInternalId(nodeInstance().parentId())); +} + void QmlObjectNode::setParentProperty(const NodeAbstractProperty &parentProeprty) { @@ -468,6 +480,14 @@ QmlObjectNode QmlObjectNode::instanceParent() const return QmlObjectNode(); } +QmlItemNode QmlObjectNode::instanceParentItem() const +{ + if (hasInstanceParentItem()) + return itemForInstance(qmlModelView()->nodeInstanceView()->instanceForId(nodeInstance().parentId())); + + return QmlItemNode(); +} + void QmlObjectNode::setId(const QString &id) { modelNode().setId(id);