diff options
author | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2011-06-30 17:30:17 +0200 |
---|---|---|
committer | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2011-06-30 17:36:09 +0200 |
commit | 3cfa37624395d23d48fddb7e91e83168fe1dfc3f (patch) | |
tree | de29095349cbc510f79a5470ea89450af77ea6c7 | |
parent | b18ef1ffb240506368459845fe1b9e932a49b44c (diff) | |
download | qt-creator-3cfa37624395d23d48fddb7e91e83168fe1dfc3f.tar.gz |
QmlDesigner: Fix wrong position for reparenting
Change-Id: Ie9d9a739e559d5cfc06849ff3e5c086e9ab2224c
DoneBy: Marco Bubke
Task-number: QTCREATORBUG-3962
Reviewed-on: http://codereview.qt.nokia.com/958
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
22 files changed, 126 insertions, 38 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.cpp index 7559998c81..502778d3f6 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.cpp @@ -39,9 +39,10 @@ ChildrenChangedCommand::ChildrenChangedCommand() { } -ChildrenChangedCommand::ChildrenChangedCommand(qint32 parentInstanceId, const QVector<qint32> &children) +ChildrenChangedCommand::ChildrenChangedCommand(qint32 parentInstanceId, const QVector<qint32> &children, const QVector<InformationContainer> &informationVector) : m_parentInstanceId(parentInstanceId), - m_childrenVector(children) + m_childrenVector(children), + m_informationVector(informationVector) { } @@ -55,11 +56,16 @@ qint32 ChildrenChangedCommand::parentInstanceId() const return m_parentInstanceId; } +QVector<InformationContainer> ChildrenChangedCommand::informations() const +{ + return m_informationVector; +} + QDataStream &operator<<(QDataStream &out, const ChildrenChangedCommand &command) { out << command.parentInstanceId(); out << command.childrenInstances(); - + out << command.informations(); return out; } @@ -67,6 +73,7 @@ QDataStream &operator>>(QDataStream &in, ChildrenChangedCommand &command) { in >> command.m_parentInstanceId; in >> command.m_childrenVector; + in >> command.m_informationVector; return in; } diff --git a/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.h b/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.h index 8441c852a1..e89d88a4a0 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/childrenchangedcommand.h @@ -35,7 +35,7 @@ #include <QMetaType> #include <QVector> - +#include "informationcontainer.h" namespace QmlDesigner { @@ -44,14 +44,16 @@ class ChildrenChangedCommand friend QDataStream &operator>>(QDataStream &in, ChildrenChangedCommand &command); public: ChildrenChangedCommand(); - ChildrenChangedCommand(qint32 parentInstanceId, const QVector<qint32> &childrenInstances); + ChildrenChangedCommand(qint32 parentInstanceId, const QVector<qint32> &childrenInstancesconst, const QVector<InformationContainer> &informationVector); QVector<qint32> childrenInstances() const; qint32 parentInstanceId() const; + QVector<InformationContainer> informations() const; private: qint32 m_parentInstanceId; QVector<qint32> m_childrenVector; + QVector<InformationContainer> m_informationVector; }; QDataStream &operator<<(QDataStream &out, const ChildrenChangedCommand &command); diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp index 7c5e49fd71..84f7d8fcd2 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.cpp @@ -812,17 +812,7 @@ NodeInstanceClientInterface *NodeInstanceServer::nodeInstanceClient() const return m_nodeInstanceClient; } -ChildrenChangedCommand NodeInstanceServer::createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList<ServerNodeInstance> &instanceList) const -{ - QVector<qint32> instanceVector; - - foreach (const ServerNodeInstance &instance, instanceList) - instanceVector.append(instance.instanceId()); - - return ChildrenChangedCommand(parentInstance.instanceId(), instanceVector); -} - -InformationChangedCommand NodeInstanceServer::createAllInformationChangedCommand(const QList<ServerNodeInstance> &instanceList, bool initial) const +static QVector<InformationContainer> createInformationVector(const QList<ServerNodeInstance> &instanceList, bool initial) { QVector<InformationContainer> informationVector; @@ -894,7 +884,23 @@ InformationChangedCommand NodeInstanceServer::createAllInformationChangedCommand } - return InformationChangedCommand(informationVector); + return informationVector; +} + + +ChildrenChangedCommand NodeInstanceServer::createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList<ServerNodeInstance> &instanceList) const +{ + QVector<qint32> instanceVector; + + foreach (const ServerNodeInstance &instance, instanceList) + instanceVector.append(instance.instanceId()); + + return ChildrenChangedCommand(parentInstance.instanceId(), instanceVector, createInformationVector(instanceList, false)); +} + +InformationChangedCommand NodeInstanceServer::createAllInformationChangedCommand(const QList<ServerNodeInstance> &instanceList, bool initial) const +{ + return InformationChangedCommand(createInformationVector(instanceList, initial)); } static bool supportedVariantType(QVariant::Type type) diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp index ab8831d116..14cfabb1bc 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp @@ -170,20 +170,22 @@ void Qt4InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands() } } + informationChangedInstanceSet.subtract(m_parentChangedSet); + clearChangedPropertyList(); resetAllItems(); + if (!m_parentChangedSet.isEmpty()) { + sendChildrenChangedCommand(m_parentChangedSet.toList()); + m_parentChangedSet.clear(); + } + if (!informationChangedInstanceSet.isEmpty()) nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList())); if (!propertyChangedList.isEmpty()) nodeInstanceClient()->valuesChanged(createValuesChangedCommand(propertyChangedList)); - if (!m_parentChangedSet.isEmpty()) { - sendChildrenChangedCommand(m_parentChangedSet.toList()); - m_parentChangedSet.clear(); - } - if (adjustSceneRect) { QRectF boundingRect = rootNodeInstance().boundingRect(); if (boundingRect.isValid()) { diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h index eed1ec3088..f61ef51631 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.h @@ -82,6 +82,7 @@ public: virtual void formEditorItemsChanged(const QList<FormEditorItem*> &itemList) = 0; virtual void instancesCompleted(const QList<FormEditorItem*> &itemList) = 0; + virtual void instancesParentChanged(const QList<FormEditorItem*> &itemList) = 0; void setItems(const QList<FormEditorItem*> &itemList); QList<FormEditorItem*> items() const; diff --git a/src/plugins/qmldesigner/components/formeditor/anchortool.cpp b/src/plugins/qmldesigner/components/formeditor/anchortool.cpp index 85d3707e69..b058a50249 100644 --- a/src/plugins/qmldesigner/components/formeditor/anchortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/anchortool.cpp @@ -220,6 +220,10 @@ void AnchorTool::instancesCompleted(const QList<FormEditorItem*> &/*itemList*/) { } +void AnchorTool::instancesParentChanged(const QList<FormEditorItem *> &/*itemList*/) +{ +} + AnchorLineHandleItem* AnchorTool::topAnchorLineHandleItem(const QList<QGraphicsItem*> & itemList) { foreach (QGraphicsItem *item, itemList) { diff --git a/src/plugins/qmldesigner/components/formeditor/anchortool.h b/src/plugins/qmldesigner/components/formeditor/anchortool.h index b5a19a4c79..27fc531fca 100644 --- a/src/plugins/qmldesigner/components/formeditor/anchortool.h +++ b/src/plugins/qmldesigner/components/formeditor/anchortool.h @@ -74,6 +74,8 @@ public: void formEditorItemsChanged(const QList<FormEditorItem*> &itemList); void instancesCompleted(const QList<FormEditorItem*> &itemList); + void instancesParentChanged(const QList<FormEditorItem *> &itemList); + static AnchorLineHandleItem* topAnchorLineHandleItem(const QList<QGraphicsItem*> & itemList); diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index 435b86e3d7..38556c08cb 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -217,6 +217,12 @@ void DragTool::instancesCompleted(const QList<FormEditorItem*> &itemList) QmlDesignerItemLibraryDragAndDrop::CustomDragAndDrop::hide(); } +void DragTool::instancesParentChanged(const QList<FormEditorItem *> &itemList) +{ + m_moveManipulator.synchronizeInstanceParent(itemList); +} + + void DragTool::clearMoveDelay() { if (!m_blockMove) @@ -381,6 +387,7 @@ void DragTool::dragMoveEvent(QGraphicsSceneDragDropEvent * event) QTimer::singleShot(1000, m_timerHandler.data(), SLOT(clearMoveDelay())); } } + if (event->mimeData()->hasFormat("application/vnd.bauhaus.libraryresource")) { } } diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.h b/src/plugins/qmldesigner/components/formeditor/dragtool.h index d397c73158..f2a8db7f10 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.h +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.h @@ -86,6 +86,7 @@ public: void itemsAboutToRemoved(const QList<FormEditorItem*> &itemList); void selectedItemsChanged(const QList<FormEditorItem*> &itemList); + void instancesParentChanged(const QList<FormEditorItem *> &itemList); void updateMoveManipulator(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index e0d0b58297..3cc5865564 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -56,6 +56,7 @@ #include <zoomaction.h> #include <nodeabstractproperty.h> #include <nodelistproperty.h> +#include <commondefines.h> namespace QmlDesigner { @@ -502,6 +503,7 @@ void FormEditorView::instancesChildrenChanged(const QVector<ModelNode> &nodeList } m_currentTool->formEditorItemsChanged(itemNodeList); + m_currentTool->instancesParentChanged(itemNodeList); } void FormEditorView::rewriterBeginTransaction() diff --git a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp index 4d6c3a769f..398dbe1f4d 100644 --- a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp @@ -145,6 +145,10 @@ void ItemCreatorTool::instancesCompleted(const QList<FormEditorItem*> &/*itemLis { } +void ItemCreatorTool::instancesParentChanged(const QList<FormEditorItem *> &/*itemList*/) +{ +} + void ItemCreatorTool::setItemString(const QString &itemString) { m_itemString = itemString; diff --git a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.h b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.h index 6c41176020..f7fab80b02 100644 --- a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.h +++ b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.h @@ -71,6 +71,7 @@ public: void formEditorItemsChanged(const QList<FormEditorItem*> &itemList); void instancesCompleted(const QList<FormEditorItem*> &itemList); + void instancesParentChanged(const QList<FormEditorItem *> &itemList); void setItemString(const QString &itemString); diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index 14bcc54256..c673e74130 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -88,6 +88,24 @@ void MoveManipulator::setItems(const QList<FormEditorItem*> &itemList) } } +void MoveManipulator::synchronizeInstanceParent(const QList<FormEditorItem*> &itemList) +{ + if (m_view->model()) { + foreach (FormEditorItem *item, itemList) { + if (m_itemList.contains(item)) { + QmlItemNode parentItemNode = QmlItemNode(item->qmlItemNode().instanceParent()); + if (parentItemNode.isValid()) { + m_snapper.setContainerFormEditorItem(m_view->scene()->itemForQmlItemNode(parentItemNode)); + m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem()); + m_snapper.updateSnappingLines(m_itemList); + updateHashes(); + break; + } + } + } + } +} + void MoveManipulator::updateHashes() { // foreach (FormEditorItem* item, m_itemList) @@ -344,13 +362,6 @@ void MoveManipulator::reparentTo(FormEditorItem *newParent) item->qmlItemNode().setParentProperty(parent.nodeAbstractProperty("data")); } } - - if (m_view->model()) { - m_snapper.setContainerFormEditorItem(newParent); - m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem()); - m_snapper.updateSnappingLines(m_itemList); - updateHashes(); - } } diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h index d24cb50716..a755e62613 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.h +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.h @@ -69,6 +69,7 @@ public: ~MoveManipulator(); void setItems(const QList<FormEditorItem*> &itemList); void setItem(FormEditorItem* item); + void synchronizeInstanceParent(const QList<FormEditorItem*> &itemList); void begin(const QPointF& beginPoint); void update(const QPointF& updatePoint, Snapping useSnapping, State stateToBeManipulated = UseActualState); diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp index 5b8226fff4..0b68938bc6 100644 --- a/src/plugins/qmldesigner/components/formeditor/movetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp @@ -256,6 +256,11 @@ void MoveTool::instancesCompleted(const QList<FormEditorItem*> & /*itemList*/) { } +void MoveTool::instancesParentChanged(const QList<FormEditorItem *> &itemList) +{ + m_moveManipulator.synchronizeInstanceParent(itemList); +} + bool MoveTool::haveSameParent(const QList<FormEditorItem*> &itemList) { if (itemList.isEmpty()) diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.h b/src/plugins/qmldesigner/components/formeditor/movetool.h index be9227f714..9225e09890 100644 --- a/src/plugins/qmldesigner/components/formeditor/movetool.h +++ b/src/plugins/qmldesigner/components/formeditor/movetool.h @@ -67,7 +67,8 @@ public: void selectedItemsChanged(const QList<FormEditorItem*> &itemList); - void instancesCompleted(const QList<FormEditorItem*> &/*itemList*/); + void instancesCompleted(const QList<FormEditorItem*> &itemList); + void instancesParentChanged(const QList<FormEditorItem *> &itemList); void updateMoveManipulator(); diff --git a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp index 3063daff4f..fca319def1 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp @@ -196,8 +196,14 @@ void ResizeTool::formEditorItemsChanged(const QList<FormEditorItem*> &itemList) m_resizeIndicator.updateItems(itemList); } - void ResizeTool::instancesCompleted(const QList<FormEditorItem*> &/*itemList*/) - { - } +void ResizeTool::instancesCompleted(const QList<FormEditorItem*> &/*itemList*/) +{ +} + + +void ResizeTool::instancesParentChanged(const QList<FormEditorItem *> &/*itemList*/) +{ + +} } diff --git a/src/plugins/qmldesigner/components/formeditor/resizetool.h b/src/plugins/qmldesigner/components/formeditor/resizetool.h index d7ffa7a050..68c935b676 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizetool.h +++ b/src/plugins/qmldesigner/components/formeditor/resizetool.h @@ -67,9 +67,11 @@ public: void clear(); void formEditorItemsChanged(const QList<FormEditorItem*> &itemList); + void instancesParentChanged(const QList<FormEditorItem *> &itemList); void instancesCompleted(const QList<FormEditorItem*> &itemList); + private: SelectionIndicator m_selectionIndicator; ResizeIndicator m_resizeIndicator; diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp index 110c751293..b79bf484ab 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp @@ -275,6 +275,11 @@ void SelectionTool::instancesCompleted(const QList<FormEditorItem*> &/*itemList* { } +void SelectionTool::instancesParentChanged(const QList<FormEditorItem *> &/*itemList*/) +{ + +} + void SelectionTool::selectUnderPoint(QGraphicsSceneMouseEvent *event) { m_singleSelectionManipulator.begin(event->scenePos()); diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.h b/src/plugins/qmldesigner/components/formeditor/selectiontool.h index d9b1edcc37..a08c38dcae 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.h +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.h @@ -80,6 +80,8 @@ public: void formEditorItemsChanged(const QList<FormEditorItem*> &itemList); void instancesCompleted(const QList<FormEditorItem*> &itemList); + void instancesParentChanged(const QList<FormEditorItem *> &itemList); + void selectUnderPoint(QGraphicsSceneMouseEvent *event); diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 1cc469b411..5d3ef307d4 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -69,6 +69,7 @@ class ChangeIdsCommand; class RemoveInstancesCommand; class RemovePropertiesCommand; class CompleteComponentCommand; +class InformationContainer; class CORESHARED_EXPORT NodeInstanceView : public AbstractView, public NodeInstanceClientInterface { @@ -161,6 +162,8 @@ private: // functions void clearStateInstance(); NodeInstanceServerInterface *nodeInstanceServer() const; + QMultiHash<ModelNode, InformationName> informationChanged(const QVector<InformationContainer> &containerVector); + CreateSceneCommand createCreateSceneCommand(); ClearSceneCommand createClearSceneCommand() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 65c5a1bfba..eca58fa321 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1058,14 +1058,11 @@ void NodeInstanceView::pixmapChanged(const PixmapChangedCommand &command) emitInstancesRenderImageChanged(renderImageChangeSet.toList().toVector()); } -void NodeInstanceView::informationChanged(const InformationChangedCommand &command) +QMultiHash<ModelNode, InformationName> NodeInstanceView::informationChanged(const QVector<InformationContainer> &containerVector) { - if (!model()) - return; - QMultiHash<ModelNode, InformationName> informationChangeHash; - foreach(const InformationContainer &container, command.informations()) { + foreach (const InformationContainer &container, containerVector) { if (hasInstanceForId(container.instanceId())) { NodeInstance instance = instanceForId(container.instanceId()); if (instance.isValid()) { @@ -1076,6 +1073,16 @@ void NodeInstanceView::informationChanged(const InformationChangedCommand &comma } } + return informationChangeHash; +} + +void NodeInstanceView::informationChanged(const InformationChangedCommand &command) +{ + if (!model()) + return; + + QMultiHash<ModelNode, InformationName> informationChangeHash = informationChanged(command.informations()); + if (!informationChangeHash.isEmpty()) emitInstanceInformationsChange(informationChangeHash); } @@ -1138,6 +1145,7 @@ void NodeInstanceView::childrenChanged(const ChildrenChangedCommand &command) if (!model()) return; + QVector<ModelNode> childNodeVector; foreach(qint32 instanceId, command.childrenInstances()) { @@ -1148,6 +1156,11 @@ void NodeInstanceView::childrenChanged(const ChildrenChangedCommand &command) } } + QMultiHash<ModelNode, InformationName> informationChangeHash = informationChanged(command.informations()); + + if (!informationChangeHash.isEmpty()) + emitInstanceInformationsChange(informationChangeHash); + if (!childNodeVector.isEmpty()) emitInstancesChildrenChanged(childNodeVector); } |