From 7939c270bd2e1c0e06533048dc207dbe17d25450 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 8 Jun 2011 17:02:03 +0200 Subject: [PATCH] QmlDesigner.model: refactoring for nodeSource I changed customParserSource into nodeSource and use it also for components. This means we do not use auxiliaryData anymore with some magic __component_data identifier. To distinguish between CustumParserSource and ComponentSource I introduced the enum NodeSourceType. Also in this patch I added auxiliaryData in the creation of a node. This was useful for prototyping and will help with prototyping/testing in the future. Change-Id: I2152c26c0c767f869f7dce7209abf43f594fd2ad Reviewed-on: http://codereview.qt.nokia.com/399 Reviewed-by: Marco Bubke --- .../components/integration/componentview.cpp | 2 +- .../components/integration/componentview.h | 2 +- .../integration/designdocumentcontrollerview.cpp | 2 +- .../integration/designdocumentcontrollerview.h | 2 +- .../components/itemlibrary/itemlibraryview.cpp | 2 +- .../components/itemlibrary/itemlibraryview.h | 2 +- .../components/navigator/navigatorview.cpp | 2 +- .../components/navigator/navigatorview.h | 2 +- .../qmldesigner/designercore/designercore.pri | 6 +- .../designercore/include/abstractview.h | 6 +- .../qmldesigner/designercore/include/modelnode.h | 13 +- .../include/nodeinstanceserverinterface.h | 6 +- .../designercore/include/nodeinstanceview.h | 2 +- .../designercore/include/qmlmodelview.h | 2 +- .../designercore/include/rewriterview.h | 3 +- ...urcecommand.cpp => changenodesourcecommand.cpp} | 22 +-- ...ersourcecommand.h => changenodesourcecommand.h} | 24 +-- .../instances/componentnodeinstance.cpp | 27 ++-- .../designercore/instances/componentnodeinstance.h | 4 +- .../designercore/instances/createscenecommand.cpp | 9 ++ .../designercore/instances/createscenecommand.h | 3 + .../designercore/instances/instancecontainer.cpp | 19 ++- .../designercore/instances/instancecontainer.h | 18 ++- .../designercore/instances/instances.pri | 6 +- .../instances/nodeinstanceclientproxy.cpp | 21 ++- .../instances/nodeinstanceclientproxy.h | 6 +- .../designercore/instances/nodeinstanceserver.cpp | 51 +++++-- .../designercore/instances/nodeinstanceserver.h | 4 +- .../instances/nodeinstanceserverinterface.cpp | 9 +- .../instances/nodeinstanceserverproxy.cpp | 10 +- .../instances/nodeinstanceserverproxy.h | 3 +- .../designercore/instances/nodeinstanceview.cpp | 89 +++++------- .../designercore/instances/objectnodeinstance.cpp | 57 +++++--- .../designercore/instances/objectnodeinstance.h | 7 +- .../designercore/instances/servernodeinstance.cpp | 23 ++- .../designercore/instances/servernodeinstance.h | 9 +- .../designercore/metainfo/nodemetainfo.cpp | 4 +- .../designercore/model/abstractview.cpp | 6 +- .../designercore/model/internalnode.cpp | 23 ++- .../designercore/model/internalnode_p.h | 11 +- .../qmldesigner/designercore/model/model.cpp | 29 ++-- .../qmldesigner/designercore/model/model_p.h | 8 +- .../qmldesigner/designercore/model/modelnode.cpp | 29 +++- .../designercore/model/qmlmodelview.cpp | 2 +- .../designercore/model/rewriterview.cpp | 8 +- .../designercore/model/texttomodelmerger.cpp | 161 +++++++++++++++------ .../designercore/model/texttomodelmerger.h | 17 ++- .../qmldesigner/designercore/model/viewlogger.cpp | 4 +- .../qmldesigner/designercore/model/viewlogger.h | 2 +- 49 files changed, 520 insertions(+), 259 deletions(-) rename src/plugins/qmldesigner/designercore/instances/{changecustomparsersourcecommand.cpp => changenodesourcecommand.cpp} (67%) rename src/plugins/qmldesigner/designercore/instances/{changecustomparsersourcecommand.h => changenodesourcecommand.h} (67%) diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index bfc0a1cffb..b4ee511716 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -196,7 +196,7 @@ void ComponentView::instanceInformationsChange(const QVector &/*nodeL void ComponentView::instancesRenderImageChanged(const QVector &/*nodeList*/) {} void ComponentView::instancesPreviewImageChanged(const QVector &/*nodeList*/) {} void ComponentView::instancesChildrenChanged(const QVector &/*nodeList*/) {} -void ComponentView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/) {} +void ComponentView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) {} void ComponentView::rewriterBeginTransaction() {} void ComponentView::rewriterEndTransaction() {} diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h index 63c80f12ad..17b5175bcf 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.h +++ b/src/plugins/qmldesigner/components/integration/componentview.h @@ -81,7 +81,7 @@ public: void instancesRenderImageChanged(const QVector &nodeList); void instancesPreviewImageChanged(const QVector &nodeList); void instancesChildrenChanged(const QVector &nodeList); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); void rewriterEndTransaction(); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp index 66c6823de0..4129283355 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp @@ -92,7 +92,7 @@ void DesignDocumentControllerView::instancesChildrenChanged(const QVector &nodeList); void instancesPreviewImageChanged(const QVector &nodeList); void instancesChildrenChanged(const QVector &nodeList); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); void rewriterEndTransaction(); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 96d4514a31..3271a7d149 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -172,7 +172,7 @@ void ItemLibraryView::instancesChildrenChanged(const QVector &/*nodeL } -void ItemLibraryView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/) +void ItemLibraryView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h index 6e4bf39ab1..e316de2c61 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h @@ -84,7 +84,7 @@ public: void instancesRenderImageChanged(const QVector &nodeList); void instancesPreviewImageChanged(const QVector &nodeList); void instancesChildrenChanged(const QVector &nodeList); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); void rewriterEndTransaction(); diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index a04976c59b..8cf25383e6 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -235,7 +235,7 @@ void NavigatorView::instancesChildrenChanged(const QVector &/*nodeLis } -void NavigatorView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/) +void NavigatorView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { } diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h index 9da03581d4..221b00d2d2 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h @@ -92,7 +92,7 @@ public: void instancesRenderImageChanged(const QVector &nodeList); void instancesPreviewImageChanged(const QVector &nodeList); void instancesChildrenChanged(const QVector &nodeList); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); void rewriterEndTransaction(); diff --git a/src/plugins/qmldesigner/designercore/designercore.pri b/src/plugins/qmldesigner/designercore/designercore.pri index 6491c9f6bb..6996f2ef4c 100644 --- a/src/plugins/qmldesigner/designercore/designercore.pri +++ b/src/plugins/qmldesigner/designercore/designercore.pri @@ -107,7 +107,8 @@ SOURCES += $$PWD/model/abstractview.cpp \ $$PWD/instances/imagecontainer.cpp \ $$PWD/instances/completecomponentcommand.cpp \ $$PWD/instances/componentcompletedcommand.cpp \ - $$PWD/instances/changecustomparsersourcecommand.cpp \ + $$PWD/instances/changenodesourcecommand.cpp \ + $$PWD/instances/changeauxiliarycommand.cpp \ $$PWD/instances/addimportcontainer.cpp HEADERS += $$PWD/include/corelib_global.h \ @@ -216,7 +217,8 @@ HEADERS += $$PWD/include/corelib_global.h \ $$PWD/instances/imagecontainer.h \ $$PWD/instances/completecomponentcommand.h \ $$PWD/instances/componentcompletedcommand.h \ - $$PWD/instances/changecustomparsersourcecommand.h \ + $$PWD/instances/changenodesourcecommand.h \ + $$PWD/instances/changeauxiliarycommand.h \ $$PWD/instances/addimportcontainer.h contains(CONFIG, plugin) { # If core.pri has been included in the qmldesigner plugin diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index ca3dd10906..a6d298c3f2 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -86,7 +86,9 @@ public: int majorVersion, int minorVersion, const PropertyListType &propertyList = PropertyListType(), - const QString &customParserSource = QString()); + const PropertyListType &auxPropertyList = PropertyListType(), + const QString &nodeSource = QString(), + ModelNode::NodeSourceType nodeSourceType = ModelNode::NoSource); const ModelNode rootModelNode() const; ModelNode rootModelNode(); @@ -141,7 +143,7 @@ public: virtual void instancesRenderImageChanged(const QVector &nodeList) = 0; virtual void instancesPreviewImageChanged(const QVector &nodeList) = 0; virtual void instancesChildrenChanged(const QVector &nodeList) = 0; - virtual void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource) = 0; + virtual void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource) = 0; virtual void rewriterBeginTransaction() = 0; virtual void rewriterEndTransaction() = 0; diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index f430b911b3..810349aac7 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -86,6 +86,12 @@ class CORESHARED_EXPORT ModelNode friend class QmlDesigner::NodeProperty; public: + enum NodeSourceType { + NoSource = 0, + CustomParserSource = 1, + ComponentSource = 2 + }; + ModelNode(); ModelNode(const Internal::InternalNodePointer &internalNode, Model *model, AbstractView *view); ModelNode(const ModelNode modelNode, AbstractView *view); @@ -167,14 +173,17 @@ public: QVariant auxiliaryData(const QString &name) const; void setAuxiliaryData(const QString &name, const QVariant &data) const; bool hasAuxiliaryData(const QString &name) const; + QHash auxiliaryData() const; qint32 internalId() const; - void setCustomParserSource(const QString&); - QString customParserSource() const; + void setNodeSource(const QString&); + QString nodeSource() const; QString convertTypeToImportAlias() const; + NodeSourceType nodeSourceType() const; + private: // functions Internal::InternalNodePointer internalNode() const; QString generateNewId() const; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h index 905762ba35..677d4189a6 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h @@ -44,6 +44,7 @@ class PropertyValueContainer; class ChangeFileUrlCommand; class ChangeValuesCommand; class ChangeBindingsCommand; +class ChangeAuxiliaryCommand; class CreateSceneCommand; class CreateInstancesCommand; class ClearSceneCommand; @@ -54,7 +55,7 @@ class RemovePropertiesCommand; class ChangeStateCommand; class AddImportCommand; class CompleteComponentCommand; -class ChangeCustomParserSourceCommand; +class ChangeNodeSourceCommand; class NodeInstanceServerInterface : public QObject { @@ -75,12 +76,13 @@ public: virtual void removeProperties(const RemovePropertiesCommand &command) = 0; virtual void changePropertyBindings(const ChangeBindingsCommand &command) = 0; virtual void changePropertyValues(const ChangeValuesCommand &command) = 0; + virtual void changeAuxiliaryValues(const ChangeAuxiliaryCommand &command) = 0; virtual void reparentInstances(const ReparentInstancesCommand &command) = 0; 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 changeCustomParserSource(const ChangeCustomParserSourceCommand &command) = 0; + virtual void changeNodeSource(const ChangeNodeSourceCommand &command) = 0; static void registerCommands(); }; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index a50688b45b..4eb21e81b4 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -109,7 +109,7 @@ public: void instancesChildrenChanged(const QVector &nodeList); void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); void rewriterEndTransaction(); diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h index b08dbb9640..ff5ee02c31 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h +++ b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h @@ -119,7 +119,7 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList); void importsChanged(const QList &addedImports, const QList &removedImports); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); protected: NodeInstance instanceForModelNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 5b311ad758..b8cb4cd204 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -143,7 +143,7 @@ public: void instancesRenderImageChanged(const QVector &nodeList); void instancesPreviewImageChanged(const QVector &nodeList); void instancesChildrenChanged(const QVector &nodeList); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); void rewriterEndTransaction(); @@ -200,6 +200,7 @@ signals: public slots: void qmlTextChanged(); + void delayedSetup(); protected: // functions Internal::ModelToTextMerger *modelToTextMerger() const; diff --git a/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp b/src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.cpp similarity index 67% rename from src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp rename to src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.cpp index 75d6d416f8..65b427c21e 100644 --- a/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp +++ b/src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.cpp @@ -30,41 +30,41 @@ ** **************************************************************************/ -#include "changecustomparsersourcecommand.h" +#include "changenodesourcecommand.h" namespace QmlDesigner { -ChangeCustomParserSourceCommand::ChangeCustomParserSourceCommand() +ChangeNodeSourceCommand::ChangeNodeSourceCommand() { } -ChangeCustomParserSourceCommand::ChangeCustomParserSourceCommand(qint32 newInstanceId, const QString &newCustomParserSource) - : m_instanceId(newInstanceId), m_customParserSource(newCustomParserSource) +ChangeNodeSourceCommand::ChangeNodeSourceCommand(qint32 newInstanceId, const QString &newNodeSource) + : m_instanceId(newInstanceId), m_nodeSource(newNodeSource) { } -qint32 ChangeCustomParserSourceCommand::instanceId() const +qint32 ChangeNodeSourceCommand::instanceId() const { return m_instanceId; } -QString ChangeCustomParserSourceCommand::customParserSource() const +QString ChangeNodeSourceCommand::nodeSource() const { - return m_customParserSource; + return m_nodeSource; } -QDataStream &operator<<(QDataStream &out, const ChangeCustomParserSourceCommand &command) +QDataStream &operator<<(QDataStream &out, const ChangeNodeSourceCommand &command) { out << command.instanceId(); - out << command.customParserSource(); + out << command.nodeSource(); return out; } -QDataStream &operator>>(QDataStream &in, ChangeCustomParserSourceCommand &command) +QDataStream &operator>>(QDataStream &in, ChangeNodeSourceCommand &command) { in >> command.m_instanceId; - in >> command.m_customParserSource; + in >> command.m_nodeSource; return in; } diff --git a/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h b/src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.h similarity index 67% rename from src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h rename to src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.h index 090a6305ef..9a04e4811f 100644 --- a/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h +++ b/src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.h @@ -30,32 +30,32 @@ ** **************************************************************************/ -#ifndef CHANGECUSTOMPARSERSOURCECOMMAND_H -#define CHANGECUSTOMPARSERSOURCECOMMAND_H +#ifndef CHANGENODESOURCECOMMAND_H +#define CHANGENODESOURCECOMMAND_H #include namespace QmlDesigner { -class ChangeCustomParserSourceCommand +class ChangeNodeSourceCommand { - friend QDataStream &operator>>(QDataStream &in, ChangeCustomParserSourceCommand &command); + friend QDataStream &operator>>(QDataStream &in, ChangeNodeSourceCommand &command); public: - ChangeCustomParserSourceCommand(); - ChangeCustomParserSourceCommand(qint32 instanceId, const QString &customParserSource); + ChangeNodeSourceCommand(); + ChangeNodeSourceCommand(qint32 instanceId, const QString &nodeSource); qint32 instanceId() const; - QString customParserSource() const; + QString nodeSource() const; private: qint32 m_instanceId; - QString m_customParserSource; + QString m_nodeSource; }; -QDataStream &operator<<(QDataStream &out, const ChangeCustomParserSourceCommand &command); -QDataStream &operator>>(QDataStream &in, ChangeCustomParserSourceCommand &command); +QDataStream &operator<<(QDataStream &out, const ChangeNodeSourceCommand &command); +QDataStream &operator>>(QDataStream &in, ChangeNodeSourceCommand &command); } // namespace QmlDesigner -Q_DECLARE_METATYPE(QmlDesigner::ChangeCustomParserSourceCommand) +Q_DECLARE_METATYPE(QmlDesigner::ChangeNodeSourceCommand) -#endif // CHANGECUSTOMPARSERSOURCECOMMAND_H +#endif // CHANGENODESOURCECOMMAND_H diff --git a/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp index f3dc0c8b74..2ca11bf573 100644 --- a/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp @@ -70,27 +70,24 @@ bool ComponentNodeInstance::hasContent() const return true; } -void ComponentNodeInstance::setPropertyVariant(const QString &name, const QVariant &value) +void ComponentNodeInstance::setNodeSource(const QString &source) { - if (name == "__component_data") { - - QByteArray importArray; - foreach(const QString &import, nodeInstanceServer()->imports()) { - importArray.append(import.toUtf8()); - } + QByteArray importArray; + foreach (const QString &import, nodeInstanceServer()->imports()) { + importArray.append(import.toUtf8()); + } - QByteArray data(value.toByteArray()); + QByteArray data(source.toUtf8()); - data.prepend(importArray); - data.append("\n"); + data.prepend(importArray); + data.append("\n"); - component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() + - QLatin1Char('_')+ id())); - setId(id()); - } + component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() + + QLatin1Char('_')+ id())); + setId(id()); if (component()->isError()) { - qDebug() << value; + qDebug() << source; foreach(const QDeclarativeError &error, component()->errors()) qDebug() << error; } diff --git a/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.h index cc274c88cb..32c4b34414 100644 --- a/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.h @@ -50,10 +50,10 @@ public: ComponentNodeInstance(QDeclarativeComponent *component); static Pointer create(QObject *objectToBeWrapped); - void setPropertyVariant(const QString &name, const QVariant &value); - bool hasContent() const; + void setNodeSource(const QString &source); + private: //function QDeclarativeComponent *component() const; diff --git a/src/plugins/qmldesigner/designercore/instances/createscenecommand.cpp b/src/plugins/qmldesigner/designercore/instances/createscenecommand.cpp index e63151256b..ed9a72f8b5 100644 --- a/src/plugins/qmldesigner/designercore/instances/createscenecommand.cpp +++ b/src/plugins/qmldesigner/designercore/instances/createscenecommand.cpp @@ -43,6 +43,7 @@ CreateSceneCommand::CreateSceneCommand(const QVector &instanc const QVector &idVector, const QVector &valueChangeVector, const QVector &bindingChangeVector, + const QVector &auxiliaryChangeVector, const QVector &importVector, const QUrl &fileUrl) : m_instanceVector(instanceContainer), @@ -50,6 +51,7 @@ CreateSceneCommand::CreateSceneCommand(const QVector &instanc m_idVector(idVector), m_valueChangeVector(valueChangeVector), m_bindingChangeVector(bindingChangeVector), + m_auxiliaryChangeVector(auxiliaryChangeVector), m_importVector(importVector), m_fileUrl(fileUrl) { @@ -80,6 +82,11 @@ QVector CreateSceneCommand::bindingChanges() const return m_bindingChangeVector; } +QVector CreateSceneCommand::auxiliaryChanges() const +{ + return m_auxiliaryChangeVector; +} + QVector CreateSceneCommand::imports() const { return m_importVector; @@ -97,6 +104,7 @@ QDataStream &operator<<(QDataStream &out, const CreateSceneCommand &command) out << command.ids(); out << command.valueChanges(); out << command.bindingChanges(); + out << command.auxiliaryChanges(); out << command.imports(); out << command.fileUrl(); @@ -110,6 +118,7 @@ QDataStream &operator>>(QDataStream &in, CreateSceneCommand &command) in >> command.m_idVector; in >> command.m_valueChangeVector; in >> command.m_bindingChangeVector; + in >> command.m_auxiliaryChangeVector; in >> command.m_importVector; in >> command.m_fileUrl; diff --git a/src/plugins/qmldesigner/designercore/instances/createscenecommand.h b/src/plugins/qmldesigner/designercore/instances/createscenecommand.h index 62031ecd58..d37487c995 100644 --- a/src/plugins/qmldesigner/designercore/instances/createscenecommand.h +++ b/src/plugins/qmldesigner/designercore/instances/createscenecommand.h @@ -57,6 +57,7 @@ public: const QVector &idVector, const QVector &valueChangeVector, const QVector &bindingChangeVector, + const QVector &auxiliaryChangeVector, const QVector &importVector, const QUrl &fileUrl); @@ -65,6 +66,7 @@ public: QVector ids() const; QVector valueChanges() const; QVector bindingChanges() const; + QVector auxiliaryChanges() const; QVector imports() const; QUrl fileUrl() const; @@ -74,6 +76,7 @@ private: QVector m_idVector; QVector m_valueChangeVector; QVector m_bindingChangeVector; + QVector m_auxiliaryChangeVector; QVector m_importVector; QUrl m_fileUrl; }; diff --git a/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp b/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp index 9bd6bf79ff..57a1838576 100644 --- a/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp +++ b/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp @@ -39,9 +39,9 @@ InstanceContainer::InstanceContainer() { } -InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &customParserSource) +InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType) : m_instanceId(instanceId), m_type(type), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath), - m_customParserSource(customParserSource) + m_nodeSource(nodeSource), m_nodeSourceType(nodeSourceType) { m_type.replace(QLatin1Char('.'), QLatin1Char('/')); } @@ -71,9 +71,14 @@ QString InstanceContainer::componentPath() const return m_componentPath; } -QString InstanceContainer::customParserSource() const +QString InstanceContainer::nodeSource() const { - return m_customParserSource; + return m_nodeSource; +} + +InstanceContainer::NodeSourceType InstanceContainer::nodeSourceType() const +{ + return static_cast(m_nodeSourceType); } QDataStream &operator<<(QDataStream &out, const InstanceContainer &container) @@ -83,7 +88,8 @@ QDataStream &operator<<(QDataStream &out, const InstanceContainer &container) out << container.majorNumber(); out << container.minorNumber(); out << container.componentPath(); - out << container.customParserSource(); + out << container.nodeSource(); + out << container.nodeSourceType(); return out; } @@ -96,7 +102,8 @@ QDataStream &operator>>(QDataStream &in, InstanceContainer &container) in >> container.m_majorNumber; in >> container.m_minorNumber; in >> container.m_componentPath; - in >> container.m_customParserSource; + in >> container.m_nodeSource; + in >> container.m_nodeSourceType; return in; } diff --git a/src/plugins/qmldesigner/designercore/instances/instancecontainer.h b/src/plugins/qmldesigner/designercore/instances/instancecontainer.h index 0d1cc5439b..b80bec5d39 100644 --- a/src/plugins/qmldesigner/designercore/instances/instancecontainer.h +++ b/src/plugins/qmldesigner/designercore/instances/instancecontainer.h @@ -48,23 +48,31 @@ class InstanceContainer friend QDataStream &operator>>(QDataStream &in, InstanceContainer &container); public: + enum NodeSourceType { + NoSource = 0, + CustomParserSource = 1, + ComponentSource = 2 + }; + InstanceContainer(); - InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &customParserSource); + InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType); qint32 instanceId() const; QString type() const; int majorNumber() const; int minorNumber() const; QString componentPath() const; - QString customParserSource() const; + QString nodeSource() const; + NodeSourceType nodeSourceType() const; private: qint32 m_instanceId; QString m_type; - int m_majorNumber; - int m_minorNumber; + qint32 m_majorNumber; + qint32 m_minorNumber; QString m_componentPath; - QString m_customParserSource; + QString m_nodeSource; + qint32 m_nodeSourceType; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/instances.pri b/src/plugins/qmldesigner/designercore/instances/instances.pri index ed8b0eab57..f3b0b6f2a2 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/changeauxiliarycommand.h HEADERS += $$PWD/informationnodeinstanceserver.h HEADERS += $$PWD/dummycontextobject.h HEADERS += $$PWD/rendernodeinstanceserver.h @@ -18,7 +19,7 @@ HEADERS += $$PWD/addimportcommand.h HEADERS += $$PWD/changebindingscommand.h HEADERS += $$PWD/changefileurlcommand.h HEADERS += $$PWD/changeidscommand.h -HEADERS += $$PWD/changecustomparsersourcecommand.h +HEADERS += $$PWD/changenodesourcecommand.h HEADERS += $$PWD/changestatecommand.h HEADERS += $$PWD/changevaluescommand.h HEADERS += $$PWD/childrenchangeeventfilter.h @@ -54,6 +55,7 @@ HEADERS += $$PWD/../include/nodeinstanceserverinterface.h SOURCES += $$PWD/behaviornodeinstance.cpp +SOURCES += $$PWD/changeauxiliarycommand.cpp SOURCES += $$PWD/informationnodeinstanceserver.cpp SOURCES += $$PWD/dummycontextobject.cpp SOURCES += $$PWD/rendernodeinstanceserver.cpp @@ -69,7 +71,7 @@ SOURCES += $$PWD/addimportcommand.cpp SOURCES += $$PWD/changebindingscommand.cpp SOURCES += $$PWD/changefileurlcommand.cpp SOURCES += $$PWD/changeidscommand.cpp -SOURCES += $$PWD/changecustomparsersourcecommand.cpp +SOURCES += $$PWD/changenodesourcecommand.cpp SOURCES += $$PWD/changestatecommand.cpp SOURCES += $$PWD/changevaluescommand.cpp SOURCES += $$PWD/childrenchangeeventfilter.cpp diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp index 4f43479c5e..700161c840 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp @@ -49,6 +49,7 @@ #include "createscenecommand.h" #include "changevaluescommand.h" #include "changebindingscommand.h" +#include "changeauxiliarycommand.h" #include "changefileurlcommand.h" #include "removeinstancescommand.h" #include "clearscenecommand.h" @@ -67,7 +68,7 @@ #include "imagecontainer.h" #include "statepreviewimagechangedcommand.h" #include "componentcompletedcommand.h" -#include "changecustomparsersourcecommand.h" +#include "changenodesourcecommand.h" namespace QmlDesigner { @@ -239,6 +240,11 @@ void NodeInstanceClientProxy::changePropertyValues(const ChangeValuesCommand &co nodeInstanceServer()->changePropertyValues(command); } +void NodeInstanceClientProxy::changeAuxiliaryValues(const ChangeAuxiliaryCommand &command) +{ + nodeInstanceServer()->changeAuxiliaryValues(command); +} + void NodeInstanceClientProxy::reparentInstances(const ReparentInstancesCommand &command) { nodeInstanceServer()->reparentInstances(command); @@ -264,9 +270,9 @@ void NodeInstanceClientProxy::completeComponent(const CompleteComponentCommand & nodeInstanceServer()->completeComponent(command); } -void NodeInstanceClientProxy::changeCustomParserSource(const ChangeCustomParserSourceCommand &command) +void NodeInstanceClientProxy::changeNodeSource(const ChangeNodeSourceCommand &command) { - nodeInstanceServer()->changeCustomParserSource(command); + nodeInstanceServer()->changeNodeSource(command); } void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) @@ -279,13 +285,14 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) static const int removePropertiesCommandType = QMetaType::type("RemovePropertiesCommand"); static const int changeBindingsCommandType = QMetaType::type("ChangeBindingsCommand"); static const int changeValuesCommandType = QMetaType::type("ChangeValuesCommand"); + static const int changeAuxiliaryCommandType = QMetaType::type("ChangeAuxiliaryCommand"); static const int reparentInstancesCommandType = QMetaType::type("ReparentInstancesCommand"); 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"); static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand"); - static const int changeCustomParserSourceCommandType = QMetaType::type("ChangeCustomParserSourceCommand"); + static const int changeNodeSourceCommandType = QMetaType::type("ChangeNodeSourceCommand"); if (command.userType() == createInstancesCommandType) { createInstances(command.value()); @@ -303,6 +310,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) changePropertyBindings(command.value()); else if (command.userType() == changeValuesCommandType) changePropertyValues(command.value()); + else if (command.userType() == changeAuxiliaryCommandType) + changeAuxiliaryValues(command.value()); else if (command.userType() == reparentInstancesCommandType) reparentInstances(command.value()); else if (command.userType() == changeIdsCommandType) @@ -313,8 +322,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) addImport(command.value()); else if (command.userType() == completeComponentCommandType) completeComponent(command.value()); - else if (command.userType() == changeCustomParserSourceCommandType) - changeCustomParserSource(command.value()); + else if (command.userType() == changeNodeSourceCommandType) + changeNodeSource(command.value()); else if (command.userType() == synchronizeCommandType) { SynchronizeCommand synchronizeCommand = command.value(); m_synchronizeId = synchronizeCommand.synchronizeId(); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h index 4c185995ef..1fe067d39b 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h @@ -52,6 +52,7 @@ class ClearSceneCommand; class ReparentInstancesCommand; class ChangeFileUrlCommand; class ChangeValuesCommand; +class ChangeAuxiliaryCommand; class ChangeBindingsCommand; class ChangeIdsCommand; class RemoveInstancesCommand; @@ -59,7 +60,7 @@ class RemovePropertiesCommand; class AddImportCommand; class CompleteComponentCommand; class ChangeStateCommand; -class ChangeCustomParserSourceCommand; +class ChangeNodeSourceCommand; class NodeInstanceClientProxy : public QObject, public NodeInstanceClientInterface { @@ -92,12 +93,13 @@ protected: void removeProperties(const RemovePropertiesCommand &command); void changePropertyBindings(const ChangeBindingsCommand &command); void changePropertyValues(const ChangeValuesCommand &command); + void changeAuxiliaryValues(const ChangeAuxiliaryCommand &command); void reparentInstances(const ReparentInstancesCommand &command); void changeIds(const ChangeIdsCommand &command); void changeState(const ChangeStateCommand &command); void addImport(const AddImportCommand &command); void completeComponent(const CompleteComponentCommand &command); - void changeCustomParserSource(const ChangeCustomParserSourceCommand &command); + void changeNodeSource(const ChangeNodeSourceCommand &command); private slots: void readDataStream(); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp index a0a6c01999..92d284be7a 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include "servernodeinstance.h" #include "childrenchangeeventfilter.h" @@ -60,6 +61,7 @@ #include "clearscenecommand.h" #include "reparentinstancescommand.h" #include "changevaluescommand.h" +#include "changeauxiliarycommand.h" #include "changebindingscommand.h" #include "changeidscommand.h" #include "removeinstancescommand.h" @@ -76,7 +78,7 @@ #include "completecomponentcommand.h" #include "componentcompletedcommand.h" #include "createscenecommand.h" -#include "changecustomparsersourcecommand.h" +#include "changenodesourcecommand.h" #include "dummycontextobject.h" @@ -108,7 +110,12 @@ QList NodeInstanceServer::createInstances(const QVector instanceList; foreach(const InstanceContainer &instanceContainer, containerVector) { - ServerNodeInstance instance = ServerNodeInstance::create(this, instanceContainer); + ServerNodeInstance instance; + if (instanceContainer.nodeSourceType() == InstanceContainer::ComponentSource) { + instance = ServerNodeInstance::create(this, instanceContainer, ServerNodeInstance::WrapAsComponent); + } else { + instance = ServerNodeInstance::create(this, instanceContainer, ServerNodeInstance::DoNotWrapAsComponent); + } insertInstanceRelationship(instance); instanceList.append(instance); instance.internalObject()->installEventFilter(childrenChangeEventFilter()); @@ -119,7 +126,6 @@ QList NodeInstanceServer::createInstances(const QVectorscene()->addItem(rootGraphicsObject); m_declarativeView->setSceneRect(rootGraphicsObject->boundingRect()); } - } foreach (QDeclarativeContext* context, allSubContextsForObject(instance.internalObject())) @@ -331,11 +337,12 @@ void NodeInstanceServer::completeComponent(const CompleteComponentCommand &comma startRenderTimer(); } -void NodeInstanceServer::changeCustomParserSource(const ChangeCustomParserSourceCommand &command) +void NodeInstanceServer::changeNodeSource(const ChangeNodeSourceCommand &command) { if (hasInstanceForId(command.instanceId())) { ServerNodeInstance instance = instanceForId(command.instanceId()); - ; + if (instance.isValid()) + instance.setNodeSource(command.nodeSource()); } startRenderTimer(); @@ -410,6 +417,14 @@ void NodeInstanceServer::changePropertyValues(const ChangeValuesCommand &command startRenderTimer(); } +void NodeInstanceServer::changeAuxiliaryValues(const ChangeAuxiliaryCommand &command) +{ + foreach (const PropertyValueContainer &container, command.auxiliaryChanges()) { + setInstanceAuxiliaryData(container); + } + + startRenderTimer(); +} void NodeInstanceServer::changePropertyBindings(const ChangeBindingsCommand &command) { @@ -719,6 +734,16 @@ void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer } } +void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer) +{ + //instanceId() == 0: the item is root + if (auxiliaryContainer.instanceId() == 0 && (auxiliaryContainer.name() == QLatin1String("width") || + auxiliaryContainer.name() == QLatin1String("height"))) { + + setInstancePropertyVariant(auxiliaryContainer); + } +} + QUrl NodeInstanceServer::fileUrl() const { @@ -1115,32 +1140,36 @@ QList NodeInstanceServer::setupScene(const CreateSceneComman QList instanceList = createInstances(command.instances()); reparentInstances(command.reparentInstances()); - foreach(const IdContainer &container, command.ids()) { + foreach (const IdContainer &container, command.ids()) { if (hasInstanceForId(container.instanceId())) instanceForId(container.instanceId()).setId(container.id()); } - foreach(const PropertyValueContainer &container, command.valueChanges()) { + foreach (const PropertyValueContainer &container, command.valueChanges()) { if (container.isDynamic()) setInstancePropertyVariant(container); } - foreach(const PropertyValueContainer &container, command.valueChanges()) { + foreach (const PropertyValueContainer &container, command.valueChanges()) { if (!container.isDynamic()) setInstancePropertyVariant(container); } - foreach(const PropertyBindingContainer &container, command.bindingChanges()) { + foreach (const PropertyBindingContainer &container, command.bindingChanges()) { if (container.isDynamic()) setInstancePropertyBinding(container); } - foreach(const PropertyBindingContainer &container, command.bindingChanges()) { + foreach (const PropertyBindingContainer &container, command.bindingChanges()) { if (!container.isDynamic()) setInstancePropertyBinding(container); } - foreach(ServerNodeInstance instance, instanceList) + foreach (const PropertyValueContainer &container, command.auxiliaryChanges()) { + setInstanceAuxiliaryData(container); + } + + foreach (ServerNodeInstance instance, instanceList) instance.doComponentComplete(); m_declarativeView->scene()->setSceneRect(rootNodeInstance().boundingRect()); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h index b86258a3af..24f275c800 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h @@ -81,6 +81,7 @@ public: void changeFileUrl(const ChangeFileUrlCommand &command); void changePropertyValues(const ChangeValuesCommand &command); void changePropertyBindings(const ChangeBindingsCommand &command); + void changeAuxiliaryValues(const ChangeAuxiliaryCommand &command); void changeIds(const ChangeIdsCommand &command); void createScene(const CreateSceneCommand &command); void clearScene(const ClearSceneCommand &command); @@ -90,7 +91,7 @@ public: void changeState(const ChangeStateCommand &command); void addImport(const AddImportCommand &command); void completeComponent(const CompleteComponentCommand &command); - void changeCustomParserSource(const ChangeCustomParserSourceCommand &command); + void changeNodeSource(const ChangeNodeSourceCommand &command); ServerNodeInstance instanceForId(qint32 id) const; bool hasInstanceForId(qint32 id) const; @@ -136,6 +137,7 @@ protected: void resetInstanceProperty(const PropertyAbstractContainer &propertyContainer); void setInstancePropertyBinding(const PropertyBindingContainer &bindingContainer); void setInstancePropertyVariant(const PropertyValueContainer &valueContainer); + void setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer); void removeProperties(const QList &propertyList); void insertInstanceRelationship(const ServerNodeInstance &instance); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp index 65e136c1ff..166860ee32 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp @@ -41,6 +41,7 @@ #include "createscenecommand.h" #include "changevaluescommand.h" #include "changebindingscommand.h" +#include "changeauxiliarycommand.h" #include "changefileurlcommand.h" #include "removeinstancescommand.h" #include "clearscenecommand.h" @@ -50,7 +51,7 @@ #include "changestatecommand.h" #include "completecomponentcommand.h" #include "addimportcontainer.h" -#include "changecustomparsersourcecommand.h" +#include "changenodesourcecommand.h" #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" @@ -167,9 +168,11 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType("SynchronizeCommand"); qRegisterMetaTypeStreamOperators("SynchronizeCommand"); - qRegisterMetaType("ChangeCustomParserSourceCommand"); - qRegisterMetaTypeStreamOperators("ChangeCustomParserSourceCommand"); + qRegisterMetaType("ChangeNodeSourceCommand"); + qRegisterMetaTypeStreamOperators("ChangeNodeSourceCommand"); + qRegisterMetaType("ChangeAuxiliaryCommand"); + qRegisterMetaTypeStreamOperators("ChangeAuxiliaryCommand"); } } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 8e01df57bf..ad41ccd34a 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -46,6 +46,7 @@ #include "createscenecommand.h" #include "changevaluescommand.h" #include "changebindingscommand.h" +#include "changeauxiliarycommand.h" #include "changefileurlcommand.h" #include "removeinstancescommand.h" #include "clearscenecommand.h" @@ -55,7 +56,7 @@ #include "changestatecommand.h" #include "addimportcommand.h" #include "completecomponentcommand.h" -#include "changecustomparsersourcecommand.h" +#include "changenodesourcecommand.h" #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" @@ -428,6 +429,11 @@ void NodeInstanceServerProxy::changePropertyValues(const ChangeValuesCommand &co writeCommand(QVariant::fromValue(command)); } +void NodeInstanceServerProxy::changeAuxiliaryValues(const ChangeAuxiliaryCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} + void NodeInstanceServerProxy::reparentInstances(const ReparentInstancesCommand &command) { writeCommand(QVariant::fromValue(command)); @@ -453,7 +459,7 @@ void NodeInstanceServerProxy::completeComponent(const CompleteComponentCommand & writeCommand(QVariant::fromValue(command)); } -void NodeInstanceServerProxy::changeCustomParserSource(const ChangeCustomParserSourceCommand &command) +void NodeInstanceServerProxy::changeNodeSource(const ChangeNodeSourceCommand &command) { writeCommand(QVariant::fromValue(command)); } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h index a6a13edfe2..0a65d3d3f0 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h @@ -65,12 +65,13 @@ public: void removeProperties(const RemovePropertiesCommand &command); void changePropertyBindings(const ChangeBindingsCommand &command); void changePropertyValues(const ChangeValuesCommand &command); + void changeAuxiliaryValues(const ChangeAuxiliaryCommand &command); void reparentInstances(const ReparentInstancesCommand &command); void changeIds(const ChangeIdsCommand &command); void changeState(const ChangeStateCommand &command); void addImport(const AddImportCommand &command); void completeComponent(const CompleteComponentCommand &command); - void changeCustomParserSource(const ChangeCustomParserSourceCommand &command); + void changeNodeSource(const ChangeNodeSourceCommand &command); protected: void writeCommand(const QVariant &command); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 908868f426..90fd26ecce 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -64,9 +64,10 @@ #include "changefileurlcommand.h" #include "reparentinstancescommand.h" #include "changevaluescommand.h" +#include "changeauxiliarycommand.h" #include "changebindingscommand.h" #include "changeidscommand.h" -#include "changecustomparsersourcecommand.h" +#include "changenodesourcecommand.h" #include "removeinstancescommand.h" #include "removepropertiescommand.h" #include "valueschangedcommand.h" @@ -151,8 +152,13 @@ bool isSkippedRootNode(const ModelNode &node) } -bool isSkippedNode(const ModelNode &) +bool isSkippedNode(const ModelNode &node) { + static QStringList skipList = QStringList() << "QtQuick.XmlRole" << "Qt.XmlRole" << "QtQuick.ListElement" << "Qt.ListElement"; + + if (skipList.contains(node.type())) + return true; + return false; } @@ -485,8 +491,8 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, const QString QVariant value = data; if (value.isValid()) { PropertyValueContainer container(instance.instanceId(), name, value, QString()); - ChangeValuesCommand changeValueCommand(QVector() << container); - nodeInstanceServer()->changePropertyValues(changeValueCommand); + ChangeAuxiliaryCommand changeAuxiliaryCommand(QVector() << container); + nodeInstanceServer()->changeAuxiliaryValues(changeAuxiliaryCommand); } else { if (node.hasVariantProperty(name)) { PropertyValueContainer container(instance.instanceId(), name, node.variantProperty(name).value(), QString()); @@ -500,20 +506,6 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, const QString } } } - if (name == "__component_data" || name == "__model_data") { - qDebug() << "__component_data"; - qDebug() << "signal"; - qDebug() << data; - if (hasInstanceForNode(node)) { - NodeInstance instance = instanceForNode(node); - QVariant value = data; - if (value.isValid()) { - PropertyValueContainer container(instance.instanceId(), name, value, QString()); - ChangeValuesCommand changeValueCommand(QVector() << container); - nodeInstanceServer()->changePropertyValues(changeValueCommand); - } - } - } } void NodeInstanceView::customNotification(const AbstractView *view, const QString &identifier, const QList &, const QList &) @@ -522,12 +514,12 @@ void NodeInstanceView::customNotification(const AbstractView *view, const QStrin restartProcess(); } -void NodeInstanceView::customParserSourceChanged(const ModelNode &node, const QString & newCustomParserSource) +void NodeInstanceView::nodeSourceChanged(const ModelNode &node, const QString & newNodeSource) { if (hasInstanceForNode(node)) { NodeInstance instance = instanceForNode(node); - ChangeCustomParserSourceCommand changeCustomParserSourceCommand(instance.instanceId(), newCustomParserSource); - nodeInstanceServer()->changeCustomParserSource(changeCustomParserSourceCommand); + ChangeNodeSourceCommand changeNodeSourceCommand(instance.instanceId(), newNodeSource); + nodeInstanceServer()->changeNodeSource(changeNodeSourceCommand); } } @@ -756,16 +748,34 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() QList variantPropertyList; QList bindingPropertyList; + QVector auxiliaryContainerVector; foreach (const ModelNode &node, nodeList) { variantPropertyList.append(node.variantProperties()); bindingPropertyList.append(node.bindingProperties()); + if (node.isValid() && hasInstanceForNode(node)) { + NodeInstance instance = instanceForNode(node); + QHashIterator auxiliaryIterator(node.auxiliaryData()); + while (auxiliaryIterator.hasNext()) { + auxiliaryIterator.next(); + PropertyValueContainer container(instance.instanceId(), auxiliaryIterator.key(), auxiliaryIterator.value(), QString()); + auxiliaryContainerVector.append(container); + } + } } + QVector instanceContainerList; foreach(const NodeInstance &instance, instanceList) { - InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), - instance.modelNode().minorVersion(), instance.modelNode().metaInfo().componentFileName(), - instance.modelNode().customParserSource()); + InstanceContainer::NodeSourceType nodeSourceType = static_cast(instance.modelNode().nodeSourceType()); + InstanceContainer container(instance.instanceId(), + instance.modelNode().type(), + instance.modelNode().majorVersion(), + instance.modelNode().minorVersion(), + instance.modelNode().metaInfo().componentFileName(), + instance.modelNode().nodeSource(), + nodeSourceType + ); + instanceContainerList.append(container); } @@ -791,15 +801,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() foreach(const VariantProperty &property, variantPropertyList) { ModelNode node = property.parentModelNode(); if (node.isValid() && hasInstanceForNode(node)) { - QVariant value = property.value(); - if (node.isRootNode() - && (property.name() == "width" || property.name() == "height") - && node.hasAuxiliaryData(property.name()) - && node.auxiliaryData(property.name()).isValid()) - value = node.auxiliaryData(property.name()); - NodeInstance instance = instanceForNode(node); - PropertyValueContainer container(instance.instanceId(), property.name(), value, property.dynamicTypeName()); + PropertyValueContainer container(instance.instanceId(), property.name(), property.value(), property.dynamicTypeName()); valueContainerList.append(container); } } @@ -808,30 +811,12 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() foreach(const BindingProperty &property, bindingPropertyList) { ModelNode node = property.parentModelNode(); if (node.isValid() && hasInstanceForNode(node)) { - if (node.isRootNode() - && (property.name() == "width" || property.name() == "height") - && node.hasAuxiliaryData(property.name()) - && node.auxiliaryData(property.name()).isValid()) - continue; - NodeInstance instance = instanceForNode(node); PropertyBindingContainer container(instance.instanceId(), property.name(), property.expression(), property.dynamicTypeName()); bindingContainerList.append(container); } } - foreach (const ModelNode &node, nodeList) { - if (node.isValid() && node.hasAuxiliaryData("__component_data")) { - NodeInstance instance = instanceForNode(node); - PropertyValueContainer container(instance.instanceId(), "__component_data", node.auxiliaryData("__component_data"), QString()); - valueContainerList.append(container); - } if (node.isValid() && node.hasAuxiliaryData("__model_data")) { - NodeInstance instance = instanceForNode(node); - PropertyValueContainer container(instance.instanceId(), "__model_data", node.auxiliaryData("__model_data"), QString()); - valueContainerList.append(container); - } - } - QVector importVector; foreach(const Import &import, model()->imports()) importVector.append(AddImportContainer(import.url(), import.file(), import.version(), import.alias(), import.importPaths())); @@ -841,6 +826,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() idContainerList, valueContainerList, bindingContainerList, + auxiliaryContainerVector, importVector, model()->fileUrl()); } @@ -876,8 +862,9 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis { QVector containerList; foreach(const NodeInstance &instance, instanceList) { + InstanceContainer::NodeSourceType nodeSourceType = static_cast(instance.modelNode().nodeSourceType()); InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(), - instance.modelNode().metaInfo().componentFileName(), instance.modelNode().customParserSource()); + instance.modelNode().metaInfo().componentFileName(), instance.modelNode().nodeSource(), nodeSourceType); containerList.append(container); } diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp index 1a033dbb17..49f0830e58 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp @@ -620,6 +620,10 @@ QList ObjectNodeInstance::stateInstances() const return QList(); } +void ObjectNodeInstance::setNodeSource(const QString &source) +{ +} + void ObjectNodeInstance::setDeleteHeldInstance(bool deleteInstance) { m_deleteHeldInstance = deleteInstance; @@ -737,8 +741,34 @@ void tweakObjects(QObject *object) } } +QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context) +{ + QDeclarativeComponent *component = new QDeclarativeComponent(context->engine()); + + QByteArray importArray; + + foreach (const QString &import, imports) { + importArray.append(import.toUtf8()); + } + + QByteArray data(nodeSource.toUtf8()); + + data.prepend(importArray); + + component->setData(data, context->baseUrl().resolved(QUrl("createComponent.qml"))); + + QObject *object = component; + tweakObjects(object); + + if (object && context) + QDeclarativeEngine::setContextForObject(object, context); + + QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::CppOwnership); + + return object; +} -static QObject *createComponent(const QString &componentPath, QDeclarativeContext *context) +QObject *ObjectNodeInstance::createComponent(const QString &componentPath, QDeclarativeContext *context) { QDeclarativeComponent component(context->engine(), QUrl::fromLocalFile(componentPath)); QObject *object = component.beginCreate(context); @@ -751,10 +781,12 @@ static QObject *createComponent(const QString &componentPath, QDeclarativeContex qDebug() << error; } + QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::CppOwnership); + return object; } -static QObject *createCustomParserObject(const QString &customParserSource, QStringList imports, QDeclarativeContext *context) +QObject *ObjectNodeInstance::createCustomParserObject(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context) { QDeclarativeComponent component(context->engine()); @@ -763,7 +795,7 @@ static QObject *createCustomParserObject(const QString &customParserSource, QStr importArray.append(import.toUtf8()); } - QByteArray data(customParserSource.toUtf8()); + QByteArray data(nodeSource.toUtf8()); data.prepend(importArray); @@ -773,11 +805,12 @@ static QObject *createCustomParserObject(const QString &customParserSource, QStr tweakObjects(object); component.completeCreate(); - return object; + QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::CppOwnership); + return object; } -static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context) +QObject *ObjectNodeInstance::createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context) { QObject *object = 0; QDeclarativeType *type = QDeclarativeMetaType::qmlType(typeName.toUtf8(), majorNumber, minorNumber); @@ -798,20 +831,6 @@ static QObject *createPrimitive(const QString &typeName, int majorNumber, int mi if (object && context) QDeclarativeEngine::setContextForObject(object, context); - return object; -} - -QObject* ObjectNodeInstance::createObject(const QString &typeName, int majorNumber, int minorNumber, const QString &componentPath, const QString &customParserSource, NodeInstanceServer* nodeInstanceServer, QDeclarativeContext *context) -{ - QObject *object = 0; - if (componentPath.isEmpty() && customParserSource.isEmpty()) { - object = createPrimitive(typeName, majorNumber, minorNumber, context); - } else if (componentPath.isEmpty()) { - object = createCustomParserObject(customParserSource, nodeInstanceServer->imports(), context); - } else { - object = createComponent(componentPath, context); - } - QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::CppOwnership); return object; diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h index a01989fb60..69d2f1a26f 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h @@ -77,7 +77,10 @@ public: //void setModelNode(const ModelNode &node); static Pointer create(QObject *objectToBeWrapped); - static QObject* createObject(const QString &typeName, int majorNumber, int minorNumber, const QString &componentPath, const QString &customParserSource, NodeInstanceServer* nodeInstanceServer, QDeclarativeContext *context); + static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context); + static QObject *createCustomParserObject(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context); + static QObject *createComponent(const QString &componentPath, QDeclarativeContext *context); + static QObject *createComponentWrap(const QString &nodeSource, const QStringList &imports, QDeclarativeContext *context); void setInstanceId(qint32 id); qint32 instanceId() const; @@ -175,6 +178,8 @@ public: virtual QList stateInstances() const; + virtual void setNodeSource(const QString &source); + protected: void doResetProperty(const QString &propertyName); void removeFromOldProperty(QObject *object, QObject *oldParent, const QString &oldParentProperty); diff --git a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp index b9f2b4eeb0..1436a357d6 100644 --- a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp @@ -147,6 +147,11 @@ bool ServerNodeInstance::isSubclassOf(QObject *object, const QByteArray &superTy return false; } +void ServerNodeInstance::setNodeSource(const QString &source) +{ + m_nodeInstance->setNodeSource(source); +} + bool ServerNodeInstance::isSubclassOf(const QString &superTypeName) const { return isSubclassOf(internalObject(), superTypeName.toUtf8()); @@ -189,16 +194,21 @@ Internal::ObjectNodeInstance::Pointer ServerNodeInstance::createInstance(QObject return instance; } -ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceServer, const InstanceContainer &instanceContainer) +ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceServer, const InstanceContainer &instanceContainer, ComponentWrap componentWrap) { Q_ASSERT(instanceContainer.instanceId() != -1); Q_ASSERT(nodeInstanceServer); - QDeclarativeContext *context = nodeInstanceServer->context(); - - QObject *object = Internal::ObjectNodeInstance::createObject(instanceContainer.type(), instanceContainer.majorNumber(), - instanceContainer.minorNumber(), instanceContainer.componentPath(), - instanceContainer.customParserSource(), nodeInstanceServer, context); + QObject *object = 0; + if (componentWrap == WrapAsComponent) { + object = Internal::ObjectNodeInstance::createComponentWrap(instanceContainer.nodeSource(), nodeInstanceServer->imports(), nodeInstanceServer->context()); + } else if (!instanceContainer.nodeSource().isEmpty()) { + object = Internal::ObjectNodeInstance::createCustomParserObject(instanceContainer.nodeSource(), nodeInstanceServer->imports(), nodeInstanceServer->context()); + } else if (!instanceContainer.componentPath().isEmpty()) { + object = Internal::ObjectNodeInstance::createComponent(instanceContainer.componentPath(), nodeInstanceServer->context()); + } else { + object = Internal::ObjectNodeInstance::createPrimitive(instanceContainer.type(), instanceContainer.majorNumber(), instanceContainer.minorNumber(), nodeInstanceServer->context()); + } ServerNodeInstance instance(createInstance(object)); @@ -213,7 +223,6 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe return instance; } - void ServerNodeInstance::reparent(const ServerNodeInstance &oldParentInstance, const QString &oldParentProperty, const ServerNodeInstance &newParentInstance, const QString &newParentProperty) { m_nodeInstance->reparent(oldParentInstance.m_nodeInstance, oldParentProperty, newParentInstance.m_nodeInstance, newParentProperty); diff --git a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h index 16c3cc6f98..eb0f04d0b5 100644 --- a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.h @@ -79,6 +79,11 @@ class CORESHARED_EXPORT ServerNodeInstance friend class QmlDesigner::Internal::QmlStateNodeInstance; public: + enum ComponentWrap { + WrapAsComponent, + DoNotWrapAsComponent + }; + ServerNodeInstance(); ~ServerNodeInstance(); ServerNodeInstance(const ServerNodeInstance &other); @@ -168,7 +173,7 @@ private: // functions bool updateStateBinding(const ServerNodeInstance &target, const QString &propertyName, const QString &expression); bool resetStateProperty(const ServerNodeInstance &target, const QString &propertyName, const QVariant &resetValue); - static ServerNodeInstance create(NodeInstanceServer *nodeInstanceServer, const InstanceContainer &instanceContainer); + static ServerNodeInstance create(NodeInstanceServer *nodeInstanceServer, const InstanceContainer &instanceContainer, ComponentWrap componentWrap); void setDeleteHeldInstance(bool deleteInstance); void reparent(const ServerNodeInstance &oldParentInstance, const QString &oldParentProperty, const ServerNodeInstance &newParentInstance, const QString &newParentProperty); @@ -183,6 +188,8 @@ private: // functions static bool isSubclassOf(QObject *object, const QByteArray &superTypeName); + void setNodeSource(const QString &source); + QObject *internalObject() const; // should be not used outside of the nodeinstances!!!! diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index f3b64acce7..a8d5ad30dd 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -302,7 +302,9 @@ public: QString defaultPropertyName() const { - return m_defaultPropertyName; + if (!m_defaultPropertyName.isEmpty()) + return m_defaultPropertyName; + return QLatin1String("data"); } QString propertyType(const QString &propertyName) const; diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 073aeab9e2..882816d41f 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -81,9 +81,11 @@ ModelNode AbstractView::createModelNode(const QString &typeString, int majorVersion, int minorVersion, const QList > &propertyList, - const QString &customParserSource) + const QList > &auxPropertyList, + const QString &nodeSource, + ModelNode::NodeSourceType nodeSourceType) { - return ModelNode(model()->m_d->createNode(typeString, majorVersion, minorVersion, propertyList, customParserSource), model(), this); + return ModelNode(model()->m_d->createNode(typeString, majorVersion, minorVersion, propertyList, auxPropertyList, nodeSource, nodeSourceType), model(), this); } diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 87c5b26b21..1aec66f943 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -184,6 +184,11 @@ bool InternalNode::hasAuxiliaryData(const QString &name) const return m_auxiliaryDataHash.contains(name); } +QHash InternalNode::auxiliaryData() const +{ + return m_auxiliaryDataHash; +} + InternalProperty::Pointer InternalNode::property(const QString &name) const { return m_namePropertyHash.value(name); @@ -342,14 +347,24 @@ qint32 InternalNode::internalId() const return m_internalId; } -void InternalNode::setCustomParserSource(const QString &customParserSource) +void InternalNode::setNodeSource(const QString &nodeSource) +{ + m_nodeSource = nodeSource; +} + +QString InternalNode::nodeSource() const +{ + return m_nodeSource; +} + +int InternalNode::nodeSourceType() const { - m_customParserSource = customParserSource; + return m_nodeSourceType; } -QString InternalNode::customParserSource() const +void InternalNode::setNodeSourceType(int i) { - return m_customParserSource; + m_nodeSourceType = i; } } diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 869a3aa2ed..c61e38541c 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -92,6 +92,7 @@ public: QVariant auxiliaryData(const QString &name) const; void setAuxiliaryData(const QString &name, const QVariant &data); bool hasAuxiliaryData(const QString &name) const; + QHash auxiliaryData() const; InternalProperty::Pointer property(const QString &name) const; InternalBindingProperty::Pointer bindingProperty(const QString &name) const; @@ -121,8 +122,11 @@ public: qint32 internalId() const; - void setCustomParserSource(const QString&); - QString customParserSource() const; + void setNodeSource(const QString&); + QString nodeSource() const; + + int nodeSourceType() const; + void setNodeSourceType(int i); protected: Pointer internalPointer() const; @@ -148,7 +152,8 @@ private: QHash m_namePropertyHash; QStringList m_scriptFunctionList; - QString m_customParserSource; + QString m_nodeSource; + int m_nodeSourceType; }; uint qHash(const InternalNodePointer& node); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index e0f957afb2..03616fa06a 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -94,7 +94,7 @@ ModelPrivate::ModelPrivate(Model *model) : m_writeLock(false), m_internalIdCounter(1) { - m_rootInternalNode = createNode("QtQuick/Item", 1, 0, PropertyListType(), QString(), true); + m_rootInternalNode = createNode("QtQuick/Item", 1, 0, PropertyListType(), PropertyListType(), QString(), ModelNode::NoSource,true); } ModelPrivate::~ModelPrivate() @@ -202,7 +202,9 @@ InternalNode::Pointer ModelPrivate::createNode(const QString &typeString, int majorVersion, int minorVersion, const QList > &propertyList, - const QString &customParserSource, + const QList > &auxPropertyList, + const QString &nodeSource, + ModelNode::NodeSourceType nodeSourceType, bool isRootNode) { if (typeString.isEmpty()) @@ -214,6 +216,7 @@ InternalNode::Pointer ModelPrivate::createNode(const QString &typeString, internalId = m_internalIdCounter++; InternalNode::Pointer newInternalNodePointer = InternalNode::create(typeString, majorVersion, minorVersion, internalId); + newInternalNodePointer->setNodeSourceType(nodeSourceType); typedef QPair PropertyPair; @@ -222,11 +225,15 @@ InternalNode::Pointer ModelPrivate::createNode(const QString &typeString, newInternalNodePointer->variantProperty(propertyPair.first)->setValue(propertyPair.second); } + foreach (const PropertyPair &propertyPair, auxPropertyList) { + newInternalNodePointer->setAuxiliaryData(propertyPair.first, propertyPair.second); + } + m_nodeSet.insert(newInternalNodePointer); m_internalIdNodeHash.insert(newInternalNodePointer->internalId(), newInternalNodePointer); - if (!customParserSource.isNull()) - newInternalNodePointer->setCustomParserSource(customParserSource); + if (!nodeSource.isNull()) + newInternalNodePointer->setNodeSource(nodeSource); notifyNodeCreated(newInternalNodePointer); @@ -359,7 +366,7 @@ void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &interna } } -void ModelPrivate::notifyCustomParserSourceChanged(const InternalNodePointer &internalNode, const QString &newCustomParserSource) +void ModelPrivate::notifyNodeSourceChanged(const InternalNodePointer &internalNode, const QString &newNodeSource) { bool resetModel = false; QString description; @@ -367,7 +374,7 @@ void ModelPrivate::notifyCustomParserSourceChanged(const InternalNodePointer &in try { if (rewriterView()) { ModelNode node(internalNode, model(), rewriterView()); - rewriterView()->customParserSourceChanged(node, newCustomParserSource); + rewriterView()->nodeSourceChanged(node, newNodeSource); } } catch (RewritingException &e) { description = e.description(); @@ -377,13 +384,13 @@ void ModelPrivate::notifyCustomParserSourceChanged(const InternalNodePointer &in foreach (const QWeakPointer &view, m_viewList) { Q_ASSERT(view != 0); ModelNode node(internalNode, model(), view.data()); - view->customParserSourceChanged(node, newCustomParserSource); + view->nodeSourceChanged(node, newNodeSource); } if (nodeInstanceView()) { ModelNode node(internalNode, model(), nodeInstanceView()); - nodeInstanceView()->customParserSourceChanged(node, newCustomParserSource); + nodeInstanceView()->nodeSourceChanged(node, newNodeSource); } if (resetModel) { @@ -1492,10 +1499,10 @@ void ModelPrivate::setScriptFunctions(const InternalNode::Pointer &internalNode, notifyScriptFunctionsChanged(internalNode, scriptFunctionList); } -void ModelPrivate::setCustomParserSource(const InternalNodePointer &internalNode, const QString &customParserSource) +void ModelPrivate::setNodeSource(const InternalNodePointer &internalNode, const QString &nodeSource) { - internalNode->setCustomParserSource(customParserSource); - notifyCustomParserSourceChanged(internalNode, customParserSource); + internalNode->setNodeSource(nodeSource); + notifyNodeSourceChanged(internalNode, nodeSource); } void ModelPrivate::changeNodeOrder(const InternalNode::Pointer &internalParentNode, const QString &listPropertyName, int from, int to) diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 71c999e27c..23a626a45c 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -105,7 +105,9 @@ public: int majorVersion, int minorVersion, const QList > &propertyList, - const QString &customParserSource, + const QList > &auxPropertyList, + const QString &nodeSource, + ModelNode::NodeSourceType nodeSourceType, bool isRootNode = false); @@ -143,7 +145,7 @@ public: void notifyNodeOrderChanged(const InternalNodeListPropertyPointer &internalListPropertyPointer, const InternalNodePointer &internalNodePointer, int oldIndex); void notifyAuxiliaryDataChanged(const InternalNodePointer &internalNode, const QString &name, const QVariant &data); - void notifyCustomParserSourceChanged(const InternalNodePointer &internalNode, const QString &newCustomParserSource); + void notifyNodeSourceChanged(const InternalNodePointer &internalNode, const QString &newNodeSource); void notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); @@ -196,7 +198,7 @@ public: void clearParent(const InternalNodePointer &internalNode); void changeRootNodeType(const QString &type, int majorVersion, int minorVersion); void setScriptFunctions(const InternalNodePointer &internalNode, const QStringList &scriptFunctionList); - void setCustomParserSource(const InternalNodePointer &internalNode, const QString &customParserSource); + void setNodeSource(const InternalNodePointer &internalNode, const QString &nodeSource); InternalNodePointer nodeForId(const QString &id) const; bool hasId(const QString &id) const; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 5c1224857e..ab16ec6e19 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -918,6 +918,15 @@ bool ModelNode::hasAuxiliaryData(const QString &name) const return internalNode()->hasAuxiliaryData(name); } +QHash ModelNode::auxiliaryData() const +{ + if (!isValid()) { + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + } + + return internalNode()->auxiliaryData(); +} + void ModelNode::setScriptFunctions(const QStringList &scriptFunctionList) { model()->m_d->setScriptFunctions(internalNode(), scriptFunctionList); @@ -936,7 +945,7 @@ qint32 ModelNode::internalId() const return m_internalNode->internalId(); } -void ModelNode::setCustomParserSource(const QString &newCustomParserSource) +void ModelNode::setNodeSource(const QString &newNodeSource) { Internal::WriteLocker locker(m_model.data()); @@ -945,19 +954,19 @@ void ModelNode::setCustomParserSource(const QString &newCustomParserSource) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - if (internalNode()->customParserSource() == newCustomParserSource) + if (internalNode()->nodeSource() == newNodeSource) return; - m_model.data()->m_d->setCustomParserSource(internalNode(), newCustomParserSource); + m_model.data()->m_d->setNodeSource(internalNode(), newNodeSource); } -QString ModelNode::customParserSource() const +QString ModelNode::nodeSource() const { if (!isValid()) { throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - return internalNode()->customParserSource(); + return internalNode()->nodeSource(); } QString ModelNode::convertTypeToImportAlias() const @@ -972,4 +981,14 @@ QString ModelNode::convertTypeToImportAlias() const return type(); } +ModelNode::NodeSourceType ModelNode::nodeSourceType() const +{ + if (!isValid()) { + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + } + + return static_cast(internalNode()->nodeSourceType()); + +} + } diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 876f822a15..b34edbb42b 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -384,7 +384,7 @@ void QmlModelView::importsChanged(const QList &/*addedImports*/, const Q } -void QmlModelView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/) +void QmlModelView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { } diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 6a65b098c1..db6fb1ec0c 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -407,7 +407,7 @@ void RewriterView::instancesChildrenChanged(const QVector &/*nodeList } -void RewriterView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/) +void RewriterView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/) { } @@ -713,4 +713,10 @@ void RewriterView::qmlTextChanged() } } +void RewriterView::delayedSetup() +{ + if (m_textToModelMerger) + m_textToModelMerger->delayedSetup(); +} + } //QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index a5367d49ff..16026a17a9 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -294,6 +294,30 @@ static bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &pro isComponentType(property.parentModelNode().metaInfo().propertyTypeName(property.name())); } +static inline QString extractComponentFromQml(const QString &source) +{ + if (source.isEmpty()) + return QString(); + + QString result; + if (source.contains("Component")) { //explicit component + QmlDesigner::FirstDefinitionFinder firstDefinitionFinder(source); + int offset = firstDefinitionFinder(0); + if (offset < 0) { + return QString(); //No object definition found + } + QmlDesigner::ObjectLengthCalculator objectLengthCalculator; + unsigned length; + if (objectLengthCalculator(source, offset, length)) { + result = source.mid(offset, length); + } else { + result = source; + } + } else { + result = source; //implicit component + } + return result; +} } // anonymous namespace @@ -625,11 +649,13 @@ static inline bool equals(const QVariant &a, const QVariant &b) return a == b; } -TextToModelMerger::TextToModelMerger(RewriterView *reWriterView): +TextToModelMerger::TextToModelMerger(RewriterView *reWriterView) : m_rewriterView(reWriterView), m_isActive(false) { Q_ASSERT(reWriterView); + m_setupTimer.setSingleShot(true); + RewriterView::connect(&m_setupTimer, SIGNAL(timeout()), reWriterView, SLOT(delayedSetup())); } void TextToModelMerger::setActive(bool active) @@ -793,27 +819,26 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, return; } - const QString typeNameFixedForImplicitComponents = modelNode.parentProperty().isValid() && - propertyIsComponentType(modelNode.parentProperty(), typeName) ? - QLatin1String("QtQuick.Component") : typeName; + bool isImplicitComponent = modelNode.parentProperty().isValid() && propertyIsComponentType(modelNode.parentProperty(), typeName); - if ((modelNode.parentProperty().isValid() || modelNode.isRootNode()) && modelNode.type() != typeNameFixedForImplicitComponents //If there is no valid parentProperty + + if (modelNode.type() != typeName //If there is no valid parentProperty //the node has just been created. The type is correct then. /*|| modelNode.majorVersion() != domObject.objectTypeMajorVersion() || modelNode.minorVersion() != domObject.objectTypeMinorVersion()*/) { const bool isRootNode = m_rewriterView->rootModelNode() == modelNode; - differenceHandler.typeDiffers(isRootNode, modelNode, typeNameFixedForImplicitComponents, + differenceHandler.typeDiffers(isRootNode, modelNode, typeName, majorVersion, minorVersion, astNode, context); if (!isRootNode) return; // the difference handler will create a new node, so we're done. } - if (isComponentType(typeNameFixedForImplicitComponents)) - setupComponent(modelNode); + if (isComponentType(typeName) || isImplicitComponent) + setupComponentDelayed(modelNode, !differenceHandler.isValidator()); if (isCustomParserType(typeName)) - setupCustomParserNode(modelNode); + setupCustomParserNodeDelayed(modelNode, !differenceHandler.isValidator()); context->enterScope(astNode); @@ -906,12 +931,10 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, } if (!defaultPropertyItems.isEmpty()) { + if (isComponentType(modelNode.type())) + setupComponentDelayed(modelNode, !differenceHandler.isValidator()); if (defaultPropertyName.isEmpty()) { - if (!isComponentType(modelNode.type())) { - qWarning() << "No default property for node type" << modelNode.type() << ", ignoring child items."; - } else { - setupComponent(modelNode); - } + qWarning() << "No default property for node type" << modelNode.type() << ", ignoring child items."; } else { AbstractProperty modelProperty = modelNode.property(defaultPropertyName); if (modelProperty.isNodeListProperty()) { @@ -1136,22 +1159,43 @@ void TextToModelMerger::syncNodeListProperty(NodeListProperty &modelListProperty ModelNode TextToModelMerger::createModelNode(const QString &typeName, int majorVersion, int minorVersion, + bool isImplicitComponent, UiObjectMember *astNode, ReadingContext *context, DifferenceHandler &differenceHandler) { - QString customParserSource; + QString nodeSource; if (isCustomParserType(typeName)) - customParserSource = textAt(context->doc(), + nodeSource = textAt(context->doc(), astNode->firstSourceLocation(), astNode->lastSourceLocation()); + + if (isComponentType(typeName) || isImplicitComponent) { + QString componentSource = extractComponentFromQml(textAt(context->doc(), + astNode->firstSourceLocation(), + astNode->lastSourceLocation())); + + + nodeSource = componentSource; + } + + ModelNode::NodeSourceType nodeSourceType = ModelNode::NoSource; + + if (isComponentType(typeName) || isImplicitComponent) + nodeSourceType = ModelNode::ComponentSource; + else if (isCustomParserType(typeName)) + nodeSourceType = ModelNode::CustomParserSource; + ModelNode newNode = m_rewriterView->createModelNode(typeName, majorVersion, minorVersion, PropertyListType(), - customParserSource); + PropertyListType(), + nodeSource, + nodeSourceType); + syncNode(newNode, astNode, context, differenceHandler); return newNode; } @@ -1390,9 +1434,10 @@ void ModelAmender::shouldBeNodeProperty(AbstractProperty &modelProperty, const bool propertyTakesComponent = propertyIsComponentType(newNodeProperty, typeName); - const ModelNode &newNode = m_merger->createModelNode(propertyTakesComponent ? QLatin1String("QtQuick.Component") : typeName, + const ModelNode &newNode = m_merger->createModelNode(typeName, majorVersion, minorVersion, + propertyTakesComponent, astNode, context, *this); @@ -1400,7 +1445,7 @@ void ModelAmender::shouldBeNodeProperty(AbstractProperty &modelProperty, newNodeProperty.setModelNode(newNode); if (propertyTakesComponent) - m_merger->setupComponent(newNode); + m_merger->setupComponentDelayed(newNode, true); } @@ -1439,16 +1484,17 @@ ModelNode ModelAmender::listPropertyMissingModelNode(NodeListProperty &modelProp const bool propertyTakesComponent = propertyIsComponentType(modelProperty, typeName); - const ModelNode &newNode = m_merger->createModelNode(propertyTakesComponent ? QLatin1String("QtQuick.Component") : typeName, + const ModelNode &newNode = m_merger->createModelNode(typeName, majorVersion, minorVersion, + propertyTakesComponent, arrayMember, context, *this); if (propertyTakesComponent) - m_merger->setupComponent(newNode); + m_merger->setupComponentDelayed(newNode, true); if (modelProperty.isDefaultProperty() || isComponentType(modelProperty.parentModelNode().type())) { //In the default property case we do some magic if (modelProperty.isNodeListProperty()) { @@ -1471,6 +1517,8 @@ void ModelAmender::typeDiffers(bool isRootNode, QmlJS::AST::UiObjectMember *astNode, ReadingContext *context) { + const bool propertyTakesComponent = propertyIsComponentType(modelNode.parentProperty(), typeName); + if (isRootNode) { modelNode.view()->changeRootNodeType(typeName, majorVersion, minorVersion); } else { @@ -1486,6 +1534,7 @@ void ModelAmender::typeDiffers(bool isRootNode, const ModelNode &newNode = m_merger->createModelNode(typeName, majorVersion, minorVersion, + propertyTakesComponent, astNode, context, *this); @@ -1510,50 +1559,70 @@ void ModelAmender::idsDiffer(ModelNode &modelNode, const QString &qmlId) void TextToModelMerger::setupComponent(const ModelNode &node) { - Q_ASSERT(isComponentType(node.type())); + if (!node.isValid()) + return; QString componentText = m_rewriterView->extractText(QList() << node).value(node); if (componentText.isEmpty()) return; - QString result; - if (componentText.contains("Component")) { //explicit component - FirstDefinitionFinder firstDefinitionFinder(componentText); - int offset = firstDefinitionFinder(0); - if (offset < 0) { - node.setAuxiliaryData("__component_data", QLatin1String("")); - return; //No object definition found - } - ObjectLengthCalculator objectLengthCalculator; - unsigned length; - if (objectLengthCalculator(componentText, offset, length)) { - result = componentText.mid(offset, length); - } else { - result = componentText; - } - } else { - result = componentText; //implicit component + QString result = extractComponentFromQml(componentText); + + if (result.isEmpty()) { + return; //No object definition found } - if (node.hasAuxiliaryData("__component_data") - && node.auxiliaryData("__component_data").toString() == result) - return; + if (node.nodeSource() != result) + ModelNode(node).setNodeSource(result); +} - node.setAuxiliaryData("__component_data", result); +void TextToModelMerger::setupComponentDelayed(const ModelNode &node, bool synchron) +{ + if (synchron) { + setupComponent(node); + } else { + m_setupComponentList.insert(node); + m_setupTimer.start(); + } } void TextToModelMerger::setupCustomParserNode(const ModelNode &node) { - Q_ASSERT(isCustomParserType(node.type())); + if (!node.isValid()) + return; QString modelText = m_rewriterView->extractText(QList() << node).value(node); if (modelText.isEmpty()) return; - if (node.customParserSource() != modelText) - ModelNode(node).setCustomParserSource(modelText); + if (node.nodeSource() != modelText) + ModelNode(node).setNodeSource(modelText); + +} + +void TextToModelMerger::setupCustomParserNodeDelayed(const ModelNode &node, bool synchron) +{ + Q_ASSERT(isCustomParserType(node.type())); + + if (synchron) { + setupCustomParserNode(node); + } else { + m_setupCustomParserList.insert(node); + m_setupTimer.start(); + } +} + +void TextToModelMerger::delayedSetup() +{ + foreach (const ModelNode node, m_setupComponentList) + setupComponent(node); + + foreach (const ModelNode node, m_setupCustomParserList) + setupCustomParserNode(node); + m_setupCustomParserList.clear(); + m_setupComponentList.clear(); } QString TextToModelMerger::textAt(const Document::Ptr &doc, diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index a6dedddb8f..cdb6eaaa40 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -43,6 +43,7 @@ #include #include +#include namespace QmlDesigner { @@ -112,6 +113,7 @@ public: ModelNode createModelNode(const QString &typeName, int majorVersion, int minorVersion, + bool isImplicitComponent, QmlJS::AST::UiObjectMember *astNode, ReadingContext *context, DifferenceHandler &differenceHandler); @@ -121,10 +123,15 @@ public: ReadingContext *context, DifferenceHandler &differenceHandler); - void setupComponent(const ModelNode &node); - void setupCustomParserNode(const ModelNode &node); + void setupComponentDelayed(const ModelNode &node, bool synchron); + void setupCustomParserNodeDelayed(const ModelNode &node, bool synchron); + + void delayedSetup(); private: + void setupCustomParserNode(const ModelNode &node); + void setupComponent(const ModelNode &node); + static QString textAt(const QmlJS::Document::Ptr &doc, const QmlJS::AST::SourceLocation &location); static QString textAt(const QmlJS::Document::Ptr &doc, @@ -136,6 +143,9 @@ private: bool m_isActive; QmlJS::LookupContext::Ptr m_lookupContext; QmlJS::Document::Ptr m_document; + QTimer m_setupTimer; + QSet m_setupComponentList; + QSet m_setupCustomParserList; }; class DifferenceHandler @@ -179,6 +189,7 @@ public: ReadingContext *context) = 0; virtual void propertyAbsentFromQml(AbstractProperty &modelProperty) = 0; virtual void idsDiffer(ModelNode &modelNode, const QString &qmlId) = 0; + virtual bool isValidator() const = 0; protected: TextToModelMerger *m_merger; @@ -225,6 +236,7 @@ public: ReadingContext *context); virtual void propertyAbsentFromQml(AbstractProperty &modelProperty); virtual void idsDiffer(ModelNode &modelNode, const QString &qmlId); + virtual bool isValidator() const {return false; } }; class ModelAmender: public DifferenceHandler @@ -268,6 +280,7 @@ public: ReadingContext *context); virtual void propertyAbsentFromQml(AbstractProperty &modelProperty); virtual void idsDiffer(ModelNode &modelNode, const QString &qmlId); + virtual bool isValidator() const {return true; } }; } //Internal diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp index d8bfa2b200..ffbcc334f9 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp @@ -256,9 +256,9 @@ void ViewLogger::instancesChildrenChanged(const QVector &nodeList) m_output << time() << indent("node: ") << node << endl; } -void ViewLogger::customParserSourceChanged(const ModelNode &node, const QString & /*newCustomParserSource*/) +void ViewLogger::nodeSourceChanged(const ModelNode &node, const QString & /*newNodeSource*/) { - m_output << time() << indent("customParserSourceChanged:") << endl; + m_output << time() << indent("nodeSourceChanged:") << endl; m_output << time() << indent("node: ") << node << endl; } diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h index 228b45a0ca..cd503ea8d5 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.h +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h @@ -81,7 +81,7 @@ public: void instancesRenderImageChanged(const QVector &nodeList); void instancesPreviewImageChanged(const QVector &nodeList); void instancesChildrenChanged(const QVector &nodeList); - void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource); + void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource); void rewriterBeginTransaction(); void rewriterEndTransaction(); -- 2.11.0