diff options
author | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2011-05-06 13:08:46 +0200 |
---|---|---|
committer | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2011-05-06 13:28:19 +0200 |
commit | faa59b754f938e2d880468373b6877d205c4d232 (patch) | |
tree | 0a7a06e260191d7f0e9a9786006359e5f045283e | |
parent | 749d559ac2f0c46edb4a3f081f9817b129a8d6be (diff) |
QmlDesigner.Model: add support for custom parser types
This patch enables us to create objects with custom parsers
like ListModel and XmlListModel.
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(); |