QmlDesigner.Model: add support for custom parser types

This patch enables us to create objects with custom parsers
like ListModel and XmlListModel.
This commit is contained in:
Thomas Hartmann
2011-05-06 13:08:46 +02:00
parent 749d559ac2
commit faa59b754f
46 changed files with 410 additions and 35 deletions

View File

@@ -169,6 +169,7 @@ void ComponentView::instanceInformationsChange(const QVector<ModelNode> &/*nodeL
void ComponentView::instancesRenderImageChanged(const QVector<ModelNode> &/*nodeList*/) {} void ComponentView::instancesRenderImageChanged(const QVector<ModelNode> &/*nodeList*/) {}
void ComponentView::instancesPreviewImageChanged(const QVector<ModelNode> &/*nodeList*/) {} void ComponentView::instancesPreviewImageChanged(const QVector<ModelNode> &/*nodeList*/) {}
void ComponentView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeList*/) {} void ComponentView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeList*/) {}
void ComponentView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/) {}
void ComponentView::rewriterBeginTransaction() {} void ComponentView::rewriterBeginTransaction() {}
void ComponentView::rewriterEndTransaction() {} void ComponentView::rewriterEndTransaction() {}

View File

@@ -77,6 +77,7 @@ public:
void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
void rewriterBeginTransaction(); void rewriterBeginTransaction();
void rewriterEndTransaction(); void rewriterEndTransaction();

View File

@@ -92,6 +92,10 @@ void DesignDocumentControllerView::instancesChildrenChanged(const QVector<ModelN
} }
void DesignDocumentControllerView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
{
}
void DesignDocumentControllerView::rewriterBeginTransaction() void DesignDocumentControllerView::rewriterBeginTransaction()
{ {

View File

@@ -68,6 +68,7 @@ public:
void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
void rewriterBeginTransaction(); void rewriterBeginTransaction();
void rewriterEndTransaction(); void rewriterEndTransaction();

View File

@@ -172,6 +172,11 @@ void ItemLibraryView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeL
} }
void ItemLibraryView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
{
}
void ItemLibraryView::rewriterBeginTransaction() void ItemLibraryView::rewriterBeginTransaction()
{ {
} }

View File

@@ -84,6 +84,7 @@ public:
void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
void rewriterBeginTransaction(); void rewriterBeginTransaction();
void rewriterEndTransaction(); void rewriterEndTransaction();

View File

@@ -235,6 +235,11 @@ void NavigatorView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeLis
} }
void NavigatorView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
{
}
void NavigatorView::rewriterBeginTransaction() void NavigatorView::rewriterBeginTransaction()
{ {
} }

View File

@@ -92,6 +92,7 @@ public:
void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
void rewriterBeginTransaction(); void rewriterBeginTransaction();
void rewriterEndTransaction(); void rewriterEndTransaction();

View File

