aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@nokia.com>2011-05-06 13:08:46 +0200
committerThomas Hartmann <Thomas.Hartmann@nokia.com>2011-05-06 13:28:19 +0200
commitfaa59b754f938e2d880468373b6877d205c4d232 (patch)
tree0a7a06e260191d7f0e9a9786006359e5f045283e
parent749d559ac2f0c46edb4a3f081f9817b129a8d6be (diff)
QmlDesigner.Model: add support for custom parser types
This patch enables us to create objects with custom parsers like ListModel and XmlListModel.
-rw-r--r--src/plugins/qmldesigner/components/integration/componentview.cpp1
-rw-r--r--src/plugins/qmldesigner/components/integration/componentview.h1
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp4
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h1
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp5
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h1
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp5
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.h1
-rw-r--r--src/plugins/qmldesigner/designercore/designercore.pri2
-rw-r--r--src/plugins/qmldesigner/designercore/include/abstractview.h4
-rw-r--r--src/plugins/qmldesigner/designercore/include/modelnode.h5
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceview.h1
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodemetainfo.h2
-rw-r--r--src/plugins/qmldesigner/designercore/include/qmlmodelview.h1
-rw-r--r--src/plugins/qmldesigner/designercore/include/rewriterview.h1
-rw-r--r--src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp72
-rw-r--r--src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h61
-rw-r--r--src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp8
-rw-r--r--src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp12
-rw-r--r--src/plugins/qmldesigner/designercore/instances/instancecontainer.h4
-rw-r--r--src/plugins/qmldesigner/designercore/instances/instances.pri2
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp9
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h4
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp11
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h1
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp5
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp7
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h1
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp19
-rw-r--r--src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp41
-rw-r--r--src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h2
-rw-r--r--src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp4
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp5
-rw-r--r--src/plugins/qmldesigner/designercore/model/abstractview.cpp5
-rw-r--r--src/plugins/qmldesigner/designercore/model/internalnode.cpp10
-rw-r--r--src/plugins/qmldesigner/designercore/model/internalnode_p.h5
-rw-r--r--src/plugins/qmldesigner/designercore/model/model.cpp44
-rw-r--r--src/plugins/qmldesigner/designercore/model/model_p.h3
-rw-r--r--src/plugins/qmldesigner/designercore/model/modelnode.cpp25
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp5
-rw-r--r--src/plugins/qmldesigner/designercore/model/rewriterview.cpp5
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp29
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.h2
-rw-r--r--src/plugins/qmldesigner/designercore/model/viewlogger.cpp6
-rw-r--r--src/plugins/qmldesigner/designercore/model/viewlogger.h1
46 files changed, 410 insertions, 35 deletions
diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp
index 5ef6573c49..cc90da44d8 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.cpp
+++ b/src/plugins/qmldesigner/components/integration/componentview.cpp
@@ -169,6 +169,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::rewriterBeginTransaction() {}
void ComponentView::rewriterEndTransaction() {}
diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h
index aa15bccebf..3127a16048 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.h
+++ b/src/plugins/qmldesigner/components/integration/componentview.h
@@ -77,6 +77,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 rewriterBeginTransaction();
void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
index d4726e7787..ac3019d2ca 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
@@ -92,6 +92,10 @@ void DesignDocumentControllerView::instancesChildrenChanged(const QVector<ModelN
}
+void DesignDocumentControllerView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
+{
+
+}
void DesignDocumentControllerView::rewriterBeginTransaction()
{
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
index db56d61c74..9960f3800f 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
@@ -68,6 +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 rewriterBeginTransaction();
void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
index 16ca018761..c7708aa32d 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp
@@ -172,6 +172,11 @@ void ItemLibraryView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeL
}
+void ItemLibraryView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
+{
+
+}
+
void ItemLibraryView::rewriterBeginTransaction()
{
}
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
index 8dd952df79..0f371b12fb 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.h
@@ -84,6 +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 rewriterBeginTransaction();
void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index c15d04c2e7..f90d5a98bd 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -235,6 +235,11 @@ void NavigatorView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeLis
}
+void NavigatorView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
+{
+
+}
+
void NavigatorView::rewriterBeginTransaction()
{
}
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h
index 825eae0e67..d62ba917b9 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h
@@ -92,6 +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 rewriterBeginTransaction();
void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/designercore/designercore.pri b/src/plugins/qmldesigner/designercore/designercore.pri
index 17f5e8d235..6491c9f6bb 100644
--- a/src/plugins/qmldesigner/designercore/designercore.pri
+++ b/src/plugins/qmldesigner/designercore/designercore.pri
@@ -107,6 +107,7 @@ SOURCES += $$PWD/model/abstractview.cpp \
$$PWD/instances/imagecontainer.cpp \
$$PWD/instances/completecomponentcommand.cpp \
$$PWD/instances/componentcompletedcommand.cpp \
+ $$PWD/instances/changecustomparsersourcecommand.cpp \
$$PWD/instances/addimportcontainer.cpp
HEADERS += $$PWD/include/corelib_global.h \
@@ -215,6 +216,7 @@ HEADERS += $$PWD/include/corelib_global.h \
$$PWD/instances/imagecontainer.h \
$$PWD/instances/completecomponentcommand.h \
$$PWD/instances/componentcompletedcommand.h \
+ $$PWD/instances/changecustomparsersourcecommand.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 961d11a2f5..829752b4d1 100644
--- a/src/plugins/qmldesigner/designercore/include/abstractview.h
+++ b/src/plugins/qmldesigner/designercore/include/abstractview.h
@@ -85,7 +85,8 @@ public:
ModelNode createModelNode(const QString &typeString,
int majorVersion,
int minorVersion,
- const PropertyListType &propertyList = PropertyListType());
+ const PropertyListType &propertyList = PropertyListType(),
+ const QString &customParserSource = QString());
const ModelNode rootModelNode() const;
ModelNode rootModelNode();
@@ -140,6 +141,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 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 d0be096cef..3dd41debb7 100644
--- a/src/plugins/qmldesigner/designercore/include/modelnode.h
+++ b/src/plugins/qmldesigner/designercore/include/modelnode.h
@@ -70,7 +70,7 @@ CORESHARED_EXPORT QList<Internal::InternalNodePointer> toInternalNodeList(const
typedef QList<QPair<QString, QVariant> > PropertyListType;
-class CORESHARED_EXPORT ModelNode
+class CORESHARED_EXPORT ModelNode
{
friend CORESHARED_EXPORT bool operator ==(const ModelNode &firstNode, const ModelNode &secondNode);
friend CORESHARED_EXPORT bool operator !=(const ModelNode &firstNode, const ModelNode &secondNode);
@@ -170,6 +170,9 @@ public:
qint32 internalId() const;
+ void setCustomParserSource(const QString&);
+ QString customParserSource() 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 bc8a3af850..87ad2f685b 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceserverinterface.h
@@ -54,6 +54,7 @@ class RemovePropertiesCommand;
class ChangeStateCommand;
class AddImportCommand;
class CompleteComponentCommand;
+class ChangeCustomParserSourceCommand;
class NodeInstanceServerInterface : public QObject
{
@@ -79,6 +80,7 @@ public:
virtual void changeState(const ChangeStateCommand &command) = 0;
virtual void addImport(const AddImportCommand &command) = 0;
virtual void completeComponent(const CompleteComponentCommand &command) = 0;
+ virtual void changeCustomParserSource(ChangeCustomParserSourceCommand &command) = 0;
static void registerCommands();
};
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
index 31b9df91e1..d83b58e0f2 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
@@ -109,6 +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 rewriterBeginTransaction();
void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h
index 0093ded1c2..0246e33735 100644
--- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h
+++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h
@@ -95,6 +95,8 @@ public:
QString componentSource() const;
QString componentFileName() const;
+ bool hasCustomParser() const;
+
bool availableInVersion(int majorVersion, int minorVersion) const;
bool isSubclassOf(const QString& type, int majorVersion, int minorVersio) const;
diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
index 7c7fc4056e..e1d942a098 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
@@ -119,6 +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);
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 190401f536..8854903862 100644
--- a/src/plugins/qmldesigner/designercore/include/rewriterview.h
+++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h
@@ -143,6 +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 rewriterBeginTransaction();
void rewriterEndTransaction();
diff --git a/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp b/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp
new file mode 100644
index 0000000000..75d6d416f8
--- /dev/null
+++ b/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.cpp
@@ -0,0 +1,72 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (info@qt.nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "changecustomparsersourcecommand.h"
+
+namespace QmlDesigner {
+
+ChangeCustomParserSourceCommand::ChangeCustomParserSourceCommand()
+{
+}
+
+ChangeCustomParserSourceCommand::ChangeCustomParserSourceCommand(qint32 newInstanceId, const QString &newCustomParserSource)
+ : m_instanceId(newInstanceId), m_customParserSource(newCustomParserSource)
+{
+}
+
+qint32 ChangeCustomParserSourceCommand::instanceId() const
+{
+ return m_instanceId;
+}
+
+QString ChangeCustomParserSourceCommand::customParserSource() const
+{
+ return m_customParserSource;
+}
+
+QDataStream &operator<<(QDataStream &out, const ChangeCustomParserSourceCommand &command)
+{
+ out << command.instanceId();
+ out << command.customParserSource();
+
+ return out;
+}
+
+QDataStream &operator>>(QDataStream &in, ChangeCustomParserSourceCommand &command)
+{
+ in >> command.m_instanceId;
+ in >> command.m_customParserSource;
+
+ return in;
+}
+
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h b/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h
new file mode 100644
index 0000000000..090a6305ef
--- /dev/null
+++ b/src/plugins/qmldesigner/designercore/instances/changecustomparsersourcecommand.h
@@ -0,0 +1,61 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (info@qt.nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef CHANGECUSTOMPARSERSOURCECOMMAND_H
+#define CHANGECUSTOMPARSERSOURCECOMMAND_H
+
+#include <QMetaType>
+
+namespace QmlDesigner {
+
+class ChangeCustomParserSourceCommand
+{
+ friend QDataStream &operator>>(QDataStream &in, ChangeCustomParserSourceCommand &command);
+public:
+ ChangeCustomParserSourceCommand();
+ ChangeCustomParserSourceCommand(qint32 instanceId, const QString &customParserSource);
+ qint32 instanceId() const;
+ QString customParserSource() const;
+
+private:
+ qint32 m_instanceId;
+ QString m_customParserSource;
+};
+
+QDataStream &operator<<(QDataStream &out, const ChangeCustomParserSourceCommand &command);
+QDataStream &operator>>(QDataStream &in, ChangeCustomParserSourceCommand &command);
+
+} // namespace QmlDesigner
+
+Q_DECLARE_METATYPE(QmlDesigner::ChangeCustomParserSourceCommand)
+
+#endif // CHANGECUSTOMPARSERSOURCECOMMAND_H
diff --git a/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp
index 6dbb45eafe..090c25159f 100644
--- a/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/componentnodeinstance.cpp
@@ -73,17 +73,19 @@ bool ComponentNodeInstance::hasContent() const
void ComponentNodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
{
if (name == "__component_data") {
- QByteArray data(value.toByteArray());
+
QByteArray importArray;
foreach(const QString &import, nodeInstanceServer()->imports()) {
importArray.append(import.toUtf8());
}
+ QByteArray data(value.toByteArray());
+
data.prepend(importArray);
+ data.append("\n");
- component()->setData(data, nodeInstanceServer()->fileUrl());
+ component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() + "_"+ id()));
setId(id());
-
}
if (component()->isError()) {
diff --git a/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp b/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp
index c1ba4fb24d..1d2852c6ab 100644
--- a/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/instancecontainer.cpp
@@ -39,8 +39,9 @@ InstanceContainer::InstanceContainer()
{
}
-InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath)
- : m_instanceId(instanceId), m_type(type), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath)
+InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &customParserSource)
+ : m_instanceId(instanceId), m_type(type), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath),
+ m_customParserSource(customParserSource)
{
m_type.replace(QLatin1Char('.'), QLatin1Char('/'));
}
@@ -70,6 +71,11 @@ QString InstanceContainer::componentPath() const
return m_componentPath;
}
+QString InstanceContainer::customParserSource() const
+{
+ return m_customParserSource;
+}
+
QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
{
out << container.instanceId();
@@ -77,6 +83,7 @@ QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
out << container.majorNumber();
out << container.minorNumber();
out << container.componentPath();
+ out << container.customParserSource();
return out;
}
@@ -89,6 +96,7 @@ QDataStream &operator>>(QDataStream &in, InstanceContainer &container)
in >> container.m_majorNumber;
in >> container.m_minorNumber;
in >> container.m_componentPath;
+ in >> container.m_customParserSource;
return in;
}
diff --git a/src/plugins/qmldesigner/designercore/instances/instancecontainer.h b/src/plugins/qmldesigner/designercore/instances/instancecontainer.h
index baca003cd2..2c12ccf97e 100644
--- a/src/plugins/qmldesigner/designercore/instances/instancecontainer.h
+++ b/src/plugins/qmldesigner/designercore/instances/instancecontainer.h
@@ -49,13 +49,14 @@ class InstanceContainer
public:
InstanceContainer();
- InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath);
+ InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &customParserSource);
qint32 instanceId() const;
QString type() const;
int majorNumber() const;
int minorNumber() const;
QString componentPath() const;
+ QString customParserSource() const;
private:
qint32 m_instanceId;
@@ -63,6 +64,7 @@ private:
int m_majorNumber;
int m_minorNumber;
QString m_componentPath;
+ QString m_customParserSource;
};
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/instances/instances.pri b/src/plugins/qmldesigner/designercore/instances/instances.pri
index 1c73512744..63f8ed362a 100644
--- a/src/plugins/qmldesigner/designercore/instances/instances.pri
+++ b/src/plugins/qmldesigner/designercore/instances/instances.pri
@@ -17,6 +17,7 @@ HEADERS += $$PWD/addimportcommand.h
HEADERS += $$PWD/changebindingscommand.h
HEADERS += $$PWD/changefileurlcommand.h
HEADERS += $$PWD/changeidscommand.h
+HEADERS += $$PWD/changecustomparsersourcecommand.h
HEADERS += $$PWD/changestatecommand.h
HEADERS += $$PWD/changevaluescommand.h
HEADERS += $$PWD/childrenchangeeventfilter.h
@@ -66,6 +67,7 @@ SOURCES += $$PWD/addimportcommand.cpp
SOURCES += $$PWD/changebindingscommand.cpp
SOURCES += $$PWD/changefileurlcommand.cpp
SOURCES += $$PWD/changeidscommand.cpp
+SOURCES += $$PWD/changecustomparsersourcecommand.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 eaa483a2f7..559d77ee7e 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.cpp
@@ -67,6 +67,7 @@
#include "imagecontainer.h"
#include "statepreviewimagechangedcommand.h"
#include "componentcompletedcommand.h"
+#include "changecustomparsersourcecommand.h"
namespace QmlDesigner {
@@ -263,6 +264,11 @@ void NodeInstanceClientProxy::completeComponent(const CompleteComponentCommand &
nodeInstanceServer()->completeComponent(command);
}
+void NodeInstanceClientProxy::changeCustomParserSource(ChangeCustomParserSourceCommand &command)
+{
+ nodeInstanceServer()->changeCustomParserSource(command);
+}
+
void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
{
static const int createInstancesCommandType = QMetaType::type("CreateInstancesCommand");
@@ -279,6 +285,7 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
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");
if (command.userType() == createInstancesCommandType) {
createInstances(command.value<CreateInstancesCommand>());
@@ -306,6 +313,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() == 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 113cfb4f24..c2256dfe01 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceclientproxy.h
@@ -59,6 +59,7 @@ class RemovePropertiesCommand;
class AddImportCommand;
class CompleteComponentCommand;
class ChangeStateCommand;
+class ChangeCustomParserSourceCommand;
class NodeInstanceClientProxy : public QObject, public NodeInstanceClientInterface
{
@@ -72,7 +73,7 @@ public:
void pixmapChanged(const PixmapChangedCommand &command);
void childrenChanged(const ChildrenChangedCommand &command);
void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command);
- void componentCompleted(const ComponentCompletedCommand &command);
+ void componentCompleted(const ComponentCompletedCommand &command);
void flush();
void synchronizeWithClientProcess();
@@ -96,6 +97,7 @@ protected:
void changeState(const ChangeStateCommand &command);
void addImport(const AddImportCommand &command);
void completeComponent(const CompleteComponentCommand &command);
+ void changeCustomParserSource(ChangeCustomParserSourceCommand &command);
private slots:
void readDataStream();
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp
index a18eede134..f2067d9ba6 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp
@@ -76,6 +76,7 @@
#include "completecomponentcommand.h"
#include "componentcompletedcommand.h"
#include "createscenecommand.h"
+#include "changecustomparsersourcecommand.h"
#include "dummycontextobject.h"
@@ -345,6 +346,16 @@ void NodeInstanceServer::completeComponent(const CompleteComponentCommand &comma
startRenderTimer();
}
+void NodeInstanceServer::changeCustomParserSource(ChangeCustomParserSourceCommand &command)
+{
+ if (hasInstanceForId(command.instanceId())) {
+ ServerNodeInstance instance = instanceForId(command.instanceId());
+ ;
+ }
+
+ startRenderTimer();
+}
+
void NodeInstanceServer::addImports(const QVector<AddImportContainer> &containerVector)
{
foreach (const AddImportContainer &container, containerVector) {
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h
index 214b459878..303d7c5558 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h
@@ -90,6 +90,7 @@ public:
void changeState(const ChangeStateCommand &command);
void addImport(const AddImportCommand &command);
void completeComponent(const CompleteComponentCommand &command);
+ void changeCustomParserSource(ChangeCustomParserSourceCommand &command);
ServerNodeInstance instanceForId(qint32 id) const;
bool hasInstanceForId(qint32 id) const;
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp
index 6b208898f1..11acb17d26 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverinterface.cpp
@@ -50,6 +50,7 @@
#include "changestatecommand.h"
#include "completecomponentcommand.h"
#include "addimportcontainer.h"
+#include "changecustomparsersourcecommand.h"
#include "informationchangedcommand.h"
#include "pixmapchangedcommand.h"
@@ -165,6 +166,10 @@ void NodeInstanceServerInterface::registerCommands()
qRegisterMetaType<SynchronizeCommand>("SynchronizeCommand");
qRegisterMetaTypeStreamOperators<SynchronizeCommand>("SynchronizeCommand");
+
+ qRegisterMetaType<ChangeCustomParserSourceCommand>("ChangeCustomParserSourceCommand");
+ qRegisterMetaTypeStreamOperators<ChangeCustomParserSourceCommand>("ChangeCustomParserSourceCommand");
+
}
}
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp
index 5c6c485476..7f85ef2ecf 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp
@@ -55,6 +55,7 @@
#include "changestatecommand.h"
#include "addimportcommand.h"
#include "completecomponentcommand.h"
+#include "changecustomparsersourcecommand.h"
#include "informationchangedcommand.h"
#include "pixmapchangedcommand.h"
@@ -451,4 +452,10 @@ void NodeInstanceServerProxy::completeComponent(const CompleteComponentCommand &
{
writeCommand(QVariant::fromValue(command));
}
+
+void NodeInstanceServerProxy::changeCustomParserSource(ChangeCustomParserSourceCommand &command)
+{
+ writeCommand(QVariant::fromValue(command));
+}
+
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h
index 3131d5c005..2643a2027b 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h
@@ -70,6 +70,7 @@ public:
void changeState(const ChangeStateCommand &command);
void addImport(const AddImportCommand &command);
void completeComponent(const CompleteComponentCommand &command);
+ void changeCustomParserSource(ChangeCustomParserSourceCommand &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 96d46282fc..8763b4db57 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -66,6 +66,7 @@
#include "changevaluescommand.h"
#include "changebindingscommand.h"
#include "changeidscommand.h"
+#include "changecustomparsersourcecommand.h"
#include "removeinstancescommand.h"
#include "removepropertiescommand.h"
#include "valueschangedcommand.h"
@@ -515,6 +516,15 @@ void NodeInstanceView::customNotification(const AbstractView *view, const QStrin
restartProcess();
}
+void NodeInstanceView::customParserSourceChanged(const ModelNode &node, const QString & newCustomParserSource)
+{
+ if (hasInstanceForNode(node)) {
+ NodeInstance instance = instanceForNode(node);
+ ChangeCustomParserSourceCommand changeCustomParserSourceCommand(instance.instanceId(), newCustomParserSource);
+ nodeInstanceServer()->changeCustomParserSource(changeCustomParserSourceCommand);
+ }
+}
+
void NodeInstanceView::rewriterBeginTransaction()
{
@@ -738,7 +748,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
nodeList = filterNodesForSkipItems(nodeList);
QList<VariantProperty> variantPropertyList;
- QList<BindingProperty> bindingPropertyList;
+ QList<BindingProperty> bindingPropertyList;
foreach (const ModelNode &node, nodeList) {
variantPropertyList.append(node.variantProperties());
@@ -747,7 +757,9 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
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());
+ InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(),
+ instance.modelNode().minorVersion(), instance.modelNode().metaInfo().componentFileName(),
+ instance.modelNode().customParserSource());
instanceContainerList.append(container);
}
@@ -858,7 +870,8 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis
{
QVector<InstanceContainer> containerList;
foreach(const NodeInstance &instance, instanceList) {
- InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(), instance.modelNode().metaInfo().componentFileName());
+ InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(),
+ instance.modelNode().metaInfo().componentFileName(), instance.modelNode().customParserSource());
containerList.append(container);
}
diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
index f36261027b..c009518ab9 100644
--- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
@@ -736,17 +736,46 @@ void tweakObjects(QObject *object)
}
-QObject *createComponent(const QString &componentPath, QDeclarativeContext *context)
-{
+static QObject *createComponent(const QString &componentPath, QDeclarativeContext *context)
+{
QDeclarativeComponent component(context->engine(), QUrl::fromLocalFile(componentPath));
QObject *object = component.beginCreate(context);
tweakObjects(object);
component.completeCreate();
+ if (component.isError()) {
+ qDebug() << componentPath;
+ foreach(const QDeclarativeError &error, component.errors())
+ qDebug() << error;
+ }
+
+ return object;
+}
+
+static QObject *createCustomParserObject(const QString &customParserSource, QStringList imports, QDeclarativeContext *context)
+{
+ QDeclarativeComponent component(context->engine());
+
+ QByteArray importArray;
+ foreach(const QString &import, imports) {
+ importArray.append(import.toUtf8());
+ }
+
+ QByteArray data(customParserSource.toUtf8());
+
+ data.prepend(importArray);
+
+ component.setData(data, context->baseUrl().resolved(QUrl("createCustomParserObject.qml")));
+
+ QObject *object = component.beginCreate(context);
+ tweakObjects(object);
+ component.completeCreate();
+
return object;
+
}
-QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context)
+static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context)
{
QObject *object = 0;
QDeclarativeType *type = QDeclarativeMetaType::qmlType(typeName.toUtf8(), majorNumber, minorNumber);
@@ -770,11 +799,13 @@ QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumb
return object;
}
-QObject* ObjectNodeInstance::createObject(const QString &typeName, int majorNumber, int minorNumber, const QString &componentPath, QDeclarativeContext *context)
+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()) {
+ 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);
}
diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h
index 6ab887e9c3..7c01b85536 100644
--- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h
+++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h
@@ -77,7 +77,7 @@ public:
//void setModelNode(const ModelNode &node);
static Pointer create(QObject *objectToBeWrapped);
- static QObject* createObject(const QString &typeName, int majorNumber, int minorNumber, const QString &componentPath, QDeclarativeContext *context);
+ static QObject* createObject(const QString &typeName, int majorNumber, int minorNumber, const QString &componentPath, const QString &customParserSource, NodeInstanceServer* nodeInstanceServer, QDeclarativeContext *context);
void setInstanceId(qint32 id);
qint32 instanceId() const;
diff --git a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp
index 15746d8adc..224a653c0f 100644
--- a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp
@@ -196,7 +196,9 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
QDeclarativeContext *context = nodeInstanceServer->context();
- QObject *object = Internal::ObjectNodeInstance::createObject(instanceContainer.type(), instanceContainer.majorNumber(), instanceContainer.minorNumber(), instanceContainer.componentPath(), context);
+ QObject *object = Internal::ObjectNodeInstance::createObject(instanceContainer.type(), instanceContainer.majorNumber(),
+ instanceContainer.minorNumber(), instanceContainer.componentPath(),
+ instanceContainer.customParserSource(), nodeInstanceServer, context);
ServerNodeInstance instance(createInstance(object));
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
index c5e44e7de6..74d79b5539 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
@@ -999,6 +999,11 @@ QString NodeMetaInfo::componentFileName() const
return NodeMetaInfo::m_privateData->componentFileName();
}
+bool NodeMetaInfo::hasCustomParser() const
+{
+ return false;
+}
+
bool NodeMetaInfo::availableInVersion(int majorVersion, int minorVersion) const
{
if (majorVersion == -1 && minorVersion == -1)
diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
index d117f9d8fa..309ef86093 100644
--- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
@@ -80,9 +80,10 @@ RewriterTransaction AbstractView::beginRewriterTransaction()
ModelNode AbstractView::createModelNode(const QString &typeString,
int majorVersion,
int minorVersion,
- const QList<QPair<QString, QVariant> > &propertyList)
+ const QList<QPair<QString, QVariant> > &propertyList,
+ const QString &customParserSource)
{
- return ModelNode(model()->m_d->createNode(typeString, majorVersion, minorVersion, propertyList), model(), this);
+ return ModelNode(model()->m_d->createNode(typeString, majorVersion, minorVersion, propertyList, customParserSource), model(), this);
}
diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp
index a8a5700146..e871057fad 100644
--- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp
+++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp
@@ -342,5 +342,15 @@ qint32 InternalNode::internalId() const
return m_internalId;
}
+void InternalNode::setCustomParserSource(const QString &customParserSource)
+{
+ m_customParserSource = customParserSource;
+}
+
+QString InternalNode::customParserSource() const
+{
+ return m_customParserSource;
+}
+
}
}
diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h
index e9d0860de2..6f022110df 100644
--- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h
+++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h
@@ -121,6 +121,9 @@ public:
qint32 internalId() const;
+ void setCustomParserSource(const QString&);
+ QString customParserSource() const;
+
protected:
Pointer internalPointer() const;
void setInternalWeakPointer(const Pointer &pointer);
@@ -144,6 +147,8 @@ private:
QHash<QString, InternalPropertyPointer> m_namePropertyHash;
QStringList m_scriptFunctionList;
+
+ QString m_customParserSource;
};
uint qHash(const InternalNodePointer& node);
diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp
index 50aca18652..0ddf65cd85 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(), true);
+ m_rootInternalNode = createNode("QtQuick/Item", 1, 0, PropertyListType(), QString(), true);
}
ModelPrivate::~ModelPrivate()
@@ -202,6 +202,7 @@ InternalNode::Pointer ModelPrivate::createNode(const QString &typeString,
int majorVersion,
int minorVersion,
const QList<QPair<QString, QVariant> > &propertyList,
+ const QString &customParserSource,
bool isRootNode)
{
if (typeString.isEmpty())
@@ -224,6 +225,9 @@ InternalNode::Pointer ModelPrivate::createNode(const QString &typeString,
m_nodeSet.insert(newInternalNodePointer);
m_internalIdNodeHash.insert(newInternalNodePointer->internalId(), newInternalNodePointer);
+ if (!customParserSource.isNull())
+ newInternalNodePointer->setCustomParserSource(customParserSource);
+
notifyNodeCreated(newInternalNodePointer);
return newInternalNodePointer;
@@ -355,6 +359,38 @@ void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &interna
}
}
+void ModelPrivate::notifyCustomParserSourceChanged(const InternalNodePointer &internalNode, const QString &newCustomParserSource)
+{
+ bool resetModel = false;
+ QString description;
+
+ try {
+ if (rewriterView()) {
+ ModelNode node(internalNode, model(), rewriterView());
+ rewriterView()->customParserSourceChanged(node, newCustomParserSource);
+ }
+ } catch (RewritingException &e) {
+ description = e.description();
+ resetModel = true;
+ }
+
+ foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
+ Q_ASSERT(view != 0);
+ ModelNode node(internalNode, model(), view.data());
+ view->customParserSourceChanged(node, newCustomParserSource);
+
+ }
+
+ if (nodeInstanceView()) {
+ ModelNode node(internalNode, model(), nodeInstanceView());
+ nodeInstanceView()->customParserSourceChanged(node, newCustomParserSource);
+ }
+
+ if (resetModel) {
+ resetModelByRewriter(description);
+ }
+}
+
void ModelPrivate::notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion)
{
bool resetModel = false;
@@ -1456,6 +1492,12 @@ void ModelPrivate::setScriptFunctions(const InternalNode::Pointer &internalNode,
notifyScriptFunctionsChanged(internalNode, scriptFunctionList);
}
+void ModelPrivate::setCustomParserSource(const InternalNodePointer &internalNode, const QString &customParserSource)
+{
+ internalNode->setCustomParserSource(customParserSource);
+ notifyCustomParserSourceChanged(internalNode, customParserSource);
+}
+
void ModelPrivate::changeNodeOrder(const InternalNode::Pointer &internalParentNode, const QString &listPropertyName, int from, int to)
{
InternalNodeListProperty::Pointer nodeList(internalParentNode->nodeListProperty(listPropertyName));
diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h
index 8c4a63a6d7..c974bfd5b2 100644
--- a/src/plugins/qmldesigner/designercore/model/model_p.h
+++ b/src/plugins/qmldesigner/designercore/model/model_p.h
@@ -105,6 +105,7 @@ public:
int majorVersion,
int minorVersion,
const QList<QPair<QString, QVariant> > &propertyList,
+ const QString &customParserSource,
bool isRootNode = false);
@@ -142,6 +143,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 notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion);
@@ -194,6 +196,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);
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 ac8927f76e..5a987dddc8 100644
--- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp
+++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp
@@ -51,6 +51,7 @@
#include "nodeabstractproperty.h"
#include "nodelistproperty.h"
#include "nodeproperty.h"
+#include <rewriterview.h>
namespace QmlDesigner {
using namespace QmlDesigner::Internal;
@@ -935,4 +936,28 @@ qint32 ModelNode::internalId() const
return m_internalNode->internalId();
}
+void ModelNode::setCustomParserSource(const QString &newCustomParserSource)
+{
+ Internal::WriteLocker locker(m_model.data());
+
+ if (!isValid()) {
+ Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid");
+ throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
+ }
+
+ if (internalNode()->customParserSource() == newCustomParserSource)
+ return;
+
+ m_model.data()->m_d->setCustomParserSource(internalNode(), newCustomParserSource);
+}
+
+QString ModelNode::customParserSource() const
+{
+ if (!isValid()) {
+ throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
+ }
+
+ return internalNode()->customParserSource();
+}
+
}
diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
index ef30d74993..c13736cedb 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
@@ -380,6 +380,11 @@ void QmlModelView::importsChanged(const QList<Import> &/*addedImports*/, const Q
}
+void QmlModelView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
+{
+
+}
+
void QmlModelView::rewriterBeginTransaction()
{
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
index 2312171e77..3ceba40fcc 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
@@ -407,6 +407,11 @@ void RewriterView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeList
}
+void RewriterView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
+{
+
+}
+
void RewriterView::rewriterBeginTransaction()
{
transactionLevel++;
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index 4c134bcc7d..49098405d5 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -264,7 +264,7 @@ static bool isComponentType(const QString &type)
return type == QLatin1String("Component") || type == QLatin1String("Qt.Component") || type == QLatin1String("QtQuick.Component");
}
-static bool isModelType(const QString &type)
+static bool isCustomParserType(const QString &type)
{
return type == "QtQuick.VisualItemModel" || type == "Qt.VisualItemModel" ||
type == "QtQuick.VisualDataModel" || type == "Qt.VisualDataModel" ||
@@ -762,8 +762,8 @@ void TextToModelMerger::syncNode(ModelNode &modelNode,
if (isComponentType(typeNameFixedForImplicitComponents))
setupComponent(modelNode);
- if (isModelType(typeName))
- setupModel(modelNode);
+ if (isCustomParserType(typeName))
+ setupCustomParserNode(modelNode);
if (modelNode.parentProperty().isValid() && modelNode.type() != typeNameFixedForImplicitComponents //If there is no valid parentProperty
//the node has just been created. The type is correct then.
@@ -1102,9 +1102,18 @@ ModelNode TextToModelMerger::createModelNode(const QString &typeName,
ReadingContext *context,
DifferenceHandler &differenceHandler)
{
+ QString customParserSource;
+
+ if (isCustomParserType(typeName))
+ customParserSource = textAt(context->doc(),
+ astNode->firstSourceLocation(),
+ astNode->lastSourceLocation());
+
ModelNode newNode = m_rewriterView->createModelNode(typeName,
majorVersion,
- minorVersion);
+ minorVersion,
+ PropertyListType(),
+ customParserSource);
syncNode(newNode, astNode, context, differenceHandler);
return newNode;
}
@@ -1317,7 +1326,7 @@ void ModelAmender::shouldBeNodeProperty(AbstractProperty &modelProperty,
const bool propertyTakesComponent = propertyIsComponentType(newNodeProperty);
- const ModelNode &newNode = m_merger->createModelNode(propertyTakesComponent ? QLatin1String("QtQuick.Component") : typeName,
+ const ModelNode &newNode = m_merger->createModelNode(propertyTakesComponent ? QLatin1String("QtQuick.Component") : typeName,
majorVersion,
minorVersion,
astNode,
@@ -1469,20 +1478,16 @@ void TextToModelMerger::setupComponent(const ModelNode &node)
node.setAuxiliaryData("__component_data", result);
}
-void TextToModelMerger::setupModel(const ModelNode &node)
+void TextToModelMerger::setupCustomParserNode(const ModelNode &node)
{
- Q_ASSERT(isModelType(node.type()));
+ Q_ASSERT(isCustomParserType(node.type()));
QString modelText = m_rewriterView->extractText(QList<ModelNode>() << node).value(node);
if (modelText.isEmpty())
return;
- if (node.hasAuxiliaryData("__model_data")
- && node.auxiliaryData("__model_data").toString() == modelText)
- return;
-
- node.setAuxiliaryData("__model_data", modelText);
+ ModelNode(node).setCustomParserSource(modelText);
}
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 7367434523..65af629898 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h
@@ -122,7 +122,7 @@ public:
DifferenceHandler &differenceHandler);
void setupComponent(const ModelNode &node);
- void setupModel(const ModelNode &node);
+ void setupCustomParserNode(const ModelNode &node);
private:
static QString textAt(const QmlJS::Document::Ptr &doc,
diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
index 1fa45d8d67..08fa07f3c3 100644
--- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
@@ -256,6 +256,12 @@ void ViewLogger::instancesChildrenChanged(const QVector<ModelNode> &nodeList)
m_output << time() << indent("node: ") << node << endl;
}
+void ViewLogger::customParserSourceChanged(const ModelNode &node, const QString & /*newCustomParserSource*/)
+{
+ m_output << time() << indent("customParserSourceChanged:") << endl;
+ m_output << time() << indent("node: ") << node << endl;
+}
+
void ViewLogger::rewriterBeginTransaction()
{
m_output << time() << indent("rewriterBeginTransaction:") << endl;
diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h
index e9b4ea0cb9..7f476c41ff 100644
--- a/src/plugins/qmldesigner/designercore/model/viewlogger.h
+++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h
@@ -81,6 +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 rewriterBeginTransaction();
void rewriterEndTransaction();