diff --git a/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.cpp index 15786c92a46..cbb58d1e4e5 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.cpp @@ -906,6 +906,10 @@ void ObjectNodeInstance::setInPositioner(bool isInPositioner) m_isInPositioner = isInPositioner; } +void ObjectNodeInstance::refreshPositioner() +{ +} + void ObjectNodeInstance::updateAnchors() { } diff --git a/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.h b/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.h index f374b44b269..68198df1908 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/instances/objectnodeinstance.h @@ -165,6 +165,7 @@ public: virtual bool isMovable() const; bool isInPositioner() const; void setInPositioner(bool isInPositioner); + virtual void refreshPositioner(); bool hasBindingForProperty(const QString &name, bool *hasChanged = 0) const; diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.cpp index 7643bc1c6fa..a6dfa634f66 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.cpp @@ -84,5 +84,18 @@ PositionerNodeInstance::Pointer PositionerNodeInstance::create(QObject *object) return instance; } + +QDeclarativeBasePositioner *PositionerNodeInstance::positioner() const +{ + Q_ASSERT(qobject_cast(object())); + return static_cast(object()); +} + +void PositionerNodeInstance::refreshPositioner() +{ + bool success = QMetaObject::invokeMethod(positioner(), "prePositioning"); + Q_ASSERT(success); +} + } } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.h index 1a0406e2742..cd3794e6e4e 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/positionernodeinstance.h @@ -57,9 +57,11 @@ public: bool isResizable() const; + void refreshPositioner(); protected: PositionerNodeInstance(QDeclarativeBasePositioner *item); + QDeclarativeBasePositioner *positioner() const; }; } // namespace Internal diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qmlgraphicsitemnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qmlgraphicsitemnodeinstance.cpp index df0e8ef9bc5..ef733117734 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qmlgraphicsitemnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qmlgraphicsitemnodeinstance.cpp @@ -154,6 +154,8 @@ void QmlGraphicsItemNodeInstance::setPropertyVariant(const QString &name, const GraphicsObjectNodeInstance::setPropertyVariant(name, value); refresh(); + if (isInPositioner()) + parentInstance()->refreshPositioner(); } void QmlGraphicsItemNodeInstance::setPropertyBinding(const QString &name, const QString &expression) @@ -325,6 +327,9 @@ void QmlGraphicsItemNodeInstance::resetProperty(const QString &name) } GraphicsObjectNodeInstance::resetProperty(name); + + if (isInPositioner()) + parentInstance()->refreshPositioner(); } void QmlGraphicsItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParentInstance, const QString &oldParentProperty, const ObjectNodeInstance::Pointer &newParentInstance, const QString &newParentProperty) @@ -353,6 +358,8 @@ void QmlGraphicsItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &ol } refresh(); + if (isInPositioner()) + parentInstance()->refreshPositioner(); } QDeclarativeAnchors::Anchor anchorLineFlagForName(const QString &name) diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index ce855211c2f..ad3d77bd896 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -108,7 +109,8 @@ void MoveManipulator::synchronizeParent(const QList &itemList, } } - update(m_lastPosition, NoSnapping, UseBaseState); + if (!parentNode.metaInfo().isSubclassOf(".QDeclarativeBasePositioner", -1, -1)) + update(m_lastPosition, NoSnapping, UseBaseState); } void MoveManipulator::synchronizeInstanceParent(const QList &itemList) @@ -363,6 +365,15 @@ void MoveManipulator::reparentTo(FormEditorItem *newParent) if (!itemsCanReparented()) return; + if (!newParent->qmlItemNode().modelNode().metaInfo().isSubclassOf(".QDeclarativeBasePositioner", -1, -1) + && newParent->qmlItemNode().modelNode().hasParentProperty()) { + ModelNode grandParent = newParent->qmlItemNode().modelNode().parentProperty().parentModelNode(); + if (grandParent.metaInfo().isSubclassOf(".QDeclarativeBasePositioner", -1, -1)) + newParent = m_view.data()->scene()->itemForQmlItemNode(QmlItemNode(grandParent)); + } + + + QVector nodeReparentVector; NodeAbstractProperty parentProperty;