aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@nokia.com>2011-06-08 17:02:03 +0200
committerMarco Bubke <marco.bubke@nokia.com>2011-06-08 17:53:11 +0200
commit7939c270bd2e1c0e06533048dc207dbe17d25450 (patch)
treebfe4c363b5c3756252d668ccbdf947e44f84fc5c
parent3d784b84ebef67a1525a0fd44f484ca68205b83c (diff)
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 <marco.bubke@nokia.com>
-rw-r--r--src/plugins/qmldesigner/components/integration/componentview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/integration/componentview.h2
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h2
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h2
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp2
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/designercore.pri6
-rw-r--r--src/plugins/qmldesigner/designercore/include/abstractview.h6
-rw-r--r--src/plugins/qmldesigner/designercore/include/modelnode.h13
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h6
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/qmlmodelview.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/rewriterview.h3
-rw-r--r--src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.cpp (renamed from src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp)22
-rw-r--r--src/plugins/qmldesigner/designercore/instances/changenodesourcecommand.h (renamed from src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h)24
-rw-r--r--src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp27
-rw-r--r--src/plugins/qmldesigner/designercore/instances/componentnodeinstance.h4
-rw-r--r--src/plugins/qmldesigner/designercore/instances/createscenecommand.cpp9
-rw-r--r--src/plugins/qmldesigner/designercore/instances/createscenecommand.h3
-rw-r--r--src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp19
-rw-r--r--src/plugins/qmldesigner/designercore/instances/instancecontainer.h18
-rw-r--r--src/plugins/qmldesigner/designercore/instances/instances.pri6
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp21
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h6
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp51
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h4
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp9
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp10
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h3
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp89
-rw-r--r--src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp57
-rw-r--r--src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h7
-rw-r--r--src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp23
-rw-r--r--src/plugins/qmldesigner/designercore/instances/servernodeinstance.h9
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp4
-rw-r--r--src/plugins/qmldesigner/designercore/model/abstractview.cpp6
-rw-r--r--src/plugins/qmldesigner/designercore/model/internalnode.cpp23
-rw-r--r--src/plugins/qmldesigner/designercore/model/internalnode_p.h11
-rw-r--r--src/plugins/qmldesigner/designercore/model/model.cpp29
-rw-r--r--src/plugins/qmldesigner/designercore/model/model_p.h8
-rw-r--r--src/plugins/qmldesigner/designercore/model/modelnode.cpp29
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/model/rewriterview.cpp8
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp161
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.h17
-rw-r--r--src/plugins/qmldesigner/designercore/model/viewlogger.cpp4
-rw-r--r--src/plugins/qmldesigner/designercore/model/viewlogger.h2
49 files changed, 520 insertions, 259 deletions
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<ModelNode> &/*nodeL
void ComponentView::instancesRenderImageChanged(const QVector<ModelNode> &/*nodeList*/) {}
void ComponentView::instancesPreviewImageChanged(const QVector<ModelNode> &/*nodeList*/) {}
void ComponentView::instancesChildrenChanged(const QVector<ModelNode> &/*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<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &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<ModelN
}
-void DesignDocumentControllerView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
+void DesignDocumentControllerView::nodeSourceChanged(const ModelNode &, const QString & /*newNodeSource*/)
{
}
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
index 07c972e773..4cb1f9d1f0 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
@@ -68,7 +68,7 @@ public:
void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &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<ModelNode> &/*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<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &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<ModelNode> &/*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<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &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<ModelNode> &nodeList) = 0;
virtual void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList) = 0;
virtual void instancesChildrenChanged(const QVector<ModelNode> &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<QString, QVariant> 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<ModelNode> &nodeList);
void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data);
void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data);
- void 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<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList);
void importsChanged(const QList<Import> &addedImports, const QList<Import> &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<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &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
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
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 <QMetaType>
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<InstanceContainer> &instanc
const QVector<IdContainer> &idVector,
const QVector<PropertyValueContainer> &valueChangeVector,
const QVector<PropertyBindingContainer> &bindingChangeVector,
+ const QVector<PropertyValueContainer> &auxiliaryChangeVector,
const QVector<AddImportContainer> &importVector,
const QUrl &fileUrl)
: m_instanceVector(instanceContainer),
@@ -50,6 +51,7 @@ CreateSceneCommand::CreateSceneCommand(const QVector<InstanceContainer> &instanc
m_idVector(idVector),
m_valueChangeVector(valueChangeVector),
m_bindingChangeVector(bindingChangeVector),
+ m_auxiliaryChangeVector(auxiliaryChangeVector),
m_importVector(importVector),
m_fileUrl(fileUrl)
{
@@ -80,6 +82,11 @@ QVector<PropertyBindingContainer> CreateSceneCommand::bindingChanges() const
return m_bindingChangeVector;
}
+QVector<PropertyValueContainer> CreateSceneCommand::auxiliaryChanges() const
+{
+ return m_auxiliaryChangeVector;
+}
+
QVector<AddImportContainer> 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<IdContainer> &idVector,
const QVector<PropertyValueContainer> &valueChangeVector,
const QVector<PropertyBindingContainer> &bindingChangeVector,
+ const QVector<PropertyValueContainer> &auxiliaryChangeVector,
const QVector<AddImportContainer> &importVector,
const QUrl &fileUrl);
@@ -65,6 +66,7 @@ public:
QVector<IdContainer> ids() const;
QVector<PropertyValueContainer> valueChanges() const;
QVector<PropertyBindingContainer> bindingChanges() const;
+ QVector<PropertyValueContainer> auxiliaryChanges() const;
QVector<AddImportContainer> imports() const;
QUrl fileUrl() const;
@@ -74,6 +76,7 @@ private:
QVector<IdContainer> m_idVector;
QVector<PropertyValueContainer> m_valueChangeVector;
QVector<PropertyBindingContainer> m_bindingChangeVector;
+ QVector<PropertyValueContainer> m_auxiliaryChangeVector;
QVector<AddImportContainer> 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<NodeSourceType>(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<CreateInstancesCommand>());
@@ -303,6 +310,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
changePropertyBindings(command.value<ChangeBindingsCommand>());
else if (command.userType() == changeValuesCommandType)
changePropertyValues(command.value<ChangeValuesCommand>());
+ else if (command.userType() == changeAuxiliaryCommandType)
+ changeAuxiliaryValues(command.value<ChangeAuxiliaryCommand>());
else if (command.userType() == reparentInstancesCommandType)
reparentInstances(command.value<ReparentInstancesCommand>());
else if (command.userType() == changeIdsCommandType)
@@ -313,8 +322,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
addImport(command.value<AddImportCommand>());
else if (command.userType() == completeComponentCommandType)
completeComponent(command.value<CompleteComponentCommand>());
- else if (command.userType() == changeCustomParserSourceCommandType)
- changeCustomParserSource(command.value<ChangeCustomParserSourceCommand>());
+ else if (command.userType() == changeNodeSourceCommandType)
+ changeNodeSource(command.value<ChangeNodeSourceCommand>());
else if (command.userType() == synchronizeCommandType) {
SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>();
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 <private/qlistmodelinterface_p.h>
#include <QAbstractAnimation>
#include <private/qabstractanimation_p.h>
+#include <QMutableVectorIterator>
#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<ServerNodeInstance> NodeInstanceServer::createInstances(const QVector<Ins
Q_ASSERT(m_declarativeView);
QList<ServerNodeInstance> 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<ServerNodeInstance> NodeInstanceServer::createInstances(const QVector<Ins
m_declarativeView->scene()->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<ServerNodeInstance> NodeInstanceServer::setupScene(const CreateSceneComman
QList<ServerNodeInstance> 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<PropertyAbstractContainer> &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>("SynchronizeCommand");
qRegisterMetaTypeStreamOperators<SynchronizeCommand>("SynchronizeCommand");
- qRegisterMetaType<ChangeCustomParserSourceCommand>("ChangeCustomParserSourceCommand");
- qRegisterMetaTypeStreamOperators<ChangeCustomParserSourceCommand>("ChangeCustomParserSourceCommand");
+ qRegisterMetaType<ChangeNodeSourceCommand>("ChangeNodeSourceCommand");
+ qRegisterMetaTypeStreamOperators<ChangeNodeSourceCommand>("ChangeNodeSourceCommand");
+ qRegisterMetaType<ChangeAuxiliaryCommand>("ChangeAuxiliaryCommand");
+ qRegisterMetaTypeStreamOperators<ChangeAuxiliaryCommand>("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<PropertyValueContainer>() << container);
- nodeInstanceServer()->changePropertyValues(changeValueCommand);
+ ChangeAuxiliaryCommand changeAuxiliaryCommand(QVector<PropertyValueContainer>() << 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<PropertyValueContainer>() << container);
- nodeInstanceServer()->changePropertyValues(changeValueCommand);
- }
- }
- }
}
void NodeInstanceView::customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &, const QList<QVariant> &)
@@ -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<VariantProperty> variantPropertyList;
QList<BindingProperty> bindingPropertyList;
+ QVector<PropertyValueContainer> auxiliaryContainerVector;
foreach (const ModelNode &node, nodeList) {
variantPropertyList.append(node.variantProperties());
bindingPropertyList.append(node.bindingProperties());
+ if (node.isValid() && hasInstanceForNode(node)) {
+ NodeInstance instance = instanceForNode(node);
+ QHashIterator<QString, QVariant> auxiliaryIterator(node.auxiliaryData());
+ while (auxiliaryIterator.hasNext()) {
+ auxiliaryIterator.next();
+ PropertyValueContainer container(instance.instanceId(), auxiliaryIterator.key(), auxiliaryIterator.value(), QString());
+ auxiliaryContainerVector.append(container);
+ }
+ }
}
+
QVector<InstanceContainer> 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<InstanceContainer::NodeSourceType>(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<AddImportContainer> 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<InstanceContainer> containerList;
foreach(const NodeInstance &instance, instanceList) {
+ InstanceContainer::NodeSourceType nodeSourceType = static_cast<InstanceContainer::NodeSourceType>(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<ServerNodeInstance> ObjectNodeInstance::stateInstances() const
return QList<ServerNodeInstance>();
}
+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<ServerNodeInstance> 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<QPair<QString, QVariant> > &propertyList,
- const QString &customParserSource)
+ const QList<QPair<QString, QVariant> > &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<QString, QVariant> 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<QString, QVariant> 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<QString, InternalPropertyPointer> 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<QPair<QString, QVariant> > &propertyList,
- const QString &customParserSource,
+ const QList<QPair<QString, QVariant> > &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<QString, QVariant> 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<AbstractView> &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<QPair<QString, QVariant> > &propertyList,
- const QString &customParserSource,
+ const QList<QPair<QString, QVariant> > &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<QString, QVariant> 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<ModelNode::NodeSourceType>(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<Import> &/*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<ModelNode> &/*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<ModelNode>() << 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<ModelNode>() << 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 <qmljs/qmljslookupcontext.h>
#include <QtCore/QStringList>
+#include <QtCore/QTimer>
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<ModelNode> m_setupComponentList;
+ QSet<ModelNode> 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<ModelNode> &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<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
- void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
+ void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource);
void rewriterBeginTransaction();
void rewriterEndTransaction();