From 3d162524e41293d1d75836c1b733169c554cea49 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 8 May 2020 17:22:24 +0300 Subject: [PATCH] QmlDesigner: Add brightness control to light gizmo Brightness can be controlled by dragging on the brightness indicator arrow of the light gizmo in 3D edit view. Change-Id: I317f5ee08b59bcc0bebf3fdf59861df15ef13c84 Fixes: QDS-2039 Reviewed-by: Thomas Hartmann --- .../qmlpuppet/mockfiles/AdjustableArrow.qml | 10 ++-- .../mockfiles/DirectionalDraggable.qml | 35 +++++++------- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 23 +++++++++- .../qml/qmlpuppet/mockfiles/LightGizmo.qml | 38 +++++++++++++-- .../qt5informationnodeinstanceserver.cpp | 46 +++++++++++-------- .../qt5informationnodeinstanceserver.h | 7 +-- 6 files changed, 108 insertions(+), 51 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/AdjustableArrow.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/AdjustableArrow.qml index 8c3473504ac..fc432ef1a80 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/AdjustableArrow.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/AdjustableArrow.qml @@ -27,13 +27,9 @@ import QtQuick 2.0 import QtQuick3D 1.15 import LineGeometry 1.0 -Arrow { +DirectionalDraggable { id: arrowRoot - property real length: 10 - - source: "" - Model { geometry: LineGeometry { id: lineGeometry @@ -41,15 +37,15 @@ Arrow { startPos: Qt.vector3d(0, 0, 0) endPos: Qt.vector3d(0, 1, 0) } - materials: [ arrowRoot.material ] scale: Qt.vector3d(1, arrowRoot.length, 1) + materials: [ arrowRoot.material ] } Model { id: arrowHead source: "#Cone" materials: [ arrowRoot.material ] - y: arrowRoot.length + y: arrowRoot.length - 3 scale: Qt.vector3d(0.02, 0.035, 0.02) } } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml index 87ac0fcaa9a..f1cf60045ff 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml @@ -37,6 +37,7 @@ Model { property bool active: false property MouseArea3D dragHelper: null property alias material: material + property real length: 12 readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering @@ -44,9 +45,9 @@ Model { property real _posPressed property vector3d _targetStartPos - signal pressed(var mouseArea) - signal dragged(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance) - signal released(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance) + signal pressed(var mouseArea, point screenPos) + signal dragged(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance, point screenPos) + signal released(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance, point screenPos) DefaultMaterial { id: material @@ -56,7 +57,7 @@ Model { materials: [ material ] - function handlePressed(mouseArea, planePos) + function handlePressed(mouseArea, planePos, screenPos) { if (!targetNode) return; @@ -65,7 +66,7 @@ Model { _posPressed = planePos.x; _scenePosPressed = mouseArea.dragHelper.mapPositionToScene(maskedPosition); _targetStartPos = mouseArea.pivotScenePosition(targetNode); - pressed(mouseArea); + pressed(mouseArea, screenPos); } function calcRelativeDistance(mouseArea, planePos) @@ -75,20 +76,20 @@ Model { return scenePointerPos.minus(_scenePosPressed); } - function handleDragged(mouseArea, planePos) + function handleDragged(mouseArea, planePos, screenPos) { if (!targetNode) return; - dragged(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed); + dragged(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed, screenPos); } - function handleReleased(mouseArea, planePos) + function handleReleased(mouseArea, planePos, screenPos) { if (!targetNode) return; - released(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed); + released(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed, screenPos); } MouseArea3D { @@ -96,16 +97,16 @@ Model { view3D: rootModel.view3D x: 0 y: -1.5 - width: 12 + width: rootModel.length height: 3 eulerRotation: Qt.vector3d(0, 0, 90) grabsMouse: targetNode active: rootModel.active dragHelper: rootModel.dragHelper - onPressed: rootModel.handlePressed(mouseAreaYZ, planePos) - onDragged: rootModel.handleDragged(mouseAreaYZ, planePos) - onReleased: rootModel.handleReleased(mouseAreaYZ, planePos) + onPressed: rootModel.handlePressed(mouseAreaYZ, planePos, screenPos) + onDragged: rootModel.handleDragged(mouseAreaYZ, planePos, screenPos) + onReleased: rootModel.handleReleased(mouseAreaYZ, planePos, screenPos) } MouseArea3D { @@ -113,16 +114,16 @@ Model { view3D: rootModel.view3D x: 0 y: -1.5 - width: 12 + width: rootModel.length height: 3 eulerRotation: Qt.vector3d(0, 90, 90) grabsMouse: targetNode active: rootModel.active dragHelper: rootModel.dragHelper - onPressed: rootModel.handlePressed(mouseAreaXZ, planePos) - onDragged: rootModel.handleDragged(mouseAreaXZ, planePos) - onReleased: rootModel.handleReleased(mouseAreaXZ, planePos) + onPressed: rootModel.handlePressed(mouseAreaXZ, planePos, screenPos) + onDragged: rootModel.handleDragged(mouseAreaXZ, planePos, screenPos) + onReleased: rootModel.handleReleased(mouseAreaXZ, planePos, screenPos) } } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 83009ff6680..9e11bd4e777 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -456,6 +456,9 @@ Item { targetNode: viewRoot.selectedNode view3D: overlayView dragHelper: gizmoDragHelper + + onBrightnessCommit: viewRoot.commitObjectProperty(viewRoot.selectedNode, "brightness") + onBrightnessChange: viewRoot.changeObjectProperty(viewRoot.selectedNode, "brightness") } AutoScaleHelper { @@ -596,7 +599,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 ""; } @@ -605,6 +608,24 @@ 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 + + Text { + id: lightGizmoLabelText + text: lightGizmo.currentLabel + anchors.centerIn: parent + } + } + EditCameraController { id: cameraControl camera: viewRoot.editView ? viewRoot.editView.camera : null diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml index ca8890626af..a82d5116752 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml @@ -55,6 +55,12 @@ Node { return 100; } } + readonly property bool dragging: primaryArrow.dragging + property point currentMousePos + property string currentLabel + + signal brightnessCommit() + signal brightnessChange() position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0) visible: lightGizmo.targetNode instanceof SpotLight @@ -144,12 +150,38 @@ Node { id: primaryArrow eulerRotation: Qt.vector3d(-90, 0, 0) targetNode: lightGizmo.targetNode - color: lightGizmo.color + color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color view3D: lightGizmo.view3D - active: false + active: lightGizmo.visible dragHelper: lightGizmo.dragHelper scale: autoScale.getScale(Qt.vector3d(5, 5, 5)) - length: lightGizmo.brightnessScale / 10 + length: (lightGizmo.brightnessScale / 10) + 3 + + property real _startBrightness + + function updateBrightness(relativeDistance, screenPos) + { + var currentValue = Math.round(Math.max(0, _startBrightness + relativeDistance * 10)); + var l = Qt.locale(); + lightGizmo.currentLabel = qsTr("brightness: ") + Number(currentValue).toLocaleString(l, 'f', 0); + lightGizmo.currentMousePos = screenPos; + targetNode.brightness = currentValue; + } + + onPressed: { + _startBrightness = targetNode.brightness; + updateBrightness(0, screenPos); + } + + onDragged: { + updateBrightness(relativeDistance, screenPos); + lightGizmo.brightnessChange(); + } + + onReleased: { + updateBrightness(relativeDistance, screenPos); + lightGizmo.brightnessCommit(); + } } DefaultMaterial { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 798baa61acb..9a40bfb9181 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -170,31 +170,37 @@ void Qt5InformationNodeInstanceServer::handleSelectionChanged(const QVariant &ob } QVector -Qt5InformationNodeInstanceServer::vectorToPropertyValue( +Qt5InformationNodeInstanceServer::propertyToPropertyValueTriples( const ServerNodeInstance &instance, const PropertyName &propertyName, const QVariant &variant) { QVector result; - - auto vector3d = variant.value(); - - if (vector3d.isNull()) - return result; - - const PropertyName dot = propertyName.isEmpty() ? "" : "."; - InstancePropertyValueTriple propTriple; - propTriple.instance = instance; - propTriple.propertyName = propertyName + dot + PropertyName("x"); - propTriple.propertyValue = vector3d.x(); - result.append(propTriple); - propTriple.propertyName = propertyName + dot + PropertyName("y"); - propTriple.propertyValue = vector3d.y(); - result.append(propTriple); - propTriple.propertyName = propertyName + dot + PropertyName("z"); - propTriple.propertyValue = vector3d.z(); - result.append(propTriple); + + if (variant.type() == QVariant::Vector3D) { + auto vector3d = variant.value(); + + if (vector3d.isNull()) + return result; + + const PropertyName dot = propertyName.isEmpty() ? "" : "."; + propTriple.instance = instance; + propTriple.propertyName = propertyName + dot + PropertyName("x"); + propTriple.propertyValue = vector3d.x(); + result.append(propTriple); + propTriple.propertyName = propertyName + dot + PropertyName("y"); + propTriple.propertyValue = vector3d.y(); + result.append(propTriple); + propTriple.propertyName = propertyName + dot + PropertyName("z"); + propTriple.propertyValue = vector3d.z(); + result.append(propTriple); + } else { + propTriple.instance = instance; + propTriple.propertyName = propertyName; + propTriple.propertyValue = variant; + result.append(propTriple); + } return result; } @@ -222,7 +228,7 @@ void Qt5InformationNodeInstanceServer::modifyVariantValue( instance.setModifiedFlag(false); // We do have to split position into position.x, position.y, position.z - ValuesModifiedCommand command = createValuesModifiedCommand(vectorToPropertyValue( + ValuesModifiedCommand command = createValuesModifiedCommand(propertyToPropertyValueTriples( instance, targetPropertyName, obj->property(propertyName))); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index 19f7c24c6af..20a1c22da02 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -97,9 +97,10 @@ private: QObject *findView3DForSceneRoot(QObject *sceneRoot) const; QObject *find3DSceneRoot(const ServerNodeInstance &instance) const; QObject *find3DSceneRoot(QObject *obj) const; - QVector vectorToPropertyValue(const ServerNodeInstance &instance, - const PropertyName &propertyName, - const QVariant &variant); + QVector propertyToPropertyValueTriples( + const ServerNodeInstance &instance, + const PropertyName &propertyName, + const QVariant &variant); void modifyVariantValue(const QVariant &node, const PropertyName &propertyName, ValuesModifiedCommand::TransactionOption option);