QmlDesigner: Show proper splitter cursor in 3D view

Fixes: QDS-15292
Change-Id: I700825c196a348cbfe55df050822e35cea99d1d7
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Miikka Heikkinen
2025-05-09 14:40:58 +03:00
parent 8590d79401
commit f3cd0191b2
8 changed files with 62 additions and 7 deletions

View File

@@ -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);

View File

@@ -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<Qt::CursorShape>(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");

View File

@@ -155,6 +155,7 @@ private:
void storeCurrentSceneEnvironment();
void setActiveViewport(int viewportIndex);
void setMouseCursor(int mouseCursor);
QPoint resolveToolbarPopupPos(Edit3DAction *action) const;

View File

@@ -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<ImageContainer>(command.data());
QImage image = container.image();

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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,

View File

@@ -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();