@@ -107,6 +107,7 @@ SOURCES += $$PWD/model/abstractview.cpp \
$$PWD/instances/imagecontainer.cpp \ $$PWD/instances/imagecontainer.cpp \
$$PWD/instances/completecomponentcommand.cpp \ $$PWD/instances/completecomponentcommand.cpp \
$$PWD/instances/componentcompletedcommand.cpp \ $$PWD/instances/componentcompletedcommand.cpp \
$$PWD/instances/changecustomparsersourcecommand.cpp \
$$PWD/instances/addimportcontainer.cpp $$PWD/instances/addimportcontainer.cpp
HEADERS += $$PWD/include/corelib_global.h \ HEADERS += $$PWD/include/corelib_global.h \
@@ -215,6 +216,7 @@ HEADERS += $$PWD/include/corelib_global.h \
$$PWD/instances/imagecontainer.h \ $$PWD/instances/imagecontainer.h \
$$PWD/instances/completecomponentcommand.h \ $$PWD/instances/completecomponentcommand.h \
$$PWD/instances/componentcompletedcommand.h \ $$PWD/instances/componentcompletedcommand.h \
$$PWD/instances/changecustomparsersourcecommand.h \
$$PWD/instances/addimportcontainer.h $$PWD/instances/addimportcontainer.h
contains(CONFIG, plugin) { contains(CONFIG, plugin) {
# If core.pri has been included in the qmldesigner plugin # If core.pri has been included in the qmldesigner plugin

View File

@@ -85,7 +85,8 @@ public:
ModelNode createModelNode(const QString &typeString, ModelNode createModelNode(const QString &typeString,
int majorVersion, int majorVersion,
int minorVersion, int minorVersion,
const PropertyListType &propertyList = PropertyListType()); const PropertyListType &propertyList = PropertyListType(),
const QString &customParserSource = QString());
const ModelNode rootModelNode() const; const ModelNode rootModelNode() const;
ModelNode rootModelNode(); ModelNode rootModelNode();
@@ -140,6 +141,7 @@ public:
virtual void instancesRenderImageChanged(const QVector<ModelNode> &nodeList) = 0; virtual void instancesRenderImageChanged(const QVector<ModelNode> &nodeList) = 0;
virtual void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList) = 0; virtual void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList) = 0;
virtual void instancesChildrenChanged(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 rewriterBeginTransaction() = 0;
virtual void rewriterEndTransaction() = 0; virtual void rewriterEndTransaction() = 0;

View File

@@ -170,6 +170,9 @@ public:
qint32 internalId() const; qint32 internalId() const;
void setCustomParserSource(const QString&);
QString customParserSource() const;
private: // functions private: // functions
Internal::InternalNodePointer internalNode() const; Internal::InternalNodePointer internalNode() const;
QString generateNewId() const; QString generateNewId() const;

View File

@@ -54,6 +54,7 @@ class RemovePropertiesCommand;
class ChangeStateCommand; class ChangeStateCommand;
class AddImportCommand; class AddImportCommand;
class CompleteComponentCommand; class CompleteComponentCommand;
class ChangeCustomParserSourceCommand;
class NodeInstanceServerInterface : public QObject class NodeInstanceServerInterface : public QObject
{ {
@@ -79,6 +80,7 @@ public:
virtual void changeState(const ChangeStateCommand &command) = 0; virtual void changeState(const ChangeStateCommand &command) = 0;
virtual void addImport(const AddImportCommand &command) = 0; virtual void addImport(const AddImportCommand &command) = 0;
virtual void completeComponent(const CompleteComponentCommand &command) = 0; virtual void completeComponent(const CompleteComponentCommand &command) = 0;
virtual void changeCustomParserSource(ChangeCustomParserSourceCommand &command) = 0;
static void registerCommands(); static void registerCommands();
}; };

View File

@@ -109,6 +109,7 @@ public:
void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); 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 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 rewriterBeginTransaction();
void rewriterEndTransaction(); void rewriterEndTransaction();

View File

@@ -95,6 +95,8 @@ public:
QString componentSource() const; QString componentSource() const;
QString componentFileName() const; QString componentFileName() const;
bool hasCustomParser() const;
bool availableInVersion(int majorVersion, int minorVersion) const; bool availableInVersion(int majorVersion, int minorVersion) const;
bool isSubclassOf(const QString& type, int majorVersion, int minorVersio) const; bool isSubclassOf(const QString& type, int majorVersion, int minorVersio) const;

View File

@@ -119,6 +119,7 @@ public:
void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList); void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList);
void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports); void importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports);
void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
protected: protected:
NodeInstance instanceForModelNode(const ModelNode &modelNode); NodeInstance instanceForModelNode(const ModelNode &modelNode);

View File

@@ -143,6 +143,7 @@ public:
void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
void rewriterBeginTransaction(); void rewriterBeginTransaction();
void rewriterEndTransaction(); void rewriterEndTransaction();

View File

@@ -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

View File

@@ -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

View File

