From 1312a04221e98db436c55bc2df09c8b8435c5d03 Mon Sep 17 00:00:00 2001 From: Marco Bubke <marco.bubke@nokia.com> Date: Thu, 9 Dec 2010 16:09:37 +0100 Subject: [PATCH] QmlDesigner: Add component complete feature This notifies the views if the instance has be really instanced. --- .../components/formeditor/formeditorview.cpp | 5 ++ .../components/formeditor/formeditorview.h | 2 + .../components/integration/componentview.cpp | 2 +- .../components/integration/componentview.h | 3 +- .../designdocumentcontrollerview.cpp | 5 ++ .../designdocumentcontrollerview.h | 2 +- .../components/navigator/navigatorview.cpp | 4 ++ .../components/navigator/navigatorview.h | 1 + .../qmldesigner/designercore/designercore.pri | 8 ++- .../designercore/include/abstractview.h | 3 ++ .../include/nodeinstanceclientinterface.h | 2 + .../include/nodeinstanceserverinterface.h | 2 + .../designercore/include/nodeinstanceview.h | 5 ++ .../designercore/include/qmlmodelview.h | 1 + .../designercore/include/rewriterview.h | 1 + .../instances/completecomponentcommand.cpp | 33 ++++++++++++ .../instances/completecomponentcommand.h | 30 +++++++++++ .../instances/componentcompletedcommand.cpp | 34 ++++++++++++ .../instances/componentcompletedcommand.h | 29 ++++++++++ .../designercore/instances/instances.pri | 4 ++ .../instances/nodeinstanceclientproxy.cpp | 10 ++++ .../instances/nodeinstanceclientproxy.h | 2 + .../instances/nodeinstanceserver.cpp | 19 ++++++- .../instances/nodeinstanceserver.h | 2 + .../instances/nodeinstanceserverinterface.cpp | 8 +++ .../instances/nodeinstanceserverproxy.cpp | 10 ++++ .../instances/nodeinstanceserverproxy.h | 1 + .../instances/nodeinstanceview.cpp | 54 ++++++++++++++++--- .../designercore/model/abstractview.cpp | 6 +++ .../qmldesigner/designercore/model/model.cpp | 47 ++++++++++++++++ .../qmldesigner/designercore/model/model_p.h | 4 +- .../designercore/model/qmlmodelview.cpp | 5 +- .../designercore/model/rewriterview.cpp | 4 ++ .../designercore/model/viewlogger.cpp | 8 +++ .../designercore/model/viewlogger.h | 2 +- 35 files changed, 341 insertions(+), 17 deletions(-) create mode 100644 src/plugins/qmldesigner/designercore/instances/completecomponentcommand.cpp create mode 100644 src/plugins/qmldesigner/designercore/instances/completecomponentcommand.h create mode 100644 src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.cpp create mode 100644 src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.h diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 8d97c81505e..5884215bce7 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -435,6 +435,11 @@ void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const QString & } } +void FormEditorView::instancesCompleted(const QVector<ModelNode> &completedNodeList) +{ +} + + void FormEditorView::customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) { if (identifier == "__start rewriter transaction__") { diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index 2fbf9fec3b9..f98c3b0e1ce 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -101,6 +101,8 @@ public: void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data); + void instancesCompleted(const QVector<ModelNode> &completedNodeList); + double margins() const; double spacing() const; void deActivateItemCreator(); diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index 8741d72142c..d24d6fb3643 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -161,6 +161,7 @@ void ComponentView::bindingPropertiesChanged(const QList<BindingProperty>& /*pro void ComponentView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) {} void ComponentView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) {} void ComponentView::instancePropertyChange(const QList<QPair<ModelNode, QString> > &/*propertyList*/) {}; +void ComponentView::instancesCompleted(const QVector<ModelNode> &/*completedNodeList*/) {} void ComponentView::selectedNodesChanged(const QList<ModelNode> &/*selectedNodeList*/, @@ -170,7 +171,6 @@ void ComponentView::fileUrlChanged(const QUrl &/*oldUrl*/, const QUrl &/*newUrl* void ComponentView::nodeOrderChanged(const NodeListProperty &/*listProperty*/, const ModelNode & /*movedNode*/, int /*oldIndex*/) {} -void ComponentView::importsChanged() {} void ComponentView::auxiliaryDataChanged(const ModelNode &/*node*/, const QString &/*name*/, const QVariant &/*data*/) {} diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h index 40a0ffc0c01..b2aeb59f1b0 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.h +++ b/src/plugins/qmldesigner/components/integration/componentview.h @@ -69,6 +69,7 @@ public: void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); + void instancesCompleted(const QVector<ModelNode> &completedNodeList); void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList); @@ -77,8 +78,6 @@ public: void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex); - void importsChanged(); - void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp index fea1e712d49..a1e967a0219 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp @@ -65,6 +65,11 @@ void DesignDocumentControllerView::instancePropertyChange(const QList<QPair<Mode { } +void DesignDocumentControllerView::instancesCompleted(const QVector<ModelNode> &/*completedNodeList*/) +{ + +} + static QStringList arrayToStringList(const QByteArray &byteArray) { QString str(QString::fromLatin1(byteArray)); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h index 9d61a58159a..8ad389119f5 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h @@ -60,7 +60,7 @@ public: virtual void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex); virtual void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); - + void instancesCompleted(const QVector<ModelNode> &completedNodeList); ModelNode insertModel(const ModelNode &modelNode) { return m_modelMerger.insertModel(modelNode); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 7b57375e74d..9e1ae2d6db4 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -198,6 +198,10 @@ void NavigatorView::instancePropertyChange(const QList<QPair<ModelNode, QString> { } +void NavigatorView::instancesCompleted(const QVector<ModelNode> &/*completedNodeList*/) +{ +} + void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &node, int oldIndex) { if (m_treeModel->isInTree(node)) diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h index ea1ca45fb5b..30994c52e2c 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h @@ -82,6 +82,7 @@ public: void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); + void instancesCompleted(const QVector<ModelNode> &completedNodeList); private slots: // void handleChangedItem(QStandardItem * item); diff --git a/src/plugins/qmldesigner/designercore/designercore.pri b/src/plugins/qmldesigner/designercore/designercore.pri index 10570f523b1..4124021fe20 100644 --- a/src/plugins/qmldesigner/designercore/designercore.pri +++ b/src/plugins/qmldesigner/designercore/designercore.pri @@ -119,7 +119,9 @@ SOURCES += $$PWD/model/abstractview.cpp \ $$PWD/instances/addimportcommand.cpp \ $$PWD/instances/childrenchangedcommand.cpp \ $$PWD/instances/statepreviewimagechangedcommand.cpp \ - $$PWD/instances/imagecontainer.cpp + $$PWD/instances/imagecontainer.cpp \ + $$PWD/instances/completecomponentcommand.cpp \ + $$PWD/instances/componentcompletedcommand.cpp HEADERS += $$PWD/include/corelib_global.h \ $$PWD/include/abstractview.h \ $$PWD/include/nodeinstanceview.h \ @@ -237,7 +239,9 @@ HEADERS += $$PWD/include/corelib_global.h \ $$PWD/instances/addimportcommand.h \ $$PWD/instances/childrenchangedcommand.h \ $$PWD/instances/statepreviewimagechangedcommand.h \ - $$PWD/instances/imagecontainer.h + $$PWD/instances/imagecontainer.h \ + $$PWD/instances/completecomponentcommand.h \ + $$PWD/instances/componentcompletedcommand.h contains(CONFIG, plugin) { # If core.pri has been included in the qmldesigner plugin SOURCES += $$PWD/model/basetexteditmodifier.cpp diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 2e27e015ce8..70b8383b4d5 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -107,6 +107,7 @@ public: void emitCustomNotification(const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data); void emitInstancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); + void emitInstancesCompleted(const QVector<ModelNode> &nodeList); virtual void modelAttached(Model *model); virtual void modelAboutToBeDetached(Model *model); @@ -124,6 +125,8 @@ public: virtual void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) = 0; virtual void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList) = 0; + virtual void instancesCompleted(const QVector<ModelNode> &completedNodeList) = 0; + virtual void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList) = 0; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h index 4b263fb9cbe..671282231fa 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceclientinterface.h @@ -10,6 +10,7 @@ class PixmapChangedCommand; class InformationChangedCommand; class ChildrenChangedCommand; class StatePreviewImageChangedCommand; +class ComponentCompletedCommand; class NodeInstanceClientInterface { @@ -19,6 +20,7 @@ public: virtual void pixmapChanged(const PixmapChangedCommand &command) = 0; virtual void childrenChanged(const ChildrenChangedCommand &command) = 0; virtual void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command) = 0; + virtual void componentCompleted(const ComponentCompletedCommand &command) = 0; virtual void flush() {}; virtual qint64 bytesToWrite() const {return 0;} diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h index f64321ecef1..dc6d57d4008 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h @@ -21,6 +21,7 @@ class RemoveInstancesCommand; class RemovePropertiesCommand; class ChangeStateCommand; class AddImportCommand; +class CompleteComponentCommand; class NodeInstanceServerInterface : public QObject { @@ -40,6 +41,7 @@ public: virtual void changeIds(const ChangeIdsCommand &command) = 0; virtual void changeState(const ChangeStateCommand &command) = 0; virtual void addImport(const AddImportCommand &command) = 0; + virtual void completeComponent(const CompleteComponentCommand &command) = 0; virtual void setBlockUpdates(bool /*block*/) {} diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 0f37eb41520..619958f2c8a 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -63,6 +63,7 @@ class ChangeIdsCommand; class RemoveInstancesCommand; class RemovePropertiesCommand; class AddImportCommand; +class CompleteComponentCommand; class CORESHARED_EXPORT NodeInstanceView : public AbstractView, public NodeInstanceClientInterface { @@ -94,6 +95,7 @@ public: void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList); void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); + void instancesCompleted(const QVector<ModelNode> &completedNodeList); void importAdded(const Import &import); void importRemoved(const Import &import); @@ -118,6 +120,7 @@ public: void informationChanged(const InformationChangedCommand &command); void childrenChanged(const ChildrenChangedCommand &command); void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command); + void componentCompleted(const ComponentCompletedCommand &command); private: // functions NodeInstance rootNodeInstance() const; @@ -143,6 +146,8 @@ private: // functions CreateSceneCommand createCreateSceneCommand() const; ClearSceneCommand createClearSceneCommand() const; CreateInstancesCommand createCreateInstancesCommand(const QList<NodeInstance> &instanceList) const; + CompleteComponentCommand createComponentCompleteCommand(const QList<NodeInstance> &instanceList) const; + ComponentCompletedCommand createComponentCompletedCommand(const QList<NodeInstance> &instanceList) const; ReparentInstancesCommand createReparentInstancesCommand(const QList<NodeInstance> &instanceList) const; ReparentInstancesCommand createReparentInstancesCommand(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent) const; ChangeFileUrlCommand createChangeFileUrlCommand(const QUrl &fileUrl) const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h index f5e95103207..930a68966d2 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h @@ -91,6 +91,7 @@ public: virtual void nodeInstancePropertyChanged(const ModelNode &node, const QString &propertyName); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); + void instancesCompleted(const QVector<ModelNode> &completedNodeList); void nodeCreated(const ModelNode &createdNode); void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange); diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index f5e77193c58..ee1a3205e7a 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -135,6 +135,7 @@ public: void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); + void instancesCompleted(const QVector<ModelNode> &completedNodeList); void importAdded(const Import &import); void importRemoved(const Import &import); diff --git a/src/plugins/qmldesigner/designercore/instances/completecomponentcommand.cpp b/src/plugins/qmldesigner/designercore/instances/completecomponentcommand.cpp new file mode 100644 index 00000000000..91fbef062ef --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/completecomponentcommand.cpp @@ -0,0 +1,33 @@ +#include "completecomponentcommand.h" + +namespace QmlDesigner { + +CompleteComponentCommand::CompleteComponentCommand() +{ +} + +CompleteComponentCommand::CompleteComponentCommand(const QVector<qint32> &container) + : m_instanceVector(container) +{ +} + +QVector<qint32> CompleteComponentCommand::instances() const +{ + return m_instanceVector; +} + +QDataStream &operator<<(QDataStream &out, const CompleteComponentCommand &command) +{ + out << command.instances(); + + return out; +} + +QDataStream &operator>>(QDataStream &in, CompleteComponentCommand &command) +{ + in >> command.m_instanceVector; + + return in; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/completecomponentcommand.h b/src/plugins/qmldesigner/designercore/instances/completecomponentcommand.h new file mode 100644 index 00000000000..2bc5e0f8393 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/completecomponentcommand.h @@ -0,0 +1,30 @@ +#ifndef COMPLETECOMPONENT_H +#define COMPLETECOMPONENT_H + +#include <QMetaType> +#include <QVector> + +namespace QmlDesigner { + +class CompleteComponentCommand +{ + friend QDataStream &operator>>(QDataStream &in, CompleteComponentCommand &command); + +public: + CompleteComponentCommand(); + CompleteComponentCommand(const QVector<qint32> &container); + + QVector<qint32> instances() const; + +private: + QVector<qint32> m_instanceVector; +}; + +QDataStream &operator<<(QDataStream &out, const CompleteComponentCommand &command); +QDataStream &operator>>(QDataStream &in, CompleteComponentCommand &command); + +} // namespace QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::CompleteComponentCommand); + +#endif // COMPLETECOMPONENT_H diff --git a/src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.cpp b/src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.cpp new file mode 100644 index 00000000000..e209574e036 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.cpp @@ -0,0 +1,34 @@ +#include "componentcompletedcommand.h" + +namespace QmlDesigner { + +ComponentCompletedCommand::ComponentCompletedCommand() +{ +} + +ComponentCompletedCommand::ComponentCompletedCommand(const QVector<qint32> &container) + : m_instanceVector(container) +{ +} + +QVector<qint32> ComponentCompletedCommand::instances() const +{ + return m_instanceVector; +} + +QDataStream &operator<<(QDataStream &out, const ComponentCompletedCommand &command) +{ + out << command.instances(); + + return out; +} + +QDataStream &operator>>(QDataStream &in, ComponentCompletedCommand &command) +{ + in >> command.m_instanceVector; + + return in; +} + +} // namespace QmlDesigner + diff --git a/src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.h b/src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.h new file mode 100644 index 00000000000..c39177777cf --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/componentcompletedcommand.h @@ -0,0 +1,29 @@ +#ifndef COMPONENTCOMPLETEDCOMMAND_H +#define COMPONENTCOMPLETEDCOMMAND_H +#include <QMetaType> +#include <QVector> + +namespace QmlDesigner { + +class ComponentCompletedCommand +{ + friend QDataStream &operator>>(QDataStream &in, ComponentCompletedCommand &command); + +public: + ComponentCompletedCommand(); + ComponentCompletedCommand(const QVector<qint32> &container); + + QVector<qint32> instances() const; + +private: + QVector<qint32> m_instanceVector; +}; + +QDataStream &operator<<(QDataStream &out, const ComponentCompletedCommand &command); +QDataStream &operator>>(QDataStream &in, ComponentCompletedCommand &command); + +} // namespace QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::ComponentCompletedCommand); + +#endif // COMPONENTCOMPLETEDCOMMAND_H diff --git a/src/plugins/qmldesigner/designercore/instances/instances.pri b/src/plugins/qmldesigner/designercore/instances/instances.pri index 5d51301e125..060f8ed1445 100644 --- a/src/plugins/qmldesigner/designercore/instances/instances.pri +++ b/src/plugins/qmldesigner/designercore/instances/instances.pri @@ -3,6 +3,8 @@ INCLUDEPATH += $$PWD/../include HEADERS += $$PWD/behaviornodeinstance.h +HEADERS += $$PWD/componentcompletedcommand.h +HEADERS += $$PWD//completecomponentcommand.h HEADERS += $$PWDstatepreviewimagechangedcommand.h HEADERS += $$PWD//imagecontainer.h HEADERS += $$PWD/childrenchangedcommand.h @@ -45,6 +47,8 @@ HEADERS += $$PWD/../include/nodeinstanceserverinterface.h SOURCES += $$PWD/behaviornodeinstance.cpp +SOURCES += $$PWD/componentcompletedcommand.cpp +SOURCES += $$PWD/completecomponentcommand.cpp SOURCES += $$PWD/statepreviewimagechangedcommand.cpp SOURCES += $$PWD/imagecontainer.cpp SOURCES += $$PWD/childrenchangedcommand.cpp diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp index 41eee3ced96..0520c98b241 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp @@ -23,6 +23,7 @@ #include "changeidscommand.h" #include "changestatecommand.h" #include "addimportcommand.h" +#include "completecomponentcommand.h" #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" @@ -30,6 +31,7 @@ #include "childrenchangedcommand.h" #include "imagecontainer.h" #include "statepreviewimagechangedcommand.h" +#include "componentcompletedcommand.h" namespace QmlDesigner { @@ -83,6 +85,11 @@ void NodeInstanceClientProxy::statePreviewImagesChanged(const StatePreviewImageC writeCommand(QVariant::fromValue(command)); } +void NodeInstanceClientProxy::componentCompleted(const ComponentCompletedCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} + void NodeInstanceClientProxy::flush() { } @@ -142,6 +149,7 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) static const int changeIdsCommandType = QMetaType::type("ChangeIdsCommand"); static const int changeStateCommandType = QMetaType::type("ChangeStateCommand"); static const int addImportCommandType = QMetaType::type("AddImportCommand"); + static const int completeComponentCommandType = QMetaType::type("CompleteComponentCommand"); if (command.userType() == createInstancesCommandType) nodeInstanceServer()->createInstances(command.value<CreateInstancesCommand>()); @@ -167,6 +175,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) nodeInstanceServer()->changeState(command.value<ChangeStateCommand>()); else if (command.userType() == addImportCommandType) nodeInstanceServer()->addImport(command.value<AddImportCommand>()); + else if (command.userType() == completeComponentCommandType) + nodeInstanceServer()->completeComponent(command.value<CompleteComponentCommand>()); else Q_ASSERT(false); } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h index 5206fc5ad9a..3fc1e0a4663 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h @@ -25,6 +25,8 @@ public: void pixmapChanged(const PixmapChangedCommand &command); void childrenChanged(const ChildrenChangedCommand &command); void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command); + void componentCompleted(const ComponentCompletedCommand &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 32dcc85b58f..fdba9ec2f02 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp @@ -36,6 +36,8 @@ #include "changestatecommand.h" #include "addimportcommand.h" #include "childrenchangedcommand.h" +#include "completecomponentcommand.h" +#include "componentcompletedcommand.h" #include <iostream> #include <stdio.h> @@ -76,8 +78,6 @@ void NodeInstanceServer::createInstances(const CreateInstancesCommand &command) } } - - instance.doComponentComplete(); } nodeInstanceClient()->valuesChanged(createValuesChangedCommand(instanceList)); @@ -221,6 +221,17 @@ void NodeInstanceServer::changeState(const ChangeStateCommand &command) startRenderTimer(); } +void NodeInstanceServer::completeComponent(const CompleteComponentCommand &command) +{ + foreach(qint32 instanceId, command.instances()) { + if (hasInstanceForId(instanceId)) { + ServerNodeInstance instance = instanceForId(instanceId); + instance.doComponentComplete(); + m_componentCompletedVector.append(instanceId); + } + } +} + void NodeInstanceServer::addImport(const AddImportCommand &command) { QString importStatement = QString("import "); @@ -787,6 +798,10 @@ void NodeInstanceServer::findItemChangesAndSendChangeCommands() if (!parentChangedSet.isEmpty()) sendChildrenChangedCommand(parentChangedSet.toList()); + if (!m_componentCompletedVector.isEmpty()) + nodeInstanceClient()->componentCompleted(ComponentCompletedCommand(m_componentCompletedVector)); + m_componentCompletedVector.clear(); + if (!dirtyInstanceSet.isEmpty()) nodeInstanceClient()->pixmapChanged(createPixmapChangedCommand(dirtyInstanceSet.toList())); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h index 830df501a56..f4fe0aa5a73 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h @@ -49,6 +49,7 @@ public: void reparentInstances(const ReparentInstancesCommand &command); void changeState(const ChangeStateCommand &command); void addImport(const AddImportCommand &command); + void completeComponent(const CompleteComponentCommand &command); ServerNodeInstance instanceForId(qint32 id) const; bool hasInstanceForId(qint32 id) const; @@ -127,6 +128,7 @@ private: int m_timer; bool m_slowRenderTimer; QVector<InstancePropertyPair> m_changedPropertyList; + QVector<qint32> m_componentCompletedVector; QStringList m_importList; }; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp index 80800b46a4d..d4a567d20c4 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp @@ -16,6 +16,7 @@ #include "reparentinstancescommand.h" #include "changeidscommand.h" #include "changestatecommand.h" +#include "completecomponentcommand.h" #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" @@ -24,6 +25,7 @@ #include "childrenchangedcommand.h" #include "imagecontainer.h" #include "statepreviewimagechangedcommand.h" +#include "componentcompletedcommand.h" namespace QmlDesigner { @@ -117,6 +119,12 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType<StatePreviewImageChangedCommand>("StatePreviewImageChangedCommand"); qRegisterMetaTypeStreamOperators<StatePreviewImageChangedCommand>("StatePreviewImageChangedCommand"); + + qRegisterMetaType<CompleteComponentCommand>("CompleteComponentCommand"); + qRegisterMetaTypeStreamOperators<CompleteComponentCommand>("CompleteComponentCommand"); + + qRegisterMetaType<ComponentCompletedCommand>("ComponentCompletedCommand"); + qRegisterMetaTypeStreamOperators<ComponentCompletedCommand>("ComponentCompletedCommand"); } } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index fa14071a3fe..69b0209d249 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -22,6 +22,7 @@ #include "changeidscommand.h" #include "changestatecommand.h" #include "addimportcommand.h" +#include "completecomponentcommand.h" #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" @@ -29,6 +30,7 @@ #include "childrenchangedcommand.h" #include "imagecontainer.h" #include "statepreviewimagechangedcommand.h" +#include "componentcompletedcommand.h" #include "nodeinstanceview.h" #include "nodeinstanceclientproxy.h" @@ -78,6 +80,7 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command) static const int pixmapChangedCommandType = QMetaType::type("PixmapChangedCommand"); static const int childrenChangedCommandType = QMetaType::type("ChildrenChangedCommand"); static const int statePreviewImageChangedCommandType = QMetaType::type("StatePreviewImageChangedCommand"); + static const int componentCompletedCommandType = QMetaType::type("ComponentCompletedCommand"); if (command.userType() == informationChangedCommandType) nodeInstanceClient()->informationChanged(command.value<InformationChangedCommand>()); @@ -89,6 +92,8 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command) nodeInstanceClient()->childrenChanged(command.value<ChildrenChangedCommand>()); else if (command.userType() == statePreviewImageChangedCommandType) nodeInstanceClient()->statePreviewImagesChanged(command.value<StatePreviewImageChangedCommand>()); + else if (command.userType() == componentCompletedCommandType) + nodeInstanceClient()->componentCompleted(command.value<ComponentCompletedCommand>()); else Q_ASSERT(false); } @@ -213,4 +218,9 @@ void NodeInstanceServerProxy::addImport(const AddImportCommand &command) { writeCommand(QVariant::fromValue(command)); } + +void NodeInstanceServerProxy::completeComponent(const CompleteComponentCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h index 40a6baf6881..f4d4b3ab989 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h @@ -37,6 +37,7 @@ public: void changeIds(const ChangeIdsCommand &command); void changeState(const ChangeStateCommand &command); void addImport(const AddImportCommand &command); + void completeComponent(const CompleteComponentCommand &command); void setBlockUpdates(bool block); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 20465dd7acc..65a0e1f83c5 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -73,6 +73,8 @@ #include "childrenchangedcommand.h" #include "imagecontainer.h" #include "statepreviewimagechangedcommand.h" +#include "completecomponentcommand.h" +#include "componentcompletedcommand.h" #include "nodeinstanceserverproxy.h" @@ -144,6 +146,7 @@ void NodeInstanceView::modelAttached(Model *model) nodeInstanceServer()->addImport(createImportCommand(import)); loadNodes(allModelNodes()); + setBlockUpdates(false); } @@ -176,6 +179,7 @@ void NodeInstanceView::nodeCreated(const ModelNode &createdNode) NodeInstance instance = loadNode(createdNode); nodeInstanceServer()->createInstances(createCreateInstancesCommand(QList<NodeInstance>() << instance)); nodeInstanceServer()->changePropertyValues(createChangeValueCommand(createdNode.variantProperties())); + nodeInstanceServer()->completeComponent(createComponentCompleteCommand(QList<NodeInstance>() << instance)); } /*! \brief Notifing the view that a node was created. @@ -427,6 +431,10 @@ void NodeInstanceView::instancePropertyChange(const QList<QPair<ModelNode, QStri } +void NodeInstanceView::instancesCompleted(const QVector<ModelNode> &/*completedNodeList*/) +{ +} + void NodeInstanceView::importAdded(const Import &import) { nodeInstanceServer()->addImport(createImportCommand(import)); @@ -456,17 +464,12 @@ void NodeInstanceView::loadNodes(const QList<ModelNode> &nodeList) bindingPropertyList.append(node.bindingProperties()); } -// QListIterator<ModelNode> listIterator(nodeList); -// listIterator.toBack(); - -// while (listIterator.hasPrevious()) -// instanceForNode(listIterator.previous()).doComponentComplete(); - nodeInstanceServer()->createInstances(createCreateInstancesCommand(instanceList)); nodeInstanceServer()->reparentInstances(createReparentInstancesCommand(instanceList)); nodeInstanceServer()->changeIds(createChangeIdsCommand(instanceList)); nodeInstanceServer()->changePropertyValues(createChangeValueCommand(variantPropertyList)); nodeInstanceServer()->changePropertyBindings(createChangeBindingCommand(bindingPropertyList)); + nodeInstanceServer()->completeComponent(createComponentCompleteCommand(instanceList)); } void NodeInstanceView::removeAllInstanceNodeRelationships() @@ -692,6 +695,28 @@ ClearSceneCommand NodeInstanceView::createClearSceneCommand() const return ClearSceneCommand(); } +CompleteComponentCommand NodeInstanceView::createComponentCompleteCommand(const QList<NodeInstance> &instanceList) const +{ + QVector<qint32> containerList; + foreach(const NodeInstance &instance, instanceList) { + if (instance.instanceId() >= 0) + containerList.append(instance.instanceId()); + } + + return CompleteComponentCommand(containerList); +} + +ComponentCompletedCommand NodeInstanceView::createComponentCompletedCommand(const QList<NodeInstance> &instanceList) const +{ + QVector<qint32> containerList; + foreach(const NodeInstance &instance, instanceList) { + if (instance.instanceId() >= 0) + containerList.append(instance.instanceId()); + } + + return ComponentCompletedCommand(containerList); +} + CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QList<NodeInstance> &instanceList) const { QVector<InstanceContainer> containerList; @@ -910,6 +935,23 @@ void NodeInstanceView::statePreviewImagesChanged(const StatePreviewImageChangedC } +void NodeInstanceView::componentCompleted(const ComponentCompletedCommand &command) +{ + if (!model()) + return; + + QVector<ModelNode> nodeVector; + + foreach(const qint32 &instanceId, command.instances()) { + if (hasModelNodeForInternalId(instanceId)) { + nodeVector.append(modelNodeForInternalId(instanceId)); + } + } + + if (!nodeVector.isEmpty()) + emitInstancesCompleted(nodeVector); +} + void NodeInstanceView::childrenChanged(const ChildrenChangedCommand &command) { if (!model()) diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 7c2b613833f..fc4a57783d7 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -393,6 +393,12 @@ void AbstractView::emitInstancePropertyChange(const QList<QPair<ModelNode, QStri model()->m_d->notifyInstancePropertyChange(propertyList); } +void AbstractView::emitInstancesCompleted(const QVector<ModelNode> &nodeVector) +{ + if (model() && nodeInstanceView() == this) + model()->m_d->notifyInstancesCompleted(nodeVector); +} + void AbstractView::changeRootNodeType(const QString &type, int majorVersion, int minorVersion) { Internal::WriteLocker locker(m_model.data()); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index f1c0558bdbb..8e2daf93a7a 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -414,6 +414,35 @@ void ModelPrivate::notifyInstancePropertyChange(const QList<QPair<ModelNode, QSt } } +void ModelPrivate::notifyInstancesCompleted(const QVector<ModelNode> &nodeVector) +{ + bool resetModel = false; + QString description; + + QVector<Internal::InternalNode::Pointer> internalVector(toInternalNodeVector(nodeVector)); + + try { + if (rewriterView()) + rewriterView()->instancesCompleted(toModelNodeVector(internalVector, rewriterView())); + } catch (RewritingException &e) { + description = e.description(); + resetModel = true; + } + + foreach (const QWeakPointer<AbstractView> &view, m_viewList) { + Q_ASSERT(view != 0); + view->instancesCompleted(toModelNodeVector(internalVector, view.data())); + } + + if (nodeInstanceView()) { + nodeInstanceView()->instancesCompleted(toModelNodeVector(internalVector, nodeInstanceView())); + } + + if (resetModel) { + resetModelByRewriter(description); + } +} + void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) { bool resetModel = false; @@ -1026,6 +1055,15 @@ QList<ModelNode> ModelPrivate::toModelNodeList(const QList<InternalNode::Pointer return newNodeList; } +QVector<ModelNode> ModelPrivate::toModelNodeVector(const QVector<InternalNode::Pointer> &nodeVector, AbstractView *view) const +{ + QVector<ModelNode> newNodeVector; + foreach (const Internal::InternalNode::Pointer &node, nodeVector) + newNodeVector.append(ModelNode(node, model(), view)); + + return newNodeVector; +} + QList<Internal::InternalNode::Pointer> ModelPrivate::toInternalNodeList(const QList<ModelNode> &nodeList) const { QList<Internal::InternalNode::Pointer> newNodeList; @@ -1035,6 +1073,15 @@ QList<Internal::InternalNode::Pointer> ModelPrivate::toInternalNodeList(const QL return newNodeList; } +QVector<Internal::InternalNode::Pointer> ModelPrivate::toInternalNodeVector(const QVector<ModelNode> &nodeVector) const +{ + QVector<Internal::InternalNode::Pointer> newNodeVector; + foreach (const ModelNode &node, nodeVector) + newNodeVector.append(node.internalNode()); + + return newNodeVector; +} + void ModelPrivate::changeSelectedNodes(const QList<InternalNode::Pointer> &newSelectedNodeList, const QList<InternalNode::Pointer> &oldSelectedNodeList) { diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 74531b9ac8c..d824164e973 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -144,7 +144,7 @@ public: void notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data); void notifyInstancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); - + void notifyInstancesCompleted(const QVector<ModelNode> &nodeList); void setSelectedNodes(const QList<InternalNodePointer> &selectedNodeList); @@ -207,6 +207,8 @@ private: //functions void removeNodeFromModel(const InternalNodePointer &node); QList<InternalNodePointer> toInternalNodeList(const QList<ModelNode> &nodeList) const; QList<ModelNode> toModelNodeList(const QList<InternalNodePointer> &nodeList, AbstractView *view) const; + QVector<ModelNode> toModelNodeVector(const QVector<InternalNodePointer> &nodeVector, AbstractView *view) const; + QVector<InternalNodePointer> toInternalNodeVector(const QVector<ModelNode> &nodeVector) const; private: Model *m_q; diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 9cadcf36719..40e450f5bc5 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -362,6 +362,9 @@ void QmlModelView::instancePropertyChange(const QList<QPair<ModelNode, QString> nodeInstancePropertyChanged(propertyPair.first, propertyPair.second); } } +void QmlModelView::instancesCompleted(const QVector<ModelNode> &/*completedNodeList*/) +{ +} void QmlModelView::nodeInstancePropertyChanged(const ModelNode &node, const QString &propertyName) { @@ -431,7 +434,7 @@ void QmlModelView::otherPropertyChanged(const QmlObjectNode &/*qmlObjectNode*/, { } -void QmlModelView::stateChanged(const QmlModelState &newQmlModelState, const QmlModelState &oldQmlModelState) +void QmlModelView::stateChanged(const QmlModelState &/*newQmlModelState*/, const QmlModelState &/*oldQmlModelState*/) { } diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 470c3f6d8a8..fd7e2a866cc 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -385,6 +385,10 @@ void RewriterView::instancePropertyChange(const QList<QPair<ModelNode, QString> { } +void RewriterView::instancesCompleted(const QVector<ModelNode> &/*completedNodeList*/) +{ +} + void RewriterView::selectedNodesChanged(const QList<ModelNode> & /* selectedNodeList, */, const QList<ModelNode> & /*lastSelectedNodeList */) { diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp index 3977d7737d7..5e500536c37 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp @@ -212,6 +212,14 @@ void ViewLogger::instancePropertyChange(const QList<QPair<ModelNode, QString> > m_output << time() << indent("property: ") << propertyPair.first << propertyPair.second << endl; } +void ViewLogger::instancesCompleted(const QVector<ModelNode> &completedNodeList) +{ + m_output << time() << indent("instancesCompleted:") << endl; + + foreach(const ModelNode &node, completedNodeList) + m_output << time() << indent("node: ") << node << endl; + +} } // namespace Internal } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h index a20b7b2a89b..75de80bc562 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.h +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h @@ -73,7 +73,7 @@ public: void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data); void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList); - + void instancesCompleted(const QVector<ModelNode> &completedNodeList); protected: QString time() const; -- GitLab