diff options
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml')
-rw-r--r-- | share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml | 151 |
1 files changed, 126 insertions, 25 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index db8d4fb4ea..2bf81b837f 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -54,7 +54,7 @@ Item { property Node selectedNode: null // This is non-null only in single selection case property var selectedNodes: [] // All selected nodes - property var lightGizmos: [] + property var lightIconGizmos: [] property var cameraGizmos: [] property var selectionBoxes: [] property rect viewPortRect: Qt.rect(0, 0, 1000, 1000) @@ -107,10 +107,22 @@ Item { if (createEditView()) { if (activeScene) { var toolStates = _generalHelper.getToolStates(sceneId); - if (Object.keys(toolStates).length > 0) + if (Object.keys(toolStates).length > 0) { updateToolStates(toolStates, true); - else + } else { + // Don't inherit the edit light state from the previous scene, but rather + // turn the edit light on for scenes that do not have any scene + // lights, and turn it off for scenes that have. + var hasSceneLight = false; + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].scene === activeScene) { + hasSceneLight = true; + break; + } + } + showEditLight = !hasSceneLight; storeCurrentToolStates(); + } } else { // When active scene is deleted, this function gets called by object deletion // handlers without going through setActiveScene, so make sure sceneId is cleared. @@ -141,12 +153,20 @@ Item { _generalHelper.enableItemUpdate(editView, (scene && scene === activeScene)); } + function handleActiveSceneIdChange(newId) + { + if (sceneId !== newId) { + sceneId = newId; + storeCurrentToolStates(); + } + } + function fitToView() { if (editView) { var targetNode = selectionBoxes.length > 0 ? selectionBoxes[0].model : null; - cameraControl.focusObject(targetNode, editView.camera.eulerRotation, true); + cameraControl.focusObject(targetNode, editView.camera.eulerRotation, true, false); } } @@ -278,29 +298,25 @@ Item { function addLightGizmo(scene, obj) { // Insert into first available gizmo - for (var i = 0; i < lightGizmos.length; ++i) { - if (!lightGizmos[i].targetNode) { - lightGizmos[i].scene = scene; - lightGizmos[i].targetNode = obj; + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (!lightIconGizmos[i].targetNode) { + lightIconGizmos[i].scene = scene; + lightIconGizmos[i].targetNode = obj; return; } } // No free gizmos available, create a new one - var gizmoComponent = Qt.createComponent("LightGizmo.qml"); - var modelComponent = Qt.createComponent("LightModel.qml"); - if (gizmoComponent.status === Component.Ready && modelComponent.status === Component.Ready) { - var geometryName = _generalHelper.generateUniqueName("LightGeometry"); - var model = modelComponent.createObject(overlayScene, {"geometryName": geometryName}); + var gizmoComponent = Qt.createComponent("LightIconGizmo.qml"); + if (gizmoComponent.status === Component.Ready) { var gizmo = gizmoComponent.createObject(overlayView, {"view3D": overlayView, "targetNode": obj, "selectedNodes": selectedNodes, "scene": scene, "activeScene": activeScene}); - lightGizmos[lightGizmos.length] = gizmo; + lightIconGizmos[lightIconGizmos.length] = gizmo; gizmo.clicked.connect(handleObjectClicked); gizmo.selectedNodes = Qt.binding(function() {return selectedNodes;}); gizmo.activeScene = Qt.binding(function() {return activeScene;}); - gizmo.connectModel(model); } } @@ -338,10 +354,10 @@ Item { function releaseLightGizmo(obj) { - for (var i = 0; i < lightGizmos.length; ++i) { - if (lightGizmos[i].targetNode === obj) { - lightGizmos[i].scene = null; - lightGizmos[i].targetNode = null; + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].targetNode === obj) { + lightIconGizmos[i].scene = null; + lightIconGizmos[i].targetNode = null; return; } } @@ -360,9 +376,9 @@ Item { function updateLightGizmoScene(scene, obj) { - for (var i = 0; i < lightGizmos.length; ++i) { - if (lightGizmos[i].targetNode === obj) { - lightGizmos[i].scene = scene; + for (var i = 0; i < lightIconGizmos.length; ++i) { + if (lightIconGizmos[i].targetNode === obj) { + lightIconGizmos[i].scene = scene; return; } } @@ -455,6 +471,16 @@ Item { onRotateChange: viewRoot.changeObjectProperty(viewRoot.selectedNode, "eulerRotation") } + LightGizmo { + id: lightGizmo + targetNode: viewRoot.selectedNode + view3D: overlayView + dragHelper: gizmoDragHelper + + onPropertyValueCommit: viewRoot.commitObjectProperty(targetNode, propName) + onPropertyValueChange: viewRoot.changeObjectProperty(targetNode, propName) + } + AutoScaleHelper { id: autoScale view3D: overlayView @@ -517,15 +543,60 @@ Item { MouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton - onClicked: { + hoverEnabled: false + + property MouseArea3D freeDraggerArea + property point pressPoint + property bool initialMoveBlock: false + + onPressed: { if (viewRoot.editView) { var pickResult = viewRoot.editView.pick(mouse.x, mouse.y); handleObjectClicked(_generalHelper.resolvePick(pickResult.objectHit), mouse.modifiers & Qt.ControlModifier); - if (!pickResult.objectHit) + + if (pickResult.objectHit) { + if (transformMode === EditView3D.TransformMode.Move) + freeDraggerArea = moveGizmo.freeDraggerArea; + else if (transformMode === EditView3D.TransformMode.Rotate) + freeDraggerArea = rotateGizmo.freeDraggerArea; + else if (transformMode === EditView3D.TransformMode.Scale) + freeDraggerArea = scaleGizmo.freeDraggerArea; + pressPoint.x = mouse.x; + pressPoint.y = mouse.y; + initialMoveBlock = true; + } else { mouse.accepted = false; + } } } + onPositionChanged: { + if (freeDraggerArea) { + if (initialMoveBlock && Math.abs(pressPoint.x - mouse.x) + Math.abs(pressPoint.y - mouse.y) > 10) { + // Don't force press event at actual press, as that puts the gizmo + // in free-dragging state, which is bad UX if drag is not actually done + freeDraggerArea.forcePressEvent(pressPoint.x, pressPoint.y); + freeDraggerArea.forceMoveEvent(mouse.x, mouse.y); + initialMoveBlock = false; + } else { + freeDraggerArea.forceMoveEvent(mouse.x, mouse.y); + } + } + } + + function handleRelease(mouse) + { + if (freeDraggerArea) { + if (initialMoveBlock) + freeDraggerArea.forceReleaseEvent(pressPoint.x, pressPoint.y); + else + freeDraggerArea.forceReleaseEvent(mouse.x, mouse.y); + freeDraggerArea = null; + } + } + + onReleased: handleRelease(mouse) + onCanceled: handleRelease(mouse) } DropArea { @@ -586,6 +657,7 @@ Item { border.width: 1 visible: rotateGizmo.dragging parent: rotateGizmo.view3D + z: 3 Text { id: rotateGizmoLabelText @@ -593,7 +665,7 @@ Item { var l = Qt.locale(); if (rotateGizmo.targetNode) { var degrees = rotateGizmo.currentAngle * (180 / Math.PI); - return qsTr(Number(degrees).toLocaleString(l, 'f', 1)); + return Number(degrees).toLocaleString(l, 'f', 1); } else { return ""; } @@ -602,6 +674,25 @@ Item { } } + Rectangle { + id: lightGizmoLabel + color: "white" + x: lightGizmo.currentMousePos.x - (10 + width) + y: lightGizmo.currentMousePos.y - (10 + height) + width: lightGizmoLabelText.width + 4 + height: lightGizmoLabelText.height + 4 + border.width: 1 + visible: lightGizmo.dragging + parent: lightGizmo.view3D + z: 3 + + Text { + id: lightGizmoLabelText + text: lightGizmo.currentLabel + anchors.centerIn: parent + } + } + EditCameraController { id: cameraControl camera: viewRoot.editView ? viewRoot.editView.camera : null @@ -619,5 +710,15 @@ Item { editCameraCtrl: cameraControl selectedNode : viewRoot.selectedNodes.length ? selectionBoxes[0].model : null } + + Text { + id: sceneLabel + text: viewRoot.sceneId + anchors.top: parent.top + anchors.left: parent.left + anchors.margins: 4 + font.pixelSize: 14 + color: "white" + } } } |