@@ -73,17 +73,19 @@ bool ComponentNodeInstance::hasContent() const
void ComponentNodeInstance::setPropertyVariant(const QString &name, const QVariant &value) void ComponentNodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
{ {
if (name == "__component_data") { if (name == "__component_data") {
QByteArray data(value.toByteArray());
QByteArray importArray; QByteArray importArray;
foreach(const QString &import, nodeInstanceServer()->imports()) { foreach(const QString &import, nodeInstanceServer()->imports()) {
importArray.append(import.toUtf8()); importArray.append(import.toUtf8());
} }
QByteArray data(value.toByteArray());
data.prepend(importArray); data.prepend(importArray);
data.append("\n");
component()->setData(data, nodeInstanceServer()->fileUrl()); component()->setData(data, QUrl(nodeInstanceServer()->fileUrl().toString() + "_"+ id()));
setId(id()); setId(id());
} }
if (component()->isError()) { if (component()->isError()) {

View File

@@ -39,8 +39,9 @@ InstanceContainer::InstanceContainer()
{ {
} }
InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &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_instanceId(instanceId), m_type(type), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath),
m_customParserSource(customParserSource)
{ {
m_type.replace(QLatin1Char('.'), QLatin1Char('/')); m_type.replace(QLatin1Char('.'), QLatin1Char('/'));
} }
@@ -70,6 +71,11 @@ QString InstanceContainer::componentPath() const
return m_componentPath; return m_componentPath;
} }
QString InstanceContainer::customParserSource() const
{
return m_customParserSource;
}
QDataStream &operator<<(QDataStream &out, const InstanceContainer &container) QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
{ {
out << container.instanceId(); out << container.instanceId();
@@ -77,6 +83,7 @@ QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
out << container.majorNumber(); out << container.majorNumber();
out << container.minorNumber(); out << container.minorNumber();
out << container.componentPath(); out << container.componentPath();
out << container.customParserSource();
return out; return out;
} }
@@ -89,6 +96,7 @@ QDataStream &operator>>(QDataStream &in, InstanceContainer &container)
in >> container.m_majorNumber; in >> container.m_majorNumber;
in >> container.m_minorNumber; in >> container.m_minorNumber;
in >> container.m_componentPath; in >> container.m_componentPath;
in >> container.m_customParserSource;
return in; return in;
} }

View File

@@ -49,13 +49,14 @@ class InstanceContainer
public: public:
InstanceContainer(); 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; qint32 instanceId() const;
QString type() const; QString type() const;
int majorNumber() const; int majorNumber() const;
int minorNumber() const; int minorNumber() const;
QString componentPath() const; QString componentPath() const;
QString customParserSource() const;
private: private:
qint32 m_instanceId; qint32 m_instanceId;
@@ -63,6 +64,7 @@ private:
int m_majorNumber; int m_majorNumber;
int m_minorNumber; int m_minorNumber;
QString m_componentPath; QString m_componentPath;
QString m_customParserSource;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -17,6 +17,7 @@ HEADERS += $$PWD/addimportcommand.h
HEADERS += $$PWD/changebindingscommand.h HEADERS += $$PWD/changebindingscommand.h
HEADERS += $$PWD/changefileurlcommand.h HEADERS += $$PWD/changefileurlcommand.h
HEADERS += $$PWD/changeidscommand.h HEADERS += $$PWD/changeidscommand.h
HEADERS += $$PWD/changecustomparsersourcecommand.h
HEADERS += $$PWD/changestatecommand.h HEADERS += $$PWD/changestatecommand.h
HEADERS += $$PWD/changevaluescommand.h HEADERS += $$PWD/changevaluescommand.h
HEADERS += $$PWD/childrenchangeeventfilter.h HEADERS += $$PWD/childrenchangeeventfilter.h
@@ -66,6 +67,7 @@ SOURCES += $$PWD/addimportcommand.cpp
SOURCES += $$PWD/changebindingscommand.cpp SOURCES += $$PWD/changebindingscommand.cpp
SOURCES += $$PWD/changefileurlcommand.cpp SOURCES += $$PWD/changefileurlcommand.cpp
SOURCES += $$PWD/changeidscommand.cpp SOURCES += $$PWD/changeidscommand.cpp
SOURCES += $$PWD/changecustomparsersourcecommand.cpp
SOURCES += $$PWD/changestatecommand.cpp SOURCES += $$PWD/changestatecommand.cpp
SOURCES += $$PWD/changevaluescommand.cpp SOURCES += $$PWD/changevaluescommand.cpp
SOURCES += $$PWD/childrenchangeeventfilter.cpp SOURCES += $$PWD/childrenchangeeventfilter.cpp

View File

