diff options
author | Marco Bubke <marco.bubke@digia.com> | 2014-06-23 21:20:36 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@digia.com> | 2014-06-23 22:24:07 +0200 |
commit | a83548f189bbeac9deb7813ad7ec05d334f7a066 (patch) | |
tree | 4013caec34b6520263b79a5319cfc6e98ab1bf0d | |
parent | 8dfb05c8463282590d29534933a25d9ab529efa4 (diff) | |
download | qt-creator-a83548f189bbeac9deb7813ad7ec05d334f7a066.tar.gz |
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 <tim.jenssen@digia.com>
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 32f6cfc533..fd6a7383c2 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 a38abf0345..a6885a916b 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<LayerItem> m_layerItem; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index 6ba98515c8..49dcef7611 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 07290d20b6..7d9759e364 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<VariantProperty>& 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 5344ed7cf3..ffad71c30c 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 18b4c8d13a..4eb9aed1f4 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<PropertyName, QVariant> 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 eb4e5990f8..f8d54b57f4 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<SignalHandle void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& 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<VariantProperty> &propertyList) +{ + QMultiHash<ModelNode, InformationName> 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(); |