From a83548f189bbeac9deb7813ad7ec05d334f7a066 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Mon, 23 Jun 2014 21:20:36 +0200 Subject: [PATCH] QmlDesigner: Direct update of the position This is maybe harmful shortcut in 99.99% of the cases it should work better. Change-Id: Ia162666862498ac331c9f5381cb12753d34758c1 Reviewed-by: Tim Jenssen --- .../components/formeditor/movemanipulator.cpp | 11 ++++++ .../components/formeditor/movemanipulator.h | 2 ++ .../designercore/include/nodeinstance.h | 4 +++ .../designercore/include/nodeinstanceview.h | 1 + .../designercore/include/qmlobjectnode.h | 3 ++ .../designercore/instances/nodeinstance.cpp | 36 +++++++++++++++++-- .../instances/nodeinstanceview.cpp | 21 +++++++++++ 7 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index 32f6cfc5337..fd6a7383c2b 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -122,6 +122,14 @@ bool MoveManipulator::itemsCanReparented() const return true; } +void MoveManipulator::setDirectUpdateInNodeInstances(bool directUpdate) +{ + foreach (FormEditorItem* item, m_itemList) { + if (item && item->qmlItemNode().isValid()) + item->qmlItemNode().nodeInstance().setUpdateTransform(!directUpdate); + } +} + void MoveManipulator::begin(const QPointF &beginPoint) { m_isActive = true; @@ -159,6 +167,8 @@ void MoveManipulator::begin(const QPointF &beginPoint) // setOpacityForAllElements(0.62); + setDirectUpdateInNodeInstances(true); + m_rewriterTransaction = m_view->beginRewriterTransaction(QByteArrayLiteral("MoveManipulator::begin")); } @@ -371,6 +381,7 @@ void MoveManipulator::reparentTo(FormEditorItem *newParent) void MoveManipulator::end() { + setDirectUpdateInNodeInstances(false); m_isActive = false; deleteSnapLines(); clear(); diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h index a38abf03456..a6885a916b6 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h @@ -97,6 +97,8 @@ protected: void adjustAnchoringOfItem(FormEditorItem *item); + void setDirectUpdateInNodeInstances(bool directUpdate); + private: Snapper m_snapper; QPointer m_layerItem; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index 6ba98515c82..49dcef76112 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h @@ -86,6 +86,10 @@ public: qint32 parentId() const; qint32 instanceId() const; + void setUpdateTransform(bool updateTransform); + bool updateTransform() const; + void setX(double x); + void setY(double y); protected: void setProperty(const PropertyName &name, const QVariant &value); diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 07290d20b61..7d9759e364c 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -136,6 +136,7 @@ public: NodeInstance activeStateInstance() const; + void updatePosition(const QList& propertyList); void valuesChanged(const ValuesChangedCommand &command); void pixmapChanged(const PixmapChangedCommand &command); diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index 5344ed7cf33..ffad71c30cf 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -41,9 +41,12 @@ namespace QmlDesigner { class QmlItemNode; class QmlPropertyChanges; +class MoveManipulator; class QMLDESIGNERCORE_EXPORT QmlObjectNode : public QmlModelNodeFacade { + friend class QmlItemNode; + friend class MoveManipulator; public: QmlObjectNode(); QmlObjectNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 18b4c8d13a0..4eb9aed1f4b 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -51,7 +51,8 @@ public: hasContent(false), isMovable(false), isResizable(false), - isInLayoutable(false) + isInLayoutable(false), + updateTransform(true) {} qint32 parentInstanceId; @@ -71,6 +72,7 @@ public: bool isMovable; bool isResizable; bool isInLayoutable; + bool updateTransform; QHash propertyValues; @@ -133,6 +135,36 @@ qint32 NodeInstance::instanceId() const return -1; } +void NodeInstance::setUpdateTransform(bool updateTransform) +{ + if (d) + d->updateTransform = updateTransform; +} + +bool NodeInstance::updateTransform() const +{ + if (d) + d->updateTransform || d->transform.isRotating() || d->transform.isScaling(); + else + return true; +} + +void NodeInstance::setX(double x) +{ + if(d && !updateTransform()) { + double dx = x - d->transform.dx(); + d->transform.translate(dx, 0.0); + } +} + +void NodeInstance::setY(double y) +{ + if(d && !updateTransform()) { + double dy = y - d->transform.dy(); + d->transform.translate(0.0, dy); + } +} + bool NodeInstance::isValid() const { return instanceId() >= 0 && modelNode().isValid(); @@ -375,7 +407,7 @@ InformationName NodeInstance::setInformationContentItemBoundingRect(const QRectF InformationName NodeInstance::setInformationTransform(const QTransform &transform) { - if (d->transform != transform) { + if (updateTransform() && d->transform != transform) { d->transform = transform; return Transform; } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index eb4e5990f89..f8d54b57f4b 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -370,6 +370,7 @@ void NodeInstanceView::signalHandlerPropertiesChanged(const QVector& propertyList, PropertyChangeFlags /*propertyChange*/) { + updatePosition(propertyList); nodeInstanceServer()->changePropertyValues(createChangeValueCommand(propertyList)); } /*! @@ -673,6 +674,26 @@ NodeInstance NodeInstanceView::activeStateInstance() const return m_activeStateInstance; } +void NodeInstanceView::updatePosition(const QList &propertyList) +{ + QMultiHash informationChangeHash; + + foreach (const VariantProperty &variantProperty, propertyList) { + if (variantProperty.name() == "x") { + NodeInstance instance = instanceForModelNode(variantProperty.parentModelNode()); + instance.setX(variantProperty.value().toDouble()); + informationChangeHash.insert(variantProperty.parentModelNode(), Transform); + } else if (variantProperty.name() == "y") { + NodeInstance instance = instanceForModelNode(variantProperty.parentModelNode()); + instance.setY(variantProperty.value().toDouble()); + informationChangeHash.insert(variantProperty.parentModelNode(), Transform); + } + } + + if (!informationChangeHash.isEmpty()) + emitInstanceInformationsChange(informationChangeHash); +} + NodeInstanceServerInterface *NodeInstanceView::nodeInstanceServer() const { return m_nodeInstanceServer.data();