From 66ed5367d2359cb76663db80247b52ef2d7684ff Mon Sep 17 00:00:00 2001 From: Marco Bubke <marco.bubke@nokia.com> Date: Tue, 30 Nov 2010 17:46:57 +0100 Subject: [PATCH] QmlDesigner.NodeInstances: Add ChildrenChangedCommand Because the order of the commands can be changed the reparenting was changed. Now there is a command with the exact order of child items so it should be much more correct. --- .../components/formeditor/formeditorscene.cpp | 5 +- .../components/formeditor/formeditorview.cpp | 17 ++++- .../qmldesigner/designercore/designercore.pri | 6 +- .../designercore/include/commondefines.h | 3 +- .../designercore/include/nodeinstance.h | 2 + .../include/nodeinstanceclientinterface.h | 3 + .../designercore/include/nodeinstanceview.h | 6 +- .../instances/childrenchangedcommand.cpp | 42 +++++++++++ .../instances/childrenchangedcommand.h | 32 +++++++++ .../instances/graphicsobjectnodeinstance.cpp | 14 ++++ .../instances/graphicsobjectnodeinstance.h | 1 + .../designercore/instances/instances.pri | 2 + .../designercore/instances/nodeinstance.cpp | 6 +- .../instances/nodeinstanceclientproxy.cpp | 6 ++ .../instances/nodeinstanceclientproxy.h | 1 + .../instances/nodeinstanceserver.cpp | 44 +++++++++++- .../instances/nodeinstanceserver.h | 4 ++ .../instances/nodeinstanceserverinterface.cpp | 4 ++ .../instances/nodeinstanceserverproxy.cpp | 4 ++ .../instances/nodeinstanceview.cpp | 69 +++++++++---------- .../instances/objectnodeinstance.cpp | 4 ++ .../instances/objectnodeinstance.h | 1 + .../instances/qmlgraphicsitemnodeinstance.cpp | 8 +++ .../instances/servernodeinstance.cpp | 5 ++ .../instances/servernodeinstance.h | 2 + 25 files changed, 235 insertions(+), 56 deletions(-) create mode 100644 src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.cpp create mode 100644 src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.h diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index 65eac44dec7..083b30996bb 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -339,9 +339,8 @@ void FormEditorScene::reparentItem(const QmlItemNode &node, const QmlItemNode &n if (newParent.isValid() && hasItemForQmlItemNode(newParent)) parentItem = itemForQmlItemNode(newParent); - if (item->parentItem() != parentItem) { - item->setParentItem(parentItem); - } + item->setParentItem(0); + item->setParentItem(parentItem); } FormEditorItem* FormEditorScene::rootFormEditorItem() const diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 585999a4c1a..8d97c81505e 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -456,9 +456,8 @@ void FormEditorView::customNotification(const AbstractView *view, const QString foreach (const ModelNode &node, nodeList) { QmlItemNode qmlItemNode(node); if (qmlItemNode.isValid() && scene()->hasItemForQmlItemNode(qmlItemNode)) { - scene()->synchronizeParent(qmlItemNode); scene()->synchronizeTransformation(qmlItemNode); - itemNodeList.append(scene()->itemForQmlItemNode(qmlItemNode)); + itemNodeList.append(scene()->itemForQmlItemNode(qmlItemNode)); } } @@ -477,6 +476,20 @@ void FormEditorView::customNotification(const AbstractView *view, const QString } } + if (identifier == "__instance children changed__") { + QList<FormEditorItem*> itemNodeList; + + foreach (const ModelNode &node, nodeList) { + QmlItemNode qmlItemNode(node); + if (qmlItemNode.isValid() && scene()->hasItemForQmlItemNode(qmlItemNode)) { + scene()->synchronizeParent(qmlItemNode); + itemNodeList.append(scene()->itemForQmlItemNode(qmlItemNode)); + } + } + + m_currentTool->formEditorItemsChanged(itemNodeList); + } + QmlModelView::customNotification(view, identifier, nodeList, data); } diff --git a/src/plugins/qmldesigner/designercore/designercore.pri b/src/plugins/qmldesigner/designercore/designercore.pri index a3f18853d80..3456465f3d7 100644 --- a/src/plugins/qmldesigner/designercore/designercore.pri +++ b/src/plugins/qmldesigner/designercore/designercore.pri @@ -118,7 +118,8 @@ SOURCES += $$PWD/model/abstractview.cpp \ $$PWD/instances/changestatecommand.cpp \ $$PWD/instances/nodeinstanceserverproxy.cpp \ $$PWD/instances/nodeinstanceclientproxy.cpp \ - $$PWD/instances/addimportcommand.cpp + $$PWD/instances/addimportcommand.cpp \ + $$PWD/instances/childrenchangedcommand.cpp HEADERS += $$PWD/include/corelib_global.h \ $$PWD/include/abstractview.h \ $$PWD/include/nodeinstanceview.h \ @@ -235,7 +236,8 @@ HEADERS += $$PWD/include/corelib_global.h \ $$PWD/instances/changestatecommand.h \ $$PWD/instances/nodeinstanceserverproxy.h \ $$PWD/instances/nodeinstanceclientproxy.h \ - $$PWD/instances/addimportcommand.h + $$PWD/instances/addimportcommand.h \ + $$PWD/instances/childrenchangedcommand.h contains(CONFIG, plugin) { # If core.pri has been included in the qmldesigner plugin diff --git a/src/plugins/qmldesigner/designercore/include/commondefines.h b/src/plugins/qmldesigner/designercore/include/commondefines.h index 1cb6dd3d8d4..095e3f6a4eb 100644 --- a/src/plugins/qmldesigner/designercore/include/commondefines.h +++ b/src/plugins/qmldesigner/designercore/include/commondefines.h @@ -23,8 +23,7 @@ enum InformationName IsAnchoredByChildren, IsAnchoredBySibling, HasContent, - HasBindingForProperty, - Parent + HasBindingForProperty }; } diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index 4a52ca4ac20..c2bead4e2c6 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h @@ -56,6 +56,8 @@ protected: const QVariant &information, const QVariant &secondInformation, const QVariant &thirdInformation); + + void setParentId(qint32 instanceId); void setRenderImage(const QImage &image); NodeInstance(ProxyNodeInstanceData *d); qint32 instanceId() const; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h index 759ce952144..50060106c13 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h @@ -8,6 +8,7 @@ namespace QmlDesigner { class ValuesChangedCommand; class PixmapChangedCommand; class InformationChangedCommand; +class ChildrenChangedCommand; class NodeInstanceClientInterface { @@ -15,6 +16,8 @@ public: virtual void informationChanged(const InformationChangedCommand &command) = 0; virtual void valuesChanged(const ValuesChangedCommand &command) = 0; virtual void pixmapChanged(const PixmapChangedCommand &command) = 0; + virtual void childrenChanged(const ChildrenChangedCommand &command) = 0; + virtual void flush() {}; virtual qint64 bytesToWrite() const {return 0;} diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 6cca2238659..0d3b836ffbf 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -115,6 +115,7 @@ public: void valuesChanged(const ValuesChangedCommand &command); void pixmapChanged(const PixmapChangedCommand &command); void informationChanged(const InformationChangedCommand &command); + void childrenChanged(const ChildrenChangedCommand &command); private: // functions NodeInstance rootNodeInstance() const; @@ -166,11 +167,6 @@ private: //variables QHash<ModelNode, NodeInstance> m_nodeInstanceHash; QHash<qint32, NodeInstance> m_idInstanceHash; // This is purely internal. Might contain dangling pointers! - QList<QPair<ModelNode, QString> > m_valuePropertyChangeList; - - QSet<ModelNode> m_renderImageChangeSet; - QSet<ModelNode> m_informationChangeSet; - uint m_blockUpdates; QWeakPointer<NodeInstanceServerInterface> m_nodeInstanceServer; qint32 m_instanceIdCounter; diff --git a/src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.cpp b/src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.cpp new file mode 100644 index 00000000000..bd89b4496a0 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.cpp @@ -0,0 +1,42 @@ +#include "childrenchangedcommand.h" + +namespace QmlDesigner { + +ChildrenChangedCommand::ChildrenChangedCommand() + : m_parentInstanceId(-1) +{ +} + +ChildrenChangedCommand::ChildrenChangedCommand(qint32 parentInstanceId, const QVector<qint32> &children) + : m_parentInstanceId(parentInstanceId), + m_childrenVector(children) +{ +} + +QVector<qint32> ChildrenChangedCommand::childrenInstances() const +{ + return m_childrenVector; +} + +qint32 ChildrenChangedCommand::parentInstanceId() const +{ + return m_parentInstanceId; +} + +QDataStream &operator<<(QDataStream &out, const ChildrenChangedCommand &command) +{ + out << command.parentInstanceId(); + out << command.childrenInstances(); + + return out; +} + +QDataStream &operator>>(QDataStream &in, ChildrenChangedCommand &command) +{ + in >> command.m_parentInstanceId; + in >> command.m_childrenVector; + + return in; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.h b/src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.h new file mode 100644 index 00000000000..e38f3df34a4 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/childrenchangedcommand.h @@ -0,0 +1,32 @@ +#ifndef CHILDRENCHANGEDCOMMAND_H +#define CHILDRENCHANGEDCOMMAND_H + +#include <QMetaType> +#include <QVector> + + +namespace QmlDesigner { + +class ChildrenChangedCommand +{ + friend QDataStream &operator>>(QDataStream &in, ChildrenChangedCommand &command); +public: + ChildrenChangedCommand(); + ChildrenChangedCommand(qint32 parentInstanceId, const QVector<qint32> &childrenInstances); + + QVector<qint32> childrenInstances() const; + qint32 parentInstanceId() const; + +private: + qint32 m_parentInstanceId; + QVector<qint32> m_childrenVector; +}; + +QDataStream &operator<<(QDataStream &out, const ChildrenChangedCommand &command); +QDataStream &operator>>(QDataStream &in, ChildrenChangedCommand &command); + +} // namespace QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::ChildrenChangedCommand); + +#endif // CHILDRENCHANGEDCOMMAND_H diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp index 1854bc2c012..c2b24032d66 100644 --- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp @@ -60,6 +60,20 @@ bool GraphicsObjectNodeInstance::hasContent() const return m_hasContent; } +QList<ServerNodeInstance> GraphicsObjectNodeInstance::childItems() const +{ + QList<ServerNodeInstance> instanceList; + foreach(QGraphicsItem *item, graphicsObject()->childItems()) + { + QGraphicsObject *childObject = item->toGraphicsObject(); + if (childObject && nodeInstanceServer()->hasInstanceForObject(childObject)) { + instanceList.append(nodeInstanceServer()->instanceForObject(childObject)); + } + } + + return instanceList; +} + void GraphicsObjectNodeInstance::setHasContent(bool hasContent) { m_hasContent = hasContent; diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h index 9db1c0b79e3..a9263a81e39 100644 --- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h @@ -71,6 +71,7 @@ public: bool hasContent() const; + QList<ServerNodeInstance> childItems() const; void paintUpdate(); diff --git a/src/plugins/qmldesigner/designercore/instances/instances.pri b/src/plugins/qmldesigner/designercore/instances/instances.pri index e1c10d67612..63a754c23fc 100644 --- a/src/plugins/qmldesigner/designercore/instances/instances.pri +++ b/src/plugins/qmldesigner/designercore/instances/instances.pri @@ -3,6 +3,7 @@ INCLUDEPATH += $$PWD/../include HEADERS += $$PWD/behaviornodeinstance.h +HEADERS += $$PWD/childrenchangedcommand.h HEADERS += $$PWD/addimportcommand.h HEADERS += $$PWD/changebindingscommand.h HEADERS += $$PWD/changefileurlcommand.h @@ -42,6 +43,7 @@ HEADERS += $$PWD/../include/nodeinstanceserverinterface.h SOURCES += $$PWD/behaviornodeinstance.cpp +SOURCES += $$PWD/childrenchangedcommand.cpp SOURCES += $$PWD/addimportcommand.cpp SOURCES += $$PWD/changebindingscommand.cpp SOURCES += $$PWD/changefileurlcommand.cpp diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 5934d43ff85..d9cd5636e15 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -283,6 +283,11 @@ void NodeInstance::setRenderImage(const QImage &image) d->renderImage = image; } +void NodeInstance::setParentId(qint32 instanceId) +{ + d->parentInstanceId = instanceId; +} + void NodeInstance::setInformation(InformationName name, const QVariant &information, const QVariant &secondInformation, const QVariant &thirdInformation) { switch (name) { @@ -302,7 +307,6 @@ void NodeInstance::setInformation(InformationName name, const QVariant &informat case Anchor: d->anchors.insert(information.toString(), qMakePair(secondInformation.toString(), thirdInformation.value<qint32>())); break; case InstanceTypeForProperty: d->instanceTypes.insert(information.toString(), secondInformation.toString()); break; case HasBindingForProperty: d->hasBindingForProperty.insert(information.toString(), secondInformation.toBool()); break; - case Parent: d->parentInstanceId = information.toInt(); case NoName: default: break; } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp index 60aefc5cd66..43feb9d67a5 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp @@ -27,6 +27,7 @@ #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" #include "valueschangedcommand.h" +#include "childrenchangedcommand.h" namespace QmlDesigner { @@ -70,6 +71,11 @@ void NodeInstanceClientProxy::pixmapChanged(const PixmapChangedCommand &command) writeCommand(QVariant::fromValue(command)); } +void NodeInstanceClientProxy::childrenChanged(const ChildrenChangedCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} + void NodeInstanceClientProxy::flush() { } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h index dfc05d60e2b..d6d218aaddd 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h @@ -23,6 +23,7 @@ public: void informationChanged(const InformationChangedCommand &command); void valuesChanged(const ValuesChangedCommand &command); void pixmapChanged(const PixmapChangedCommand &command); + void childrenChanged(const ChildrenChangedCommand &command); void flush(); qint64 bytesToWrite() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp index b52531f5a20..0aa77507621 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp @@ -35,6 +35,7 @@ #include "childrenchangeeventfilter.h" #include "changestatecommand.h" #include "addimportcommand.h" +#include "childrenchangedcommand.h" #include <iostream> #include <stdio.h> @@ -244,7 +245,9 @@ void NodeInstanceServer::addImport(const AddImportCommand &command) engine()->addPluginPath(importPath); } - importComponent.setData(componentString.toLatin1(), QUrl()); + qDebug() << __FUNCTION__ << fileUrl().resolved(QUrl("content/samegame.js")) << componentString; + + importComponent.setData(componentString.toUtf8(), QUrl()); if (!importComponent.errorString().isEmpty()) qDebug() << "QmlDesigner.NodeInstances: import wrong: " << importComponent.errorString(); @@ -509,6 +512,36 @@ NodeInstanceClientInterface *NodeInstanceServer::nodeInstanceClient() const return m_nodeInstanceClient; } +void NodeInstanceServer::sendChildrenChangedCommand(const QList<ServerNodeInstance> childList) +{ + QSet<ServerNodeInstance> parentSet; + QList<ServerNodeInstance> noParentList; + + foreach (const ServerNodeInstance &child, childList) { + if (!child.hasParent()) + noParentList.append(child); + parentSet.insert(child.parent()); + } + + + foreach (const ServerNodeInstance &parent, parentSet) + nodeInstanceClient()->childrenChanged(createChildrenChangedCommand(parent, parent.childItems())); + + if (!noParentList.isEmpty()) + nodeInstanceClient()->childrenChanged(createChildrenChangedCommand(ServerNodeInstance(), noParentList)); + +} + +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 { QVector<InformationContainer> informationVector; @@ -525,7 +558,6 @@ InformationChangedCommand NodeInstanceServer::createAllInformationChangedCommand informationVector.append(InformationContainer(instance.instanceId(), IsResizable, instance.isResizable())); informationVector.append(InformationContainer(instance.instanceId(), IsInPositioner, instance.isInPositioner())); informationVector.append(InformationContainer(instance.instanceId(), PenWidth, instance.penWidth())); - informationVector.append(InformationContainer(instance.instanceId(), Parent, instance.parent().instanceId())); informationVector.append(InformationContainer(instance.instanceId(), IsAnchoredByChildren, instance.isAnchoredByChildren())); informationVector.append(InformationContainer(instance.instanceId(), IsAnchoredBySibling, instance.isAnchoredBySibling())); @@ -666,7 +698,7 @@ bool NodeInstanceServer::nonInstanceChildIsDirty(QGraphicsObject *graphicsObject continue; QGraphicsItemPrivate *childPrivate = QGraphicsItemPrivate::get(child); - if (childPrivate->dirty || childPrivate->dirtyChildren || nonInstanceChildIsDirty(childGraphicsObject)) + if (childPrivate->dirty || nonInstanceChildIsDirty(childGraphicsObject)) return true; } } @@ -693,6 +725,7 @@ void NodeInstanceServer::findItemChangesAndSendChangeCommands() QSet<ServerNodeInstance> dirtyInstanceSet; QSet<ServerNodeInstance> informationChangedInstanceSet; QVector<InstancePropertyPair> propertyChangedList; + QSet<ServerNodeInstance> parentChangedSet; bool adjustSceneRect = false; if (m_declarativeView) { @@ -731,6 +764,7 @@ void NodeInstanceServer::findItemChangesAndSendChangeCommands() if (propertyName == "parent") { informationChangedInstanceSet.insert(instance); + parentChangedSet.insert(instance); } else { propertyChangedList.append(property); } @@ -739,9 +773,13 @@ void NodeInstanceServer::findItemChangesAndSendChangeCommands() m_changedPropertyList.clear(); resetAllItems(); + if (!parentChangedSet.isEmpty()) + sendChildrenChangedCommand(parentChangedSet.toList()); + if (!informationChangedInstanceSet.isEmpty()) nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList())); + if (!propertyChangedList.isEmpty()) nodeInstanceClient()->valuesChanged(createValuesChangedCommand(propertyChangedList)); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h index 1da0b4da5d4..bebae778ed7 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h @@ -21,6 +21,7 @@ class NodeInstanceClientInterface; class ValuesChangedCommand; class PixmapChangedCommand; class InformationChangedCommand; +class ChildrenChangedCommand; namespace Internal { class ChildrenChangeEventFilter; @@ -102,6 +103,9 @@ protected: ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const; PixmapChangedCommand createPixmapChangedCommand(const ServerNodeInstance &instance) const; InformationChangedCommand createAllInformationChangedCommand(const QList<ServerNodeInstance> &instanceList, bool initial = false) const; + ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList<ServerNodeInstance> &instanceList) const; + + void sendChildrenChangedCommand(const QList<ServerNodeInstance> childList); void addChangedProperty(const InstancePropertyPair &property); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp index 1e9a3f3d5a5..f14f65d4e78 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp @@ -21,6 +21,7 @@ #include "pixmapchangedcommand.h" #include "valueschangedcommand.h" #include "addimportcommand.h" +#include "childrenchangedcommand.h" namespace QmlDesigner { @@ -104,6 +105,9 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType<AddImportCommand>("AddImportCommand"); qRegisterMetaTypeStreamOperators<AddImportCommand>("AddImportCommand"); + + qRegisterMetaType<ChildrenChangedCommand>("ChildrenChangedCommand"); + qRegisterMetaTypeStreamOperators<ChildrenChangedCommand>("ChildrenChangedCommand"); } } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 2d3ed83e094..5dee686b82a 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -26,6 +26,7 @@ #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" #include "valueschangedcommand.h" +#include "childrenchangedcommand.h" #include "nodeinstanceview.h" #include "nodeinstanceclientproxy.h" @@ -73,6 +74,7 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command) static const int informationChangedCommandType = QMetaType::type("InformationChangedCommand"); static const int valuesChangedCommandType = QMetaType::type("ValuesChangedCommand"); static const int pixmapChangedCommandType = QMetaType::type("PixmapChangedCommand"); + static const int childrenChangedCommandType = QMetaType::type("ChildrenChangedCommand"); if (command.userType() == informationChangedCommandType) nodeInstanceClient()->informationChanged(command.value<InformationChangedCommand>()); @@ -80,6 +82,8 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command) nodeInstanceClient()->valuesChanged(command.value<ValuesChangedCommand>()); else if (command.userType() == pixmapChangedCommandType) nodeInstanceClient()->pixmapChanged(command.value<PixmapChangedCommand>()); + else if (command.userType() == childrenChangedCommandType) + nodeInstanceClient()->childrenChanged(command.value<ChildrenChangedCommand>()); else Q_ASSERT(false); } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index d89805b487e..6eac94d2cc4 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -71,6 +71,7 @@ #include "informationchangedcommand.h" #include "changestatecommand.h" #include "addimportcommand.h" +#include "childrenchangedcommand.h" #include "nodeinstanceserverproxy.h" @@ -105,8 +106,7 @@ d too. \see ~NodeInstanceView setRenderOffScreen */ NodeInstanceView::NodeInstanceView(QObject *parent) - : AbstractView(parent), - m_blockUpdates(false) + : AbstractView(parent) { } @@ -162,9 +162,6 @@ void NodeInstanceView::restartProcess() Model *oldModel = model(); if (oldModel) { oldModel->detachView(this); - m_valuePropertyChangeList.clear(); - m_renderImageChangeSet.clear(); - m_informationChangeSet.clear(); oldModel->attachView(this); } setBlockUpdates(false); @@ -610,24 +607,6 @@ void NodeInstanceView::setBlockUpdates(bool block) } else if (m_blockUpdates > 0) { m_blockUpdates--; } - - if (m_blockUpdates == 0) { - m_nodeInstanceServer->setBlockUpdates(false); - if (!m_informationChangeSet.isEmpty()) { - emitCustomNotification("__instance information changed__", m_informationChangeSet.toList()); - m_informationChangeSet.clear(); - } - - if (!m_valuePropertyChangeList.isEmpty()) { - emitInstancePropertyChange(m_valuePropertyChangeList); - m_valuePropertyChangeList.clear(); - } - - if (!m_renderImageChangeSet.isEmpty()) { - emitCustomNotification("__instance render pixmap changed__", m_renderImageChangeSet.toList()); - m_renderImageChangeSet.clear(); - } - } } void NodeInstanceView::setStateInstance(const NodeInstance &stateInstance) @@ -865,57 +844,71 @@ AddImportCommand NodeInstanceView::createImportCommand(const Import &import) void NodeInstanceView::valuesChanged(const ValuesChangedCommand &command) { + QList<QPair<ModelNode, QString> > valuePropertyChangeList; + foreach(const PropertyValueContainer &container, command.valueChanges()) { if (hasInstanceForId(container.instanceId())) { NodeInstance instance = instanceForId(container.instanceId()); if (instance.isValid()) { instance.setProperty(container.name(), container.value()); - m_valuePropertyChangeList.append(qMakePair(instance.modelNode(), container.name())); + valuePropertyChangeList.append(qMakePair(instance.modelNode(), container.name())); } } } - if (!m_blockUpdates && !m_valuePropertyChangeList.isEmpty()) { - emitInstancePropertyChange(m_valuePropertyChangeList); - m_valuePropertyChangeList.clear(); - } + if (!valuePropertyChangeList.isEmpty()) + emitInstancePropertyChange(valuePropertyChangeList); } void NodeInstanceView::pixmapChanged(const PixmapChangedCommand &command) { + QSet<ModelNode> renderImageChangeSet; if (hasInstanceForId(command.instanceId())) { NodeInstance instance = instanceForId(command.instanceId()); if (instance.isValid()) { instance.setRenderImage(command.renderImage()); - m_renderImageChangeSet.insert(instance.modelNode()); + renderImageChangeSet.insert(instance.modelNode()); } } - if (!m_blockUpdates && !m_renderImageChangeSet.isEmpty()) { - emitCustomNotification("__instance render pixmap changed__", m_renderImageChangeSet.toList()); - m_renderImageChangeSet.clear(); - } + if (!renderImageChangeSet.isEmpty()) + emitCustomNotification("__instance render pixmap changed__", renderImageChangeSet.toList()); } void NodeInstanceView::informationChanged(const InformationChangedCommand &command) { + QList<ModelNode> informationChangedList; + foreach(const InformationContainer &container, command.informations()) { if (hasInstanceForId(container.instanceId())) { NodeInstance instance = instanceForId(container.instanceId()); if (instance.isValid()) { instance.setInformation(container.name(), container.information(), container.secondInformation(), container.thirdInformation()); - m_informationChangeSet.insert(instance.modelNode()); + informationChangedList.append(instance.modelNode()); } } } - if (!m_blockUpdates && !m_informationChangeSet.isEmpty()) { - emitCustomNotification("__instance information changed__", m_informationChangeSet.toList()); - m_informationChangeSet.clear(); - } + if (!informationChangedList.isEmpty()) + emitCustomNotification("__instance information changed__", informationChangedList); } +void NodeInstanceView::childrenChanged(const ChildrenChangedCommand &command) +{ + QList<ModelNode> childNodeList; + + foreach(qint32 instanceId, command.childrenInstances()) { + if (hasInstanceForId(instanceId)) { + NodeInstance instance = instanceForId(instanceId); + instance.setParentId(command.parentInstanceId()); + childNodeList.append(instance.modelNode()); + } + } + + if (!childNodeList.isEmpty()) + emitCustomNotification("__instance children changed__", childNodeList); +} qint32 NodeInstanceView::generateInstanceId() { diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp index 6df90fb9221..0d7c6d09369 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp @@ -604,6 +604,10 @@ QString ObjectNodeInstance::instanceType(const QString &name) const return property.propertyTypeName(); } +QList<ServerNodeInstance> ObjectNodeInstance::childItems() const +{ + return QList<ServerNodeInstance>(); +} void ObjectNodeInstance::setDeleteHeldInstance(bool deleteInstance) { diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h index 12e70ce42e5..9307744ff3d 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h @@ -132,6 +132,7 @@ public: virtual QString instanceType(const QString &name) const; QStringList propertyNames() const; + virtual QList<ServerNodeInstance> childItems() const; void createDynamicProperty(const QString &name, const QString &typeName); void setDeleteHeldInstance(bool deleteInstance); diff --git a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp index afb837373a9..61474fdf891 100644 --- a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp @@ -389,6 +389,14 @@ void QmlGraphicsItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &ol setMovable(false); } + if (oldParentInstance && oldParentInstance->isPositioner() && !(newParentInstance && newParentInstance->isPositioner())) { + if (!hasBindingForProperty("x")) + setPropertyVariant("x", m_x); + + if (!hasBindingForProperty("y")) + setPropertyVariant("y", m_y); + } + refresh(); } diff --git a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp index ae032f8ca45..b8f14ceb3c3 100644 --- a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp @@ -564,6 +564,11 @@ void ServerNodeInstance::doComponentComplete() m_nodeInstance->doComponentComplete(); } +QList<ServerNodeInstance> ServerNodeInstance::childItems() const +{ + return m_nodeInstance->childItems(); +} + QString ServerNodeInstance::id() const { return m_nodeInstance->id(); diff --git a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h index 51973e3a9be..ab82af8ef4f 100644 --- a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h @@ -133,6 +133,8 @@ public: void doComponentComplete(); + QList<ServerNodeInstance> childItems() const; + QString id() const; qint32 instanceId() const; -- GitLab