diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 44e804f25df..e3a4af0b758 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -179,6 +179,8 @@ public: void sanitizeModel(); + void setAllowComponentRoot(bool allow); + bool allowComponentRoot() const; signals: void modelInterfaceProjectUpdated(); @@ -221,6 +223,7 @@ private: //variables bool m_hasIncompleteTypeInformation = false; bool m_restoringAuxData = false; bool m_modelAttachPending = false; + bool m_allowComponentRoot = false; mutable QHash m_canonicalIntModelNode; mutable QHash m_canonicalModelNodeInt; diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index f26c32ad780..a580ee55495 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -249,6 +249,7 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, QScopedPointer rewriterView(new RewriterView(RewriterView::Amend, nullptr)); rewriterView->setCheckSemanticErrors(false); rewriterView->setTextModifier(&modifier); + rewriterView->setAllowComponentRoot(true); inputModel->setRewriterView(rewriterView.data()); if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) { diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 84b3678f5d5..051c449e21a 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -704,6 +704,16 @@ void RewriterView::sanitizeModel() }); } +void RewriterView::setAllowComponentRoot(bool allow) +{ + m_allowComponentRoot = allow; +} + +bool RewriterView::allowComponentRoot() const +{ + return m_allowComponentRoot; +} + Internal::ModelNodePositionStorage *RewriterView::positionStorage() const { return m_positionStorage.data(); diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 3f6a04fde47..b8b2c427692 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1200,7 +1200,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, return; } - if (modelNode.isRootNode() && isComponentType(typeName)) { + if (modelNode.isRootNode() && !m_rewriterView->allowComponentRoot() && isComponentType(typeName)) { for (AST::UiObjectMemberList *iter = astInitializer->members; iter; iter = iter->next) { if (auto def = AST::cast(iter->member)) { syncNode(modelNode, def, context, differenceHandler); diff --git a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.qrc b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.qrc index 8adfb84baf2..21189d1dce3 100644 --- a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.qrc +++ b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.qrc @@ -43,6 +43,8 @@ source/texteditv2.qml source/textinput.qml source/textinputv2.qml + source/component.qml + source/component3d.qml images/column-positioner-icon.png images/column-positioner-icon-16px.png images/default-icon.png diff --git a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo index 851d457cdc3..5ad17c372e2 100644 --- a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo +++ b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo @@ -446,6 +446,28 @@ MetaInfo { category: "e.Qt Quick - Component" libraryIcon: ":/qtquickplugin/images/component-icon.png" version: "2.0" + + QmlSource { source: ":/qtquickplugin/source/component.qml" } + } + } + + Type { + name: "QtQml.Component" + icon: ":/qtquickplugin/images/component-icon16.png" + + Hints { + canBeDroppedInNavigator: true + canBeDroppedInFormEditor: false + } + + ItemLibraryEntry { + name: "Component 3D" + category: "Qt Quick 3D Component" + libraryIcon: ":/qtquickplugin/images/component-icon.png" + version: "2.0" + requiredImport: "QtQuick3D" + + QmlSource { source: ":/qtquickplugin/source/component3d.qml" } } } diff --git a/src/plugins/qmldesigner/qtquickplugin/source/component.qml b/src/plugins/qmldesigner/qtquickplugin/source/component.qml new file mode 100644 index 00000000000..1a3b2770bb1 --- /dev/null +++ b/src/plugins/qmldesigner/qtquickplugin/source/component.qml @@ -0,0 +1,34 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 + +Component { + Item { + id: componentRoot + width: 100 + height: 100 + } +} diff --git a/src/plugins/qmldesigner/qtquickplugin/source/component3d.qml b/src/plugins/qmldesigner/qtquickplugin/source/component3d.qml new file mode 100644 index 00000000000..474497e54b7 --- /dev/null +++ b/src/plugins/qmldesigner/qtquickplugin/source/component3d.qml @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 6.0 + +Component { + Node { + id: componentRoot + } +}