From f3cd0191b22dda36c2f0b471683ce81b687b629e Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 9 May 2025 14:40:58 +0300 Subject: [PATCH] QmlDesigner: Show proper splitter cursor in 3D view Fixes: QDS-15292 Change-Id: I700825c196a348cbfe55df050822e35cea99d1d7 Reviewed-by: Mahmoud Badri --- .../commands/puppettocreatorcommand.h | 15 ++++++++------- .../components/edit3d/edit3dview.cpp | 17 +++++++++++++++++ .../components/edit3d/edit3dview.h | 1 + .../instances/nodeinstanceview.cpp | 5 +++++ .../qmlpuppet/mockfiles/qt6/EditView3D.qml | 19 +++++++++++++++++++ .../mockfiles/qt6/ViewportResizer.qml | 3 +++ .../qt5informationnodeinstanceserver.cpp | 8 ++++++++ .../qt5informationnodeinstanceserver.h | 1 + 8 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/libs/qmlpuppetcommunication/commands/puppettocreatorcommand.h b/src/libs/qmlpuppetcommunication/commands/puppettocreatorcommand.h index 44d68f9ed29..dded30e4203 100644 --- a/src/libs/qmlpuppetcommunication/commands/puppettocreatorcommand.h +++ b/src/libs/qmlpuppetcommunication/commands/puppettocreatorcommand.h @@ -13,19 +13,20 @@ class PuppetToCreatorCommand { public: enum Type { - Edit3DToolState, - Render3DView, + None, ActiveSceneChanged, ActiveViewportChanged, - RenderModelNodePreviewImage, + BakeLightsAborted, + BakeLightsFinished, + BakeLightsProgress, + Edit3DMouseCursor, + Edit3DToolState, Import3DPreviewIcon, Import3DPreviewImage, Import3DSupport, NodeAtPos, - BakeLightsProgress, - BakeLightsFinished, - BakeLightsAborted, - None + Render3DView, + RenderModelNodePreviewImage }; PuppetToCreatorCommand(Type type, const QVariant &data); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 37c9c66f542..5f6605db319 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -87,6 +87,14 @@ void Edit3DView::checkImports() edit3DWidget()->showCanvas(model()->hasImport("QtQuick3D")); } +void Edit3DView::setMouseCursor(int mouseCursor) +{ + if (mouseCursor < 0) + m_edit3DWidget->canvas()->unsetCursor(); + else + m_edit3DWidget->canvas()->setCursor(QCursor(static_cast(mouseCursor))); +} + WidgetInfo Edit3DView::widgetInfo() { if (!m_edit3DWidget) @@ -131,6 +139,15 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) setActiveViewport(0); } + const QString mouseCursorKey = QStringLiteral("mouseCursor"); + if (sceneState.contains(mouseCursorKey)) { + setMouseCursor(sceneState[mouseCursorKey].toInt()); + if (sceneState.size() == 1) + return; + } else { + setMouseCursor(-1); + } + const QString sceneKey = QStringLiteral("sceneInstanceId"); const QString selectKey = QStringLiteral("selectionMode"); const QString transformKey = QStringLiteral("transformMode"); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index 1c5d478357d..dc0aad559b5 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -155,6 +155,7 @@ private: void storeCurrentSceneEnvironment(); void setActiveViewport(int viewportIndex); + void setMouseCursor(int mouseCursor); QPoint resolveToolbarPopupPos(Edit3DAction *action) const; diff --git a/src/plugins/qmldesigner/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/instances/nodeinstanceview.cpp index a2d220e3110..3f3a29047f2 100644 --- a/src/plugins/qmldesigner/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/instances/nodeinstanceview.cpp @@ -1817,6 +1817,11 @@ void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand viewportState.insert("activeViewport", command.data()); if (isAttached()) model()->emitUpdateActiveScene3D(this, viewportState); + } else if (command.type() == PuppetToCreatorCommand::Edit3DMouseCursor) { + QVariantMap viewportState; + viewportState.insert("mouseCursor", command.data()); + if (isAttached()) + model()->emitUpdateActiveScene3D(this, viewportState); } else if (command.type() == PuppetToCreatorCommand::RenderModelNodePreviewImage) { ImageContainer container = qvariant_cast(command.data()); QImage image = container.image(); diff --git a/src/tools/qmlpuppet/mockfiles/qt6/EditView3D.qml b/src/tools/qmlpuppet/mockfiles/qt6/EditView3D.qml index 3fd8d983137..0d222de47d7 100644 --- a/src/tools/qmlpuppet/mockfiles/qt6/EditView3D.qml +++ b/src/tools/qmlpuppet/mockfiles/qt6/EditView3D.qml @@ -43,6 +43,7 @@ Item { property bool flyMode: false property bool showCameraSpeed: false property string cameraViewMode + property int mouseCursor: -1 // The presets used to customize the display of the viewports property var viewportPresets: { @@ -116,6 +117,7 @@ Item { signal changeObjectProperty(var objects, var propNames) signal notifyActiveSceneChange() signal notifyActiveViewportChange(int index) + signal notifyMouseCursorChange(int cursor) onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective) onShowEditLightChanged: _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight) @@ -132,6 +134,8 @@ Item { onTransformModeChanged: _generalHelper.storeToolState(sceneId, "transformMode", transformMode); onMaterialOverridesChanged: _generalHelper.storeToolState(sceneId, "matOverride", materialOverrides); onShowWireframesChanged: _generalHelper.storeToolState(sceneId, "showWireframe", showWireframes); + onMouseCursorChanged: notifyMouseCursorChange(viewRoot.mouseCursor) + onActivePresetChanged: { _generalHelper.storeToolState(sceneId, "activePreset", activePreset); _generalHelper.requestOverlayUpdate(); @@ -757,6 +761,7 @@ Item { updateSplitResizers(); cameraView.updateSnapping(); + viewRoot.updateMouseCursor(); } // Updates the position, size, and visibility of viewports based on the selected @@ -843,6 +848,16 @@ Item { _generalHelper.requestOverlayUpdate(); } + function updateMouseCursor() + { + if (verticalResizer.containsMouse || verticalResizer.dragActive) + viewRoot.mouseCursor = Qt.SplitHCursor + else if (horizontalResizer.containsMouse || horizontalResizer.dragActive) + viewRoot.mouseCursor = Qt.SplitVCursor + else + viewRoot.mouseCursor = -1 + } + Component.onCompleted: { createEditViews(); selectObjects([]); @@ -1081,6 +1096,8 @@ Item { dividerX = value; updateViewRects(); } + onContainsMouseChanged: viewRoot.updateMouseCursor() + onDragActiveChanged: viewRoot.updateMouseCursor() } // Horizontal divider (top/bottom) @@ -1098,6 +1115,8 @@ Item { dividerY = value; updateViewRects(); } + onContainsMouseChanged: viewRoot.updateMouseCursor() + onDragActiveChanged: viewRoot.updateMouseCursor() } MouseArea { diff --git a/src/tools/qmlpuppet/mockfiles/qt6/ViewportResizer.qml b/src/tools/qmlpuppet/mockfiles/qt6/ViewportResizer.qml index 504aceef5b9..795ca303506 100644 --- a/src/tools/qmlpuppet/mockfiles/qt6/ViewportResizer.qml +++ b/src/tools/qmlpuppet/mockfiles/qt6/ViewportResizer.qml @@ -10,6 +10,8 @@ Item { property real divider property real containerSize property int orientation + readonly property alias containsMouse: mouseArea.containsMouse + readonly property alias dragActive: mouseArea.drag.active property real _dragMin: containerSize * 0.1 property real _dragMax: containerSize * 0.9 @@ -31,6 +33,7 @@ Item { drag.minimumY: _dragMin drag.maximumY: _dragMax drag.smoothed: true + hoverEnabled: true onPositionChanged: { var deltaPx = (orientation === Qt.Vertical ? root.x : root.y) + grabSize; diff --git a/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.cpp index 99928dfe681..db5d6b0a35d 100644 --- a/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.cpp +++ b/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.cpp @@ -962,6 +962,12 @@ void Qt5InformationNodeInstanceServer::handleActiveViewportChange(int index) index}); } +void Qt5InformationNodeInstanceServer::handleMouseCursorChange(int cursor) +{ + nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::Edit3DMouseCursor, + cursor}); +} + void Qt5InformationNodeInstanceServer::handleToolStateChanged(const QString &sceneId, const QString &tool, const QVariant &toolState) @@ -1968,6 +1974,8 @@ void Qt5InformationNodeInstanceServer::setup3DEditView( this, SLOT(handleActiveSceneChange())); QObject::connect(m_editView3DData.rootItem, SIGNAL(notifyActiveViewportChange(int)), this, SLOT(handleActiveViewportChange(int))); + QObject::connect(m_editView3DData.rootItem, SIGNAL(notifyMouseCursorChange(int)), + this, SLOT(handleMouseCursorChange(int))); QObject::connect(&m_propertyChangeTimer, &QTimer::timeout, this, &Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout); QObject::connect(&m_selectionChangeTimer, &QTimer::timeout, diff --git a/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.h b/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.h index 3f93ca5aebc..c7ab530d165 100644 --- a/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.h +++ b/src/tools/qmlpuppet/qmlpuppet/instances/qt5informationnodeinstanceserver.h @@ -67,6 +67,7 @@ private slots: void handleObjectPropertyChange(const QVariant &objects, const QVariant &propNames); void handleActiveSceneChange(); void handleActiveViewportChange(int index); + void handleMouseCursorChange(int cursor); void handleToolStateChanged(const QString &sceneId, const QString &tool, const QVariant &toolState); void handleView3DSizeChange();