diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-10-30 10:52:51 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-11-01 08:49:12 +0000 |
commit | 97788c457eed2bb7e97eadf87900f9bef9329e78 (patch) | |
tree | dd124e00e52168b36d9d19a23e465e1526a6a3fa /share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml | |
parent | d4797587b12944ccb0880115dc550127e2a1470e (diff) |
QmlDesigner: MoveGizmo improvements in 3D edit view
Mouse press and release are now properly handled by MouseArea3D.
This fixes various issues:
- No need to move the mouse after release for release to register.
- Drag is no longer limited to the 3D edit window, though it is still
limited to the screen.
- Drag arrows no longer register start of drag if you click outside
the arrow and then move the cursor over the arrow while holding the
mouse button down.
Also added the missing center ball to the MoveGizmo to allow free
dragging along the camera plane.
Change-Id: Iab55ae79f8af024534510e5fd29379532ac74025
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml')
-rw-r--r-- | share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml | 151 |
1 files changed, 113 insertions, 38 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml index ded8acc7d3..7ad5a2a011 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml @@ -25,56 +25,131 @@ import QtQuick 2.0 import QtQuick3D 1.0 +import MouseArea3D 1.0 Node { - id: arrows + id: moveGizmo property View3D view3D property bool highlightOnHover: false property Node targetNode: null - readonly property bool isDragging: arrowX.isDragging || arrowY.isDragging || arrowZ.isDragging - - scale: Qt.vector3d(5, 5, 5) + property bool globalOrientation: true + readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging + || centerMouseArea.dragging signal positionCommit() signal positionMove() - Arrow { - id: arrowX - objectName: "Arrow X" - rotation: Qt.vector3d(0, 0, -90) - targetNode: arrows.targetNode - color: highlightOnHover && hovering ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) - : Qt.rgba(1, 0, 0, 1) - view3D: arrows.view3D - - onPositionCommit: arrows.positionCommit() - onPositionMove: arrows.positionMove() - } + Node { + rotation: globalOrientation || !targetNode ? Qt.vector3d(0, 0, 0) : targetNode.sceneRotation + + Arrow { + id: arrowX + objectName: "Arrow X" + rotation: Qt.vector3d(0, 0, -90) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: moveGizmo.view3D + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + Arrow { + id: arrowY + objectName: "Arrow Y" + rotation: Qt.vector3d(0, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: moveGizmo.view3D + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + Arrow { + id: arrowZ + objectName: "Arrow Z" + rotation: Qt.vector3d(90, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: moveGizmo.view3D + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } - Arrow { - id: arrowY - objectName: "Arrow Y" - rotation: Qt.vector3d(0, 0, 0) - targetNode: arrows.targetNode - color: highlightOnHover && hovering ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) - : Qt.rgba(0, 0, 1, 1) - view3D: arrows.view3D - - onPositionCommit: arrows.positionCommit() - onPositionMove: arrows.positionMove() } - Arrow { - id: arrowZ - objectName: "Arrow Z" - rotation: Qt.vector3d(90, 0, 0) - targetNode: arrows.targetNode - color: highlightOnHover && hovering ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) - : Qt.rgba(0, 0.6, 0, 1) - view3D: arrows.view3D - - onPositionCommit: arrows.positionCommit() - onPositionMove: arrows.positionMove() + Model { + id: centerBall + + source: "#Sphere" + scale: Qt.vector3d(0.024, 0.024, 0.024) + materials: DefaultMaterial { + id: material + emissiveColor: highlightOnHover + && (centerMouseArea.hovering || centerMouseArea.dragging) + ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) + : Qt.rgba(0.5, 0.5, 0.5, 1) + lighting: DefaultMaterial.NoLighting + } + + MouseArea3D { + id: centerMouseArea + view3D: moveGizmo.view3D + x: -60 + y: -60 + width: 120 + height: 120 + rotation: view3D.camera.rotation + grabsMouse: moveGizmo.targetNode + priority: 1 + + property var _pointerPosPressed + property var _targetStartPos + + function posInParent(pointerPosition) + { + var scenePointerPos = mapPositionToScene(pointerPosition); + var sceneRelativeDistance = Qt.vector3d( + scenePointerPos.x - _pointerPosPressed.x, + scenePointerPos.y - _pointerPosPressed.y, + scenePointerPos.z - _pointerPosPressed.z); + + var newScenePos = Qt.vector3d( + _targetStartPos.x + sceneRelativeDistance.x, + _targetStartPos.y + sceneRelativeDistance.y, + _targetStartPos.z + sceneRelativeDistance.z); + + return moveGizmo.targetNode.parent.mapPositionFromScene(newScenePos); + } + + onPressed: { + if (!moveGizmo.targetNode) + return; + + _pointerPosPressed = mapPositionToScene(pointerPosition); + var sp = moveGizmo.targetNode.scenePosition; + _targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z); + } + onDragged: { + if (!moveGizmo.targetNode) + return; + + moveGizmo.targetNode.position = posInParent(pointerPosition); + moveGizmo.positionMove(); + } + onReleased: { + if (!moveGizmo.targetNode) + return; + + moveGizmo.targetNode.position = posInParent(pointerPosition); + moveGizmo.positionCommit(); + } + } } } |