From 3837c07711885128cad386a65e875e286f900e0c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 8 Nov 2019 13:37:42 +0100 Subject: [PATCH] QmlDesigner: Move createQmlObjectNode to QmlVisualNode Change-Id: I6de1f84b54b0ee2489002c6d6e572c826de761ef Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../designercore/include/qmlitemnode.h | 9 +- .../designercore/include/qmlvisualnode.h | 9 ++ .../designercore/model/qmlitemnode.cpp | 69 ------------ .../designercore/model/qmlvisualnode.cpp | 104 ++++++++++++++++++ 4 files changed, 114 insertions(+), 77 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index 0c6693f5059..c075483c2c8 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -57,14 +57,7 @@ public: const QPointF &position, QmlItemNode parentQmlItemNode); - static QmlObjectNode createQmlObjectNode(AbstractView *view, - const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, - QmlItemNode parentQmlItemNode); - static QmlObjectNode createQmlObjectNode(AbstractView *view, - const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, - NodeAbstractProperty parentproperty); + static QmlItemNode createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index 49785d0398b..b0cda6b7de1 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -65,6 +65,15 @@ public: bool visibilityOverride() const; static bool isItemOr3DNode(const ModelNode &modelNode); + + static QmlObjectNode createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QPointF &position, + QmlItemNode parentQmlItemNode); + static QmlObjectNode createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QPointF &position, + NodeAbstractProperty parentproperty); }; QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node); diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 2fc530ff10d..c65a57d34f0 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -93,75 +93,6 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, return QmlItemNode(createQmlObjectNode(view, itemLibraryEntry, position, parentQmlItemNode)); } -QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode) -{ - if (!parentQmlItemNode.isValid()) - parentQmlItemNode = QmlItemNode(view->rootModelNode()); - - Q_ASSERT(parentQmlItemNode.isValid()); - - NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty(); - - return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty); -} - -QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, NodeAbstractProperty parentproperty) -{ - QmlObjectNode newQmlObjectNode; - - view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){ - NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); - - int minorVersion = metaInfo.minorVersion(); - int majorVersion = metaInfo.majorVersion(); - - using PropertyBindingEntry = QPair; - QList propertyBindingList; - QList propertyEnumList; - if (itemLibraryEntry.qmlSource().isEmpty()) { - QList > propertyPairList; - if (!position.isNull()) { - propertyPairList.append({PropertyName("x"), QVariant(qRound(position.x()))}); - propertyPairList.append({PropertyName("y"), QVariant(qRound(position.y()))}); - } - - for (const auto &property : itemLibraryEntry.properties()) { - if (property.type() == QStringLiteral("binding")) { - propertyBindingList.append(PropertyBindingEntry(property.name(), property.value().toString())); - } else if (property.type() == QStringLiteral("enum")) { - propertyEnumList.append(PropertyBindingEntry(property.name(), property.value().toString())); - } else { - propertyPairList.append({property.name(), property.value()}); - } - } - - newQmlObjectNode = QmlItemNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); - } else { - newQmlObjectNode = createQmlItemNodeFromSource(view, itemLibraryEntry.qmlSource(), position); - } - - if (parentproperty.isValid()) - parentproperty.reparentHere(newQmlObjectNode); - - if (!newQmlObjectNode.isValid()) - return; - - newQmlObjectNode.setId(view->generateNewId(itemLibraryEntry.name())); - - for (const auto &propertyBindingEntry : propertyBindingList) - newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second); - - for (const auto &propertyBindingEntry : propertyEnumList) - newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); - - Q_ASSERT(newQmlObjectNode.isValid()); - }); - - Q_ASSERT(newQmlObjectNode.isValid()); - - return newQmlObjectNode; -} - QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, QmlItemNode parentQmlItemNode) { if (!parentQmlItemNode.isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index d0598e844ed..ba7587e1dbe 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -174,6 +174,110 @@ QmlModelStateGroup QmlVisualNode::states() const return QmlModelStateGroup(); } +QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QPointF &position, + QmlItemNode parentQmlItemNode) +{ + if (!parentQmlItemNode.isValid()) + parentQmlItemNode = QmlItemNode(view->rootModelNode()); + + Q_ASSERT(parentQmlItemNode.isValid()); + + NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty(); + + return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty); +} + + +static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, const QString &source, const QPointF &position) +{ + QScopedPointer inputModel(Model::create("QtQuick.Item", 1, 0, view->model())); + inputModel->setFileUrl(view->model()->fileUrl()); + QPlainTextEdit textEdit; + + textEdit.setPlainText(source); + NotIndentingTextEditModifier modifier(&textEdit); + + QScopedPointer rewriterView(new RewriterView(RewriterView::Amend, nullptr)); + rewriterView->setCheckSemanticErrors(false); + rewriterView->setTextModifier(&modifier); + inputModel->setRewriterView(rewriterView.data()); + + if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) { + ModelNode rootModelNode = rewriterView->rootModelNode(); + inputModel->detachView(rewriterView.data()); + + rootModelNode.variantProperty("x").setValue(qRound(position.x())); + rootModelNode.variantProperty("y").setValue(qRound(position.y())); + + ModelMerger merger(view); + return merger.insertModel(rootModelNode); + } + + return {}; +} + +QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QPointF &position, + NodeAbstractProperty parentproperty) +{ + QmlObjectNode newQmlObjectNode; + + view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){ + NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); + + int minorVersion = metaInfo.minorVersion(); + int majorVersion = metaInfo.majorVersion(); + + using PropertyBindingEntry = QPair; + QList propertyBindingList; + QList propertyEnumList; + if (itemLibraryEntry.qmlSource().isEmpty()) { + QList > propertyPairList; + if (!position.isNull()) { + propertyPairList.append({"x", QVariant(qRound(position.x()))}); + propertyPairList.append({"y", QVariant(qRound(position.y()))}); + } + + for (const auto &property : itemLibraryEntry.properties()) { + if (property.type() == "binding") { + propertyBindingList.append(PropertyBindingEntry(property.name(), property.value().toString())); + } else if (property.type() == "enum") { + propertyEnumList.append(PropertyBindingEntry(property.name(), property.value().toString())); + } else { + propertyPairList.append({property.name(), property.value()}); + } + } + + newQmlObjectNode = QmlObjectNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); + } else { + newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position); + } + + if (parentproperty.isValid()) + parentproperty.reparentHere(newQmlObjectNode); + + if (!newQmlObjectNode.isValid()) + return; + + newQmlObjectNode.setId(view->generateNewId(itemLibraryEntry.name())); + + for (const auto &propertyBindingEntry : propertyBindingList) + newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second); + + for (const auto &propertyBindingEntry : propertyEnumList) + newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); + + Q_ASSERT(newQmlObjectNode.isValid()); + }); + + Q_ASSERT(newQmlObjectNode.isValid()); + + return newQmlObjectNode; +} + QList toModelNodeList(const QList &qmlVisualNodeList) { QList modelNodeList;