From 7c992f5450ddf5b9fdd676c82a4832f092f8fbfa Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 6 Feb 2020 16:30:01 +0200 Subject: [PATCH] QmlDesigner: Insert a node dragged to 3d edit view into correct scene Added scene instance id to the drop command. Change-Id: I42df07fec823083454ad5a70ccafa318d05ab224 Fixes: QDS-1594 Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../commands/drop3dlibraryitemcommand.cpp | 9 ++++++--- .../commands/drop3dlibraryitemcommand.h | 4 +++- .../qml2puppet/instances/nodeinstanceserver.cpp | 5 +++-- .../qml2puppet/instances/nodeinstanceserver.h | 2 +- .../qt5informationnodeinstanceserver.cpp | 12 ++++++++++-- .../designercore/include/qmlvisualnode.h | 4 ++-- .../designercore/instances/nodeinstanceview.cpp | 2 +- .../designercore/model/qmlvisualnode.cpp | 16 ++++++---------- 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp index aa7c8260655..6c851e3a432 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp @@ -29,14 +29,16 @@ namespace QmlDesigner { -Drop3DLibraryItemCommand::Drop3DLibraryItemCommand(const QByteArray &itemData) - : m_itemData(itemData) +Drop3DLibraryItemCommand::Drop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId) + : m_itemData(itemData), + m_sceneRootId(sceneRootId) { } QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command) { out << command.itemData(); + out << command.sceneRootId(); return out; } @@ -44,13 +46,14 @@ QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &comman QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command) { in >> command.m_itemData; + in >> command.m_sceneRootId; return in; } bool operator==(const Drop3DLibraryItemCommand &first, const Drop3DLibraryItemCommand &second) { - return first.m_itemData == second.m_itemData; + return first.m_itemData == second.m_itemData && first.m_sceneRootId == second.m_sceneRootId; } } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h index 1aa11a85f92..4bc36e1ebdb 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h @@ -41,13 +41,15 @@ class Drop3DLibraryItemCommand const Drop3DLibraryItemCommand &second); public: - explicit Drop3DLibraryItemCommand(const QByteArray &itemData); + explicit Drop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId); Drop3DLibraryItemCommand() = default; QByteArray itemData() const { return m_itemData; } + qint32 sceneRootId() const { return m_sceneRootId; } private: QByteArray m_itemData; + qint32 m_sceneRootId; }; QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 5f277bf6bb6..d772844b3c6 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1180,9 +1180,10 @@ ChangeSelectionCommand NodeInstanceServer::createChangeSelectionCommand(const QL return ChangeSelectionCommand(idVector); } -Drop3DLibraryItemCommand NodeInstanceServer::createDrop3DLibraryItemCommand(const QByteArray &itemData) +Drop3DLibraryItemCommand NodeInstanceServer::createDrop3DLibraryItemCommand(const QByteArray &itemData, + qint32 sceneRootId) { - return Drop3DLibraryItemCommand(itemData); + return Drop3DLibraryItemCommand(itemData, sceneRootId); } ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVector &propertyList) const diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index 861b674af9f..1c3ee59791c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -183,7 +183,7 @@ protected: ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList &instanceList) const; ComponentCompletedCommand createComponentCompletedCommand(const QList &instanceList); ChangeSelectionCommand createChangeSelectionCommand(const QList &instanceList); - Drop3DLibraryItemCommand createDrop3DLibraryItemCommand(const QByteArray &itemData); + Drop3DLibraryItemCommand createDrop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId); void addChangedProperty(const InstancePropertyPair &property); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 6e332f8b637..08cd930a575 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -109,8 +109,16 @@ bool Qt5InformationNodeInstanceServer::eventFilter(QObject *, QEvent *event) case QEvent::Drop: { QDropEvent *dropEvent = static_cast(event); QByteArray data = dropEvent->mimeData()->data(QStringLiteral("application/vnd.bauhaus.itemlibraryinfo")); - if (!data.isEmpty()) - nodeInstanceClient()->library3DItemDropped(createDrop3DLibraryItemCommand(data)); + if (!data.isEmpty()) { + ServerNodeInstance sceneInstance; + if (hasInstanceForObject(m_active3DScene)) + sceneInstance = instanceForObject(m_active3DScene); + else if (hasInstanceForObject(m_active3DView)) + sceneInstance = instanceForObject(m_active3DView); + + nodeInstanceClient()->library3DItemDropped(createDrop3DLibraryItemCommand( + data, sceneInstance.instanceId())); + } } break; diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index a4341233331..e573ec1bc99 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -104,9 +104,9 @@ public: static QmlVisualNode createQmlVisualNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - const QVector3D &position); + qint32 sceneRootId, const QVector3D &position); - static NodeListProperty findSceneNodeProperty(AbstractView *view); + static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId); static bool isFlowTransition(const ModelNode &node); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 6b7e6f98e87..49832c1622e 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1451,7 +1451,7 @@ void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &comm QDataStream stream(command.itemData()); ItemLibraryEntry itemLibraryEntry; stream >> itemLibraryEntry; - QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, {}); + QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, command.sceneRootId(), {}); } void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index d53c98f1ff0..ada504908f9 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -296,26 +296,22 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - const QVector3D &position) + qint32 sceneRootId, const QVector3D &position) { - NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view); + NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view, sceneRootId); QTC_ASSERT(sceneNodeProperty.isValid(), return {}); ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode(); return node; } -NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view) +NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId) { QTC_ASSERT(view, return {}); - QList quickViews = view->allModelNodesOfType("QtQuick3D.View3D"); - QTC_ASSERT(!quickViews.isEmpty(), return {}); - const ModelNode quickView = quickViews.first(); - - QList nodes = quickView.directSubModelNodesOfType("QtQuick3D.Node"); - QTC_ASSERT(!nodes.isEmpty(), return {}); - const ModelNode node = nodes.first(); + ModelNode node; + if (view->hasModelNodeForInternalId(sceneRootId)) + node = view->modelNodeForInternalId(sceneRootId); return node.defaultNodeListProperty(); }