@@ -67,6 +67,7 @@
#include "imagecontainer.h" #include "imagecontainer.h"
#include "statepreviewimagechangedcommand.h" #include "statepreviewimagechangedcommand.h"
#include "componentcompletedcommand.h" #include "componentcompletedcommand.h"
#include "changecustomparsersourcecommand.h"
namespace QmlDesigner { namespace QmlDesigner {
@@ -263,6 +264,11 @@ void NodeInstanceClientProxy::completeComponent(const CompleteComponentCommand &
nodeInstanceServer()->completeComponent(command); nodeInstanceServer()->completeComponent(command);
} }
void NodeInstanceClientProxy::changeCustomParserSource(ChangeCustomParserSourceCommand &command)
{
nodeInstanceServer()->changeCustomParserSource(command);
}
void NodeInstanceClientProxy::dispatchCommand(const QVariant &command) void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
{ {
static const int createInstancesCommandType = QMetaType::type("CreateInstancesCommand"); 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 addImportCommandType = QMetaType::type("AddImportCommand");
static const int completeComponentCommandType = QMetaType::type("CompleteComponentCommand"); static const int completeComponentCommandType = QMetaType::type("CompleteComponentCommand");
static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand"); static const int synchronizeCommandType = QMetaType::type("SynchronizeCommand");
static const int changeCustomParserSourceCommandType = QMetaType::type("ChangeCustomParserSourceCommand");
if (command.userType() == createInstancesCommandType) { if (command.userType() == createInstancesCommandType) {
createInstances(command.value<CreateInstancesCommand>()); createInstances(command.value<CreateInstancesCommand>());
@@ -306,6 +313,8 @@ void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
addImport(command.value<AddImportCommand>()); addImport(command.value<AddImportCommand>());
else if (command.userType() == completeComponentCommandType) else if (command.userType() == completeComponentCommandType)
completeComponent(command.value<CompleteComponentCommand>()); completeComponent(command.value<CompleteComponentCommand>());
else if (command.userType() == changeCustomParserSourceCommandType)
changeCustomParserSource(command.value<ChangeCustomParserSourceCommand>());
else if (command.userType() == synchronizeCommandType) { else if (command.userType() == synchronizeCommandType) {
SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>(); SynchronizeCommand synchronizeCommand = command.value<SynchronizeCommand>();
m_synchronizeId = synchronizeCommand.synchronizeId(); m_synchronizeId = synchronizeCommand.synchronizeId();

View File

@@ -59,6 +59,7 @@ class RemovePropertiesCommand;
class AddImportCommand; class AddImportCommand;
class CompleteComponentCommand; class CompleteComponentCommand;
class ChangeStateCommand; class ChangeStateCommand;
class ChangeCustomParserSourceCommand;
class NodeInstanceClientProxy : public QObject, public NodeInstanceClientInterface class NodeInstanceClientProxy : public QObject, public NodeInstanceClientInterface
{ {
@@ -96,6 +97,7 @@ protected:
void changeState(const ChangeStateCommand &command); void changeState(const ChangeStateCommand &command);
void addImport(const AddImportCommand &command); void addImport(const AddImportCommand &command);
void completeComponent(const CompleteComponentCommand &command); void completeComponent(const CompleteComponentCommand &command);
void changeCustomParserSource(ChangeCustomParserSourceCommand &command);
private slots: private slots:
void readDataStream(); void readDataStream();

View File

@@ -76,6 +76,7 @@
#include "completecomponentcommand.h" #include "completecomponentcommand.h"
#include "componentcompletedcommand.h" #include "componentcompletedcommand.h"
#include "createscenecommand.h" #include "createscenecommand.h"
#include "changecustomparsersourcecommand.h"
#include "dummycontextobject.h" #include "dummycontextobject.h"
@@ -345,6 +346,16 @@ void NodeInstanceServer::completeComponent(const CompleteComponentCommand &comma
startRenderTimer(); startRenderTimer();
} }
void NodeInstanceServer::changeCustomParserSource(ChangeCustomParserSourceCommand &command)
{
if (hasInstanceForId(command.instanceId())) {
ServerNodeInstance instance = instanceForId(command.instanceId());
;
}
startRenderTimer();
}
void NodeInstanceServer::addImports(const QVector<AddImportContainer> &containerVector) void NodeInstanceServer::addImports(const QVector<AddImportContainer> &containerVector)
{ {
foreach (const AddImportContainer &container, containerVector) { foreach (const AddImportContainer &container, containerVector) {

View File

@@ -90,6 +90,7 @@ public:
void changeState(const ChangeStateCommand &command); void changeState(const ChangeStateCommand &command);
void addImport(const AddImportCommand &command); void addImport(const AddImportCommand &command);
void completeComponent(const CompleteComponentCommand &command); void completeComponent(const CompleteComponentCommand &command);
void changeCustomParserSource(ChangeCustomParserSourceCommand &command);
ServerNodeInstance instanceForId(qint32 id) const; ServerNodeInstance instanceForId(qint32 id) const;
bool hasInstanceForId(qint32 id) const; bool hasInstanceForId(qint32 id) const;

View File

@@ -50,6 +50,7 @@
#include "changestatecommand.h" #include "changestatecommand.h"
#include "completecomponentcommand.h" #include "completecomponentcommand.h"
#include "addimportcontainer.h" #include "addimportcontainer.h"
#include "changecustomparsersourcecommand.h"
#include "informationchangedcommand.h" #include "informationchangedcommand.h"
#include "pixmapchangedcommand.h" #include "pixmapchangedcommand.h"
@@ -165,6 +166,10 @@ void NodeInstanceServerInterface::registerCommands()
qRegisterMetaType<SynchronizeCommand>("SynchronizeCommand"); qRegisterMetaType<SynchronizeCommand>("SynchronizeCommand");
qRegisterMetaTypeStreamOperators<SynchronizeCommand>("SynchronizeCommand"); qRegisterMetaTypeStreamOperators<SynchronizeCommand>("SynchronizeCommand");
qRegisterMetaType<ChangeCustomParserSourceCommand>("ChangeCustomParserSourceCommand");
qRegisterMetaTypeStreamOperators<ChangeCustomParserSourceCommand>("ChangeCustomParserSourceCommand");
} }
} }

View File

@@ -55,6 +55,7 @@
#include "changestatecommand.h" #include "changestatecommand.h"
#include "addimportcommand.h" #include "addimportcommand.h"
#include "completecomponentcommand.h" #include "completecomponentcommand.h"
#include "changecustomparsersourcecommand.h"
#include "informationchangedcommand.h" #include "informationchangedcommand.h"
#include "pixmapchangedcommand.h" #include "pixmapchangedcommand.h"
@@ -451,4 +452,10 @@ void NodeInstanceServerProxy::completeComponent(const CompleteComponentCommand &
{ {
writeCommand(QVariant::fromValue(command)); writeCommand(QVariant::fromValue(command));
} }
void NodeInstanceServerProxy::changeCustomParserSource(ChangeCustomParserSourceCommand &command)
{
writeCommand(QVariant::fromValue(command));
}
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -70,6 +70,7 @@ public:
void changeState(const ChangeStateCommand &command); void changeState(const ChangeStateCommand &command);
void addImport(const AddImportCommand &command); void addImport(const AddImportCommand &command);
void completeComponent(const CompleteComponentCommand &command); void completeComponent(const CompleteComponentCommand &command);
void changeCustomParserSource(ChangeCustomParserSourceCommand &command);
protected: protected:
void writeCommand(const QVariant &command); void writeCommand(const QVariant &command);

View File

@@ -66,6 +66,7 @@
#include "changevaluescommand.h" #include "changevaluescommand.h"
#include "changebindingscommand.h" #include "changebindingscommand.h"
#include "changeidscommand.h" #include "changeidscommand.h"
#include "changecustomparsersourcecommand.h"
#include "removeinstancescommand.h" #include "removeinstancescommand.h"
#include "removepropertiescommand.h" #include "removepropertiescommand.h"
#include "valueschangedcommand.h" #include "valueschangedcommand.h"
@@ -515,6 +516,15 @@ void NodeInstanceView::customNotification(const AbstractView *view, const QStrin
restartProcess(); 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() void NodeInstanceView::rewriterBeginTransaction()
{ {
@@ -747,7 +757,9 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
QVector<InstanceContainer> instanceContainerList; QVector<InstanceContainer> instanceContainerList;
foreach(const NodeInstance &instance, instanceList) { 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); instanceContainerList.append(container);
} }
@@ -858,7 +870,8 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis
{ {
QVector<InstanceContainer> containerList; QVector<InstanceContainer> containerList;
foreach(const NodeInstance &instance, instanceList) { 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); containerList.append(container);
} }

View File

@@ -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)); QDeclarativeComponent component(context->engine(), QUrl::fromLocalFile(componentPath));
QObject *object = component.beginCreate(context); QObject *object = component.beginCreate(context);
tweakObjects(object); tweakObjects(object);
component.completeCreate(); component.completeCreate();
if (component.isError()) {
qDebug() << componentPath;
foreach(const QDeclarativeError &error, component.errors())
qDebug() << error;
}
return object; return object;
} }
QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context) 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;
}
static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context)
{ {
QObject *object = 0; QObject *object = 0;
QDeclarativeType *type = QDeclarativeMetaType::qmlType(typeName.toUtf8(), majorNumber, minorNumber); QDeclarativeType *type = QDeclarativeMetaType::qmlType(typeName.toUtf8(), majorNumber, minorNumber);
@@ -770,11 +799,13 @@ QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumb
return object; 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; QObject *object = 0;
if (componentPath.isEmpty()) { if (componentPath.isEmpty() && customParserSource.isEmpty()) {
object = createPrimitive(typeName, majorNumber, minorNumber, context); object = createPrimitive(typeName, majorNumber, minorNumber, context);
} else if (componentPath.isEmpty()) {
object = createCustomParserObject(customParserSource, nodeInstanceServer->imports(), context);
} else { } else {
object = createComponent(componentPath, context); object = createComponent(componentPath, context);
} }

View File

@@ -77,7 +77,7 @@ public:
//void setModelNode(const ModelNode &node); //void setModelNode(const ModelNode &node);
static Pointer create(QObject *objectToBeWrapped); 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); void setInstanceId(qint32 id);
qint32 instanceId() const; qint32 instanceId() const;

View File

@@ -196,7 +196,9 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
QDeclarativeContext *context = nodeInstanceServer->context(); 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)); ServerNodeInstance instance(createInstance(object));

View File

@@ -999,6 +999,11 @@ QString NodeMetaInfo::componentFileName() const
return NodeMetaInfo::m_privateData->componentFileName(); return NodeMetaInfo::m_privateData->componentFileName();
} }
bool NodeMetaInfo::hasCustomParser() const
{
return false;
}
bool NodeMetaInfo::availableInVersion(int majorVersion, int minorVersion) const bool NodeMetaInfo::availableInVersion(int majorVersion, int minorVersion) const
{ {
if (majorVersion == -1 && minorVersion == -1) if (majorVersion == -1 && minorVersion == -1)

View File

@@ -80,9 +80,10 @@ RewriterTransaction AbstractView::beginRewriterTransaction()
ModelNode AbstractView::createModelNode(const QString &typeString, ModelNode AbstractView::createModelNode(const QString &typeString,
int majorVersion, int majorVersion,
int minorVersion, 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);
} }

View File

@@ -342,5 +342,15 @@ qint32 InternalNode::internalId() const
return m_internalId; return m_internalId;
} }
void InternalNode::setCustomParserSource(const QString &customParserSource)
{
m_customParserSource = customParserSource;
}
QString InternalNode::customParserSource() const
{
return m_customParserSource;
}
} }
} }

View File

@@ -121,6 +121,9 @@ public:
qint32 internalId() const; qint32 internalId() const;
void setCustomParserSource(const QString&);
QString customParserSource() const;
protected: protected:
Pointer internalPointer() const; Pointer internalPointer() const;
void setInternalWeakPointer(const Pointer &pointer); void setInternalWeakPointer(const Pointer &pointer);
@@ -144,6 +147,8 @@ private:
QHash<QString, InternalPropertyPointer> m_namePropertyHash; QHash<QString, InternalPropertyPointer> m_namePropertyHash;
QStringList m_scriptFunctionList; QStringList m_scriptFunctionList;
QString m_customParserSource;
}; };
uint qHash(const InternalNodePointer& node); uint qHash(const InternalNodePointer& node);

View File

@@ -94,7 +94,7 @@ ModelPrivate::ModelPrivate(Model *model) :
m_writeLock(false), m_writeLock(false),
m_internalIdCounter(1) m_internalIdCounter(1)
{ {
m_rootInternalNode = createNode("QtQuick/Item", 1, 0, PropertyListType(), true); m_rootInternalNode = createNode("QtQuick/Item", 1, 0, PropertyListType(), QString(), true);
} }
ModelPrivate::~ModelPrivate() ModelPrivate::~ModelPrivate()
@@ -202,6 +202,7 @@ InternalNode::Pointer ModelPrivate::createNode(const QString &typeString,
int majorVersion, int majorVersion,
int minorVersion, int minorVersion,
const QList<QPair<QString, QVariant> > &propertyList, const QList<QPair<QString, QVariant> > &propertyList,
const QString &customParserSource,
bool isRootNode) bool isRootNode)
{ {
if (typeString.isEmpty()) if (typeString.isEmpty())
@@ -224,6 +225,9 @@ InternalNode::Pointer ModelPrivate::createNode(const QString &typeString,
m_nodeSet.insert(newInternalNodePointer); m_nodeSet.insert(newInternalNodePointer);
m_internalIdNodeHash.insert(newInternalNodePointer->internalId(), newInternalNodePointer); m_internalIdNodeHash.insert(newInternalNodePointer->internalId(), newInternalNodePointer);
if (!customParserSource.isNull())
newInternalNodePointer->setCustomParserSource(customParserSource);
notifyNodeCreated(newInternalNodePointer); notifyNodeCreated(newInternalNodePointer);
return 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) void ModelPrivate::notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion)
{ {
bool resetModel = false; bool resetModel = false;
@@ -1456,6 +1492,12 @@ void ModelPrivate::setScriptFunctions(const InternalNode::Pointer &internalNode,
notifyScriptFunctionsChanged(internalNode, scriptFunctionList); 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) void ModelPrivate::changeNodeOrder(const InternalNode::Pointer &internalParentNode, const QString &listPropertyName, int from, int to)
{ {
InternalNodeListProperty::Pointer nodeList(internalParentNode->nodeListProperty(listPropertyName)); InternalNodeListProperty::Pointer nodeList(internalParentNode->nodeListProperty(listPropertyName));

View File

@@ -105,6 +105,7 @@ public:
int majorVersion, int majorVersion,
int minorVersion, int minorVersion,
const QList<QPair<QString, QVariant> > &propertyList, const QList<QPair<QString, QVariant> > &propertyList,
const QString &customParserSource,
bool isRootNode = false); bool isRootNode = false);
@@ -142,6 +143,7 @@ public:
void notifyNodeOrderChanged(const InternalNodeListPropertyPointer &internalListPropertyPointer, const InternalNodePointer &internalNodePointer, int oldIndex); void notifyNodeOrderChanged(const InternalNodeListPropertyPointer &internalListPropertyPointer, const InternalNodePointer &internalNodePointer, int oldIndex);
void notifyAuxiliaryDataChanged(const InternalNodePointer &internalNode, const QString &name, const QVariant &data); 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); void notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion);
@@ -194,6 +196,7 @@ public:
void clearParent(const InternalNodePointer &internalNode); void clearParent(const InternalNodePointer &internalNode);
void changeRootNodeType(const QString &type, int majorVersion, int minorVersion); void changeRootNodeType(const QString &type, int majorVersion, int minorVersion);
void setScriptFunctions(const InternalNodePointer &internalNode, const QStringList &scriptFunctionList); void setScriptFunctions(const InternalNodePointer &internalNode, const QStringList &scriptFunctionList);
void setCustomParserSource(const InternalNodePointer &internalNode, const QString &customParserSource);
InternalNodePointer nodeForId(const QString &id) const; InternalNodePointer nodeForId(const QString &id) const;
bool hasId(const QString &id) const; bool hasId(const QString &id) const;

View File

@@ -51,6 +51,7 @@
#include "nodeabstractproperty.h" #include "nodeabstractproperty.h"
#include "nodelistproperty.h" #include "nodelistproperty.h"
#include "nodeproperty.h" #include "nodeproperty.h"
#include <rewriterview.h>
namespace QmlDesigner { namespace QmlDesigner {
using namespace QmlDesigner::Internal; using namespace QmlDesigner::Internal;
@@ -935,4 +936,28 @@ qint32 ModelNode::internalId() const
return m_internalNode->internalId(); 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();
}
} }

View File

@@ -380,6 +380,11 @@ void QmlModelView::importsChanged(const QList<Import> &/*addedImports*/, const Q
} }
void QmlModelView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
{
}
void QmlModelView::rewriterBeginTransaction() void QmlModelView::rewriterBeginTransaction()
{ {

View File

@@ -407,6 +407,11 @@ void RewriterView::instancesChildrenChanged(const QVector<ModelNode> &/*nodeList
} }
void RewriterView::customParserSourceChanged(const ModelNode &, const QString & /*newCustomParserSource*/)
{
}
void RewriterView::rewriterBeginTransaction() void RewriterView::rewriterBeginTransaction()
{ {
transactionLevel++; transactionLevel++;

View File

@@ -264,7 +264,7 @@ static bool isComponentType(const QString &type)
return type == QLatin1String("Component") || type == QLatin1String("Qt.Component") || type == QLatin1String("QtQuick.Component"); 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" || return type == "QtQuick.VisualItemModel" || type == "Qt.VisualItemModel" ||
type == "QtQuick.VisualDataModel" || type == "Qt.VisualDataModel" || type == "QtQuick.VisualDataModel" || type == "Qt.VisualDataModel" ||
@@ -762,8 +762,8 @@ void TextToModelMerger::syncNode(ModelNode &modelNode,
if (isComponentType(typeNameFixedForImplicitComponents)) if (isComponentType(typeNameFixedForImplicitComponents))
setupComponent(modelNode); setupComponent(modelNode);
if (isModelType(typeName)) if (isCustomParserType(typeName))
setupModel(modelNode); setupCustomParserNode(modelNode);
if (modelNode.parentProperty().isValid() && modelNode.type() != typeNameFixedForImplicitComponents //If there is no valid parentProperty if (modelNode.parentProperty().isValid() && modelNode.type() != typeNameFixedForImplicitComponents //If there is no valid parentProperty
//the node has just been created. The type is correct then. //the node has just been created. The type is correct then.
@@ -1102,9 +1102,18 @@ ModelNode TextToModelMerger::createModelNode(const QString &typeName,
ReadingContext *context, ReadingContext *context,
DifferenceHandler &differenceHandler) DifferenceHandler &differenceHandler)
{ {
QString customParserSource;
if (isCustomParserType(typeName))
customParserSource = textAt(context->doc(),
astNode->firstSourceLocation(),
astNode->lastSourceLocation());
ModelNode newNode = m_rewriterView->createModelNode(typeName, ModelNode newNode = m_rewriterView->createModelNode(typeName,
majorVersion, majorVersion,
minorVersion); minorVersion,
PropertyListType(),
customParserSource);
syncNode(newNode, astNode, context, differenceHandler); syncNode(newNode, astNode, context, differenceHandler);
return newNode; return newNode;
} }
@@ -1469,20 +1478,16 @@ void TextToModelMerger::setupComponent(const ModelNode &node)
node.setAuxiliaryData("__component_data", result); 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); QString modelText = m_rewriterView->extractText(QList<ModelNode>() << node).value(node);
if (modelText.isEmpty()) if (modelText.isEmpty())
return; return;
if (node.hasAuxiliaryData("__model_data") ModelNode(node).setCustomParserSource(modelText);
&& node.auxiliaryData("__model_data").toString() == modelText)
return;
node.setAuxiliaryData("__model_data", modelText);
} }
QString TextToModelMerger::textAt(const Document::Ptr &doc, QString TextToModelMerger::textAt(const Document::Ptr &doc,

View File

@@ -122,7 +122,7 @@ public:
DifferenceHandler &differenceHandler); DifferenceHandler &differenceHandler);
void setupComponent(const ModelNode &node); void setupComponent(const ModelNode &node);
void setupModel(const ModelNode &node); void setupCustomParserNode(const ModelNode &node);
private: private:
static QString textAt(const QmlJS::Document::Ptr &doc, static QString textAt(const QmlJS::Document::Ptr &doc,

View File

@@ -256,6 +256,12 @@ void ViewLogger::instancesChildrenChanged(const QVector<ModelNode> &nodeList)
m_output << time() << indent("node: ") << node << endl; 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() void ViewLogger::rewriterBeginTransaction()
{ {
m_output << time() << indent("rewriterBeginTransaction:") << endl; m_output << time() << indent("rewriterBeginTransaction:") << endl;

View File

@@ -81,6 +81,7 @@ public:
void instancesRenderImageChanged(const QVector<ModelNode> &nodeList); void instancesRenderImageChanged(const QVector<ModelNode> &nodeList);
void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList); void instancesPreviewImageChanged(const QVector<ModelNode> &nodeList);
void instancesChildrenChanged(const QVector<ModelNode> &nodeList); void instancesChildrenChanged(const QVector<ModelNode> &nodeList);
void customParserSourceChanged(const ModelNode &modelNode, const QString &newCustomParserSource);
void rewriterBeginTransaction(); void rewriterBeginTransaction();
void rewriterEndTransaction(); void rewriterEndTransaction();