From 4e95d171e2851b08bfab4032ef8a93ce331b90e3 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 Aug 2024 17:38:50 +0300 Subject: [PATCH] QmlDesigner: Fix triggering "Edit in 3D view" from 2D view If activating another view hides 2D view, 2D view detaches, which caused custom notification to not be sent as view no longer had model. Refactored the relevant cases to store node's internal id before the view gets detached and emit notification directly via model pointer. Fixes: QDS-13402 Change-Id: I21400646aed8871474a4618da69ba8a001bad361 Reviewed-by: Mahmoud Badri --- .../components/componentcore/modelnodeoperations.cpp | 9 ++++++--- src/plugins/qmldesigner/components/edit3d/edit3dview.cpp | 6 +++--- .../qmldesigner/components/formeditor/view3dtool.cpp | 6 ++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 9b4f6b134dd..c17926b9283 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -1695,12 +1695,15 @@ void editIn3dView(const SelectionContext &selectionContext) } if (targetNode.isValid()) { + qint32 id = targetNode.internalId(); + Model *model = selectionContext.model(); QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("Editor3D", true); if (scenePos.isNull()) { - selectionContext.model()->emitView3DAction(View3DActionType::AlignViewToCamera, true); + model->emitView3DAction(View3DActionType::AlignViewToCamera, true); } else { - selectionContext.view()->emitCustomNotification("pick_3d_node_from_2d_scene", - {targetNode}, {scenePos}); + model->emitCustomNotification(selectionContext.view(), + "pick_3d_node_from_2d_scene", + {}, {scenePos, id}); } } } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 8f9d5fd9cbd..ed86218d37b 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -456,16 +456,16 @@ void Edit3DView::customNotification([[maybe_unused]] const AbstractView *view, [[maybe_unused]] const QList &nodeList, [[maybe_unused]] const QList &data) { - if (identifier == "pick_3d_node_from_2d_scene" && data.size() == 1 && nodeList.size() == 1) { + if (identifier == "pick_3d_node_from_2d_scene" && data.size() == 2) { // Pick via 2D view, data has pick coordinates in main scene coordinates QTimer::singleShot(0, this, [=, self = QPointer{this}]() { if (!self) return; self->emitView3DAction(View3DActionType::GetNodeAtMainScenePos, - QVariantList{data[0], nodeList[0].internalId()}); + QVariantList{data[0], data[1]}); self->m_nodeAtPosReqType = NodeAtPosReqType::MainScenePick; - self->m_pickView3dNode = nodeList[0]; + self->m_pickView3dNode = self->modelNodeForInternalId(qint32(data[1].toInt())); }); } } diff --git a/src/plugins/qmldesigner/components/formeditor/view3dtool.cpp b/src/plugins/qmldesigner/components/formeditor/view3dtool.cpp index a494d467752..841c68b8633 100644 --- a/src/plugins/qmldesigner/components/formeditor/view3dtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/view3dtool.cpp @@ -54,9 +54,11 @@ void View3DTool::mouseReleaseEvent(const QList &, QGraphicsSceneMouseEvent *event) { if (m_view3dNode.isValid()) { + Model *model = view()->model(); + qint32 id = m_view3dNode.internalId(); QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("Editor3D", true); - view()->emitCustomNotification("pick_3d_node_from_2d_scene", - {m_view3dNode}, {event->scenePos()}); + model->emitCustomNotification(view(), "pick_3d_node_from_2d_scene", + {}, {event->scenePos(), id}); } view()->changeToSelectionTool();