diff options
author | Mahmoud Badri <mahmoud.badri@qt.io> | 2020-03-12 15:55:30 +0200 |
---|---|---|
committer | Mahmoud Badri <mahmoud.badri@qt.io> | 2020-03-13 13:25:58 +0000 |
commit | 11bd2f8debc512cc263b03ccce2186435048f3ba (patch) | |
tree | db8ca287d877009a74e5cc4284aca5f579229676 /src/plugins/qmldesigner/components/integration | |
parent | 38458c3e401d5fcafca6fa5b97fae7dd7c1865f4 (diff) |
Enable Copy, Cut, and Paste in the Editor 3D
Task-number: QDS-1563
Change-Id: I22c3017b8c158d8bc084f050baef89fa8fffd365
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Diffstat (limited to 'src/plugins/qmldesigner/components/integration')
-rw-r--r-- | src/plugins/qmldesigner/components/integration/designdocument.cpp | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 75b45fedb8..e5d7e8978d 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -35,6 +35,8 @@ #include <qmldesignerplugin.h> #include <viewmanager.h> #include <nodeinstanceview.h> +#include "qmldesignerconstants.h" +#include "qmlvisualnode.h" #include <projectexplorer/projecttree.h> #include <projectexplorer/project.h> @@ -44,6 +46,7 @@ #include <qtsupport/qtkitinformation.h> #include <qtsupport/qtsupportconstants.h> #include <qtsupport/qtversionmanager.h> +#include <coreplugin/icore.h> #include <coreplugin/idocument.h> #include <coreplugin/editormanager/editormanager.h> @@ -449,7 +452,7 @@ void DesignDocument::paste() if (rootNode.type() == "empty") return; - if (rootNode.id() == "designer__Selection") { + if (rootNode.id() == "designer__Selection") { // pasting multiple objects currentModel()->attachView(&view); ModelNode targetNode; @@ -458,8 +461,22 @@ void DesignDocument::paste() targetNode = view.selectedModelNodes().constFirst(); //In case we copy and paste a selection we paste in the parent item - if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty()) + if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty()) { targetNode = targetNode.parentProperty().parentModelNode(); + } else { + // if selection is empty and copied nodes are all 3D nodes, paste them under the active scene + bool all3DNodes = std::find_if(selectedNodes.begin(), selectedNodes.end(), + [](const ModelNode &node) { return !node.isSubclassOf("QtQuick3D.Node"); }) + == selectedNodes.end(); + if (all3DNodes) { + int activeSceneId = rootModelNode().auxiliaryData("3d-active-scene").toInt(); + if (activeSceneId != -1) { + NodeListProperty sceneNodeProperty + = QmlVisualNode::findSceneNodeProperty(rootModelNode().view(), activeSceneId); + targetNode = sceneNodeProperty.parentModelNode(); + } + } + } if (!targetNode.isValid()) targetNode = view.rootModelNode(); @@ -487,24 +504,35 @@ void DesignDocument::paste() view.setSelectedModelNodes(pastedNodeList); }); - } else { - rewriterView()->executeInTransaction("DesignDocument::paste1", [this, &view, selectedNodes, rootNode](){ + } else { // pasting single object + rewriterView()->executeInTransaction("DesignDocument::paste1", [this, &view, selectedNodes, rootNode]() { currentModel()->attachView(&view); ModelNode pastedNode(view.insertModel(rootNode)); ModelNode targetNode; - if (!view.selectedModelNodes().isEmpty()) + if (!view.selectedModelNodes().isEmpty()) { targetNode = view.selectedModelNodes().constFirst(); + } else { + // if selection is empty and this is a 3D Node, paste it under the active scene + if (pastedNode.isSubclassOf("QtQuick3D.Node")) { + int activeSceneId = rootModelNode().auxiliaryData("3d-active-scene").toInt(); + if (activeSceneId != -1) { + NodeListProperty sceneNodeProperty + = QmlVisualNode::findSceneNodeProperty(rootModelNode().view(), activeSceneId); + targetNode = sceneNodeProperty.parentModelNode(); + } + } + } if (!targetNode.isValid()) targetNode = view.rootModelNode(); if (targetNode.hasParentProperty() && - (pastedNode.simplifiedTypeName() == targetNode.simplifiedTypeName()) && - (pastedNode.variantProperty("width").value() == targetNode.variantProperty("width").value()) && - (pastedNode.variantProperty("height").value() == targetNode.variantProperty("height").value())) - + pastedNode.simplifiedTypeName() == targetNode.simplifiedTypeName() && + pastedNode.variantProperty("width").value() == targetNode.variantProperty("width").value() && + pastedNode.variantProperty("height").value() == targetNode.variantProperty("height").value()) { targetNode = targetNode.parentProperty().parentModelNode(); + } PropertyName defaultProperty(targetNode.metaInfo().defaultPropertyName()); |