From 3cfa37624395d23d48fddb7e91e83168fe1dfc3f Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Thu, 30 Jun 2011 17:30:17 +0200
Subject: [PATCH] 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>
---
 .../commands/childrenchangedcommand.cpp       | 13 ++++++--
 .../commands/childrenchangedcommand.h         |  6 ++--
 .../instances/nodeinstanceserver.cpp          | 30 +++++++++++--------
 .../qt4informationnodeinstanceserver.cpp      | 12 ++++----
 .../formeditor/abstractformeditortool.h       |  1 +
 .../components/formeditor/anchortool.cpp      |  4 +++
 .../components/formeditor/anchortool.h        |  2 ++
 .../components/formeditor/dragtool.cpp        |  7 +++++
 .../components/formeditor/dragtool.h          |  1 +
 .../components/formeditor/formeditorview.cpp  |  2 ++
 .../components/formeditor/itemcreatortool.cpp |  4 +++
 .../components/formeditor/itemcreatortool.h   |  1 +
 .../components/formeditor/movemanipulator.cpp | 25 +++++++++++-----
 .../components/formeditor/movemanipulator.h   |  1 +
 .../components/formeditor/movetool.cpp        |  5 ++++
 .../components/formeditor/movetool.h          |  3 +-
 .../components/formeditor/resizetool.cpp      | 12 ++++++--
 .../components/formeditor/resizetool.h        |  2 ++
 .../components/formeditor/selectiontool.cpp   |  5 ++++
 .../components/formeditor/selectiontool.h     |  2 ++
 .../designercore/include/nodeinstanceview.h   |  3 ++
 .../instances/nodeinstanceview.cpp            | 23 ++++++++++----
 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 7559998c815..502778d3f60 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 8441c852a12..e89d88a4a07 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 7c5e49fd71a..84f7d8fcd28 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 ab8831d1160..14cfabb1bc4 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 eed1ec30884..f61ef51631c 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 85d3707e698..b058a502490 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 b5a19a4c797..27fc531fca2 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 435b86e3d7c..38556c08cb1 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 d397c731587..f2a8db7f108 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 e0d0b58297d..3cc58655641 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 4d6c3a769fb..398dbe1f4d9 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 6c41176020a..f7fab80b026 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 14bcc542566..c673e741308 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 d24cb50716b..a755e62613c 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 5b8226fff40..0b68938bc6f 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 be9227f714c..9225e098902 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 3063daff4f2..fca319def1c 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 d7ffa7a0501..68c935b6766 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 110c7512934..b79bf484ab3 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 d9b1edcc377..a08c38dcaea 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 1cc469b4110..5d3ef307d42 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 65c5a1bfba6..eca58fa321b 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);
 }
-- 
GitLab