summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@digia.com>2014-06-23 21:20:36 +0200
committerTim Jenssen <tim.jenssen@digia.com>2014-06-23 22:24:07 +0200
commita83548f189bbeac9deb7813ad7ec05d334f7a066 (patch)
tree4013caec34b6520263b79a5319cfc6e98ab1bf0d
parent8dfb05c8463282590d29534933a25d9ab529efa4 (diff)
downloadqt-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>
-rw-r--r--src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp11
-rw-r--r--src/plugins/qmldesigner/components/formeditor/movemanipulator.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstance.h4
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceview.h1
-rw-r--r--src/plugins/qmldesigner/designercore/include/qmlobjectnode.h3
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp36
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp21
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();