From 6b8ffcfca810be760f9a665ae855042a040c1215 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 24 Jun 2011 16:35:01 +0200 Subject: [PATCH] QmlDesigner.model: allow creating items from qml code in library Change-Id: I2fe7cbe594b6aac6cbf01f283a0ed0f2aec753a8 Reviewed-on: http://codereview.qt.nokia.com/720 Reviewed-by: Qt Sanity Bot Reviewed-by: Thomas Hartmann --- .../designercore/include/metainfoparser.h | 1 + .../designercore/model/qmlmodelview.cpp | 36 ++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/metainfoparser.h b/src/plugins/qmldesigner/designercore/include/metainfoparser.h index 0de6958a1f..28c904ec16 100644 --- a/src/plugins/qmldesigner/designercore/include/metainfoparser.h +++ b/src/plugins/qmldesigner/designercore/include/metainfoparser.h @@ -61,6 +61,7 @@ protected: void handleNodeElement(QXmlStreamReader &reader); void handleNodeItemLibraryEntryElement(QXmlStreamReader &reader, const QString &className, const QIcon &icon); void handleItemLibraryEntryPropertyElement(QXmlStreamReader &reader, ItemLibraryEntry &itemLibraryEntry); + void handleItemLibraryEntryQmlElement(QXmlStreamReader &reader, ItemLibraryEntry &itemLibraryEntry); private: MetaInfo m_metaInfo; diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index b34edbb42b..a147a6ef13 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -40,9 +40,14 @@ #include #include #include +#include +#include #include "nodeabstractproperty.h" #include "variantproperty.h" #include "rewritingexception.h" +#include "rewriterview.h" +#include "plaintexteditmodifier.h" +#include "modelmerger.h" namespace QmlDesigner { @@ -200,10 +205,35 @@ QmlItemNode QmlModelView::createQmlItemNode(const ItemLibraryEntry &itemLibraryE propertyPairList.append(qMakePair(QString("x"), QVariant(round(position.x(), 4)))); propertyPairList.append(qMakePair(QString("y"), QVariant(round(position.y(), 4)))); - foreach (const PropertyContainer &property, itemLibraryEntry.properties()) - propertyPairList.append(qMakePair(property.name(), property.value())); + if (itemLibraryEntry.qml().isEmpty()) { + foreach (const PropertyContainer &property, itemLibraryEntry.properties()) + propertyPairList.append(qMakePair(property.name(), property.value())); + + newNode = createQmlItemNode(itemLibraryEntry.typeName(), itemLibraryEntry.majorVersion(), itemLibraryEntry.minorVersion(), propertyPairList); + } else { + QScopedPointer inputModel(Model::create("QtQuick.Rectangle", 1, 0, model())); + inputModel->setFileUrl(model()->fileUrl()); + QPlainTextEdit textEdit; + + + textEdit.setPlainText(Utils::FileReader::fetchQrc(itemLibraryEntry.qml())); + NotIndentingTextEditModifier modifier(&textEdit); + + QScopedPointer rewriterView(new RewriterView(RewriterView::Amend, 0)); + rewriterView->setCheckSemanticErrors(false); + rewriterView->setTextModifier(&modifier); + inputModel->attachView(rewriterView.data()); + + if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) { + ModelMerger merger(this); + newNode = merger.insertModel(rewriterView->rootModelNode()); + newNode.setVariantProperty("x", propertyPairList.first().second); + newNode.setVariantProperty("y", propertyPairList.at(1).second); + } + + } + - newNode = createQmlItemNode(itemLibraryEntry.typeName(), itemLibraryEntry.majorVersion(), itemLibraryEntry.minorVersion(), propertyPairList); if (parentNode.hasDefaultProperty()) { parentNode.nodeAbstractProperty(parentNode.defaultProperty()).reparentHere(newNode); } -- 2.11.0