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 <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2020-05-08 17:22:24 +03:00
parent a3e6e24427
commit 3d162524e4
6 changed files with 108 additions and 51 deletions

View File

@@ -27,13 +27,9 @@ import QtQuick 2.0
import QtQuick3D 1.15 import QtQuick3D 1.15
import LineGeometry 1.0 import LineGeometry 1.0
Arrow { DirectionalDraggable {
id: arrowRoot id: arrowRoot
property real length: 10
source: ""
Model { Model {
geometry: LineGeometry { geometry: LineGeometry {
id: lineGeometry id: lineGeometry
@@ -41,15 +37,15 @@ Arrow {
startPos: Qt.vector3d(0, 0, 0) startPos: Qt.vector3d(0, 0, 0)
endPos: Qt.vector3d(0, 1, 0) endPos: Qt.vector3d(0, 1, 0)
} }
materials: [ arrowRoot.material ]
scale: Qt.vector3d(1, arrowRoot.length, 1) scale: Qt.vector3d(1, arrowRoot.length, 1)
materials: [ arrowRoot.material ]
} }
Model { Model {
id: arrowHead id: arrowHead
source: "#Cone" source: "#Cone"
materials: [ arrowRoot.material ] materials: [ arrowRoot.material ]
y: arrowRoot.length y: arrowRoot.length - 3
scale: Qt.vector3d(0.02, 0.035, 0.02) scale: Qt.vector3d(0.02, 0.035, 0.02)
} }
} }

View File

@@ -37,6 +37,7 @@ Model {
property bool active: false property bool active: false
property MouseArea3D dragHelper: null property MouseArea3D dragHelper: null
property alias material: material property alias material: material
property real length: 12
readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering
@@ -44,9 +45,9 @@ Model {
property real _posPressed property real _posPressed
property vector3d _targetStartPos property vector3d _targetStartPos
signal pressed(var mouseArea) signal pressed(var mouseArea, point screenPos)
signal dragged(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance) signal dragged(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance, point screenPos)
signal released(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance) signal released(var mouseArea, vector3d sceneRelativeDistance, real relativeDistance, point screenPos)
DefaultMaterial { DefaultMaterial {
id: material id: material
@@ -56,7 +57,7 @@ Model {
materials: [ material ] materials: [ material ]
function handlePressed(mouseArea, planePos) function handlePressed(mouseArea, planePos, screenPos)
{ {
if (!targetNode) if (!targetNode)
return; return;
@@ -65,7 +66,7 @@ Model {
_posPressed = planePos.x; _posPressed = planePos.x;
_scenePosPressed = mouseArea.dragHelper.mapPositionToScene(maskedPosition); _scenePosPressed = mouseArea.dragHelper.mapPositionToScene(maskedPosition);
_targetStartPos = mouseArea.pivotScenePosition(targetNode); _targetStartPos = mouseArea.pivotScenePosition(targetNode);
pressed(mouseArea); pressed(mouseArea, screenPos);
} }
function calcRelativeDistance(mouseArea, planePos) function calcRelativeDistance(mouseArea, planePos)
@@ -75,20 +76,20 @@ Model {
return scenePointerPos.minus(_scenePosPressed); return scenePointerPos.minus(_scenePosPressed);
} }
function handleDragged(mouseArea, planePos) function handleDragged(mouseArea, planePos, screenPos)
{ {
if (!targetNode) if (!targetNode)
return; 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) if (!targetNode)
return; return;
released(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed); released(mouseArea, calcRelativeDistance(mouseArea, planePos), planePos.x - _posPressed, screenPos);
} }
MouseArea3D { MouseArea3D {
@@ -96,16 +97,16 @@ Model {
view3D: rootModel.view3D view3D: rootModel.view3D
x: 0 x: 0
y: -1.5 y: -1.5
width: 12 width: rootModel.length
height: 3 height: 3
eulerRotation: Qt.vector3d(0, 0, 90) eulerRotation: Qt.vector3d(0, 0, 90)
grabsMouse: targetNode grabsMouse: targetNode
active: rootModel.active active: rootModel.active
dragHelper: rootModel.dragHelper dragHelper: rootModel.dragHelper
onPressed: rootModel.handlePressed(mouseAreaYZ, planePos) onPressed: rootModel.handlePressed(mouseAreaYZ, planePos, screenPos)
onDragged: rootModel.handleDragged(mouseAreaYZ, planePos) onDragged: rootModel.handleDragged(mouseAreaYZ, planePos, screenPos)
onReleased: rootModel.handleReleased(mouseAreaYZ, planePos) onReleased: rootModel.handleReleased(mouseAreaYZ, planePos, screenPos)
} }
MouseArea3D { MouseArea3D {
@@ -113,16 +114,16 @@ Model {
view3D: rootModel.view3D view3D: rootModel.view3D
x: 0 x: 0
y: -1.5 y: -1.5
width: 12 width: rootModel.length
height: 3 height: 3
eulerRotation: Qt.vector3d(0, 90, 90) eulerRotation: Qt.vector3d(0, 90, 90)
grabsMouse: targetNode grabsMouse: targetNode
active: rootModel.active active: rootModel.active
dragHelper: rootModel.dragHelper dragHelper: rootModel.dragHelper
onPressed: rootModel.handlePressed(mouseAreaXZ, planePos) onPressed: rootModel.handlePressed(mouseAreaXZ, planePos, screenPos)
onDragged: rootModel.handleDragged(mouseAreaXZ, planePos) onDragged: rootModel.handleDragged(mouseAreaXZ, planePos, screenPos)
onReleased: rootModel.handleReleased(mouseAreaXZ, planePos) onReleased: rootModel.handleReleased(mouseAreaXZ, planePos, screenPos)
} }
} }

View File

@@ -456,6 +456,9 @@ Item {
targetNode: viewRoot.selectedNode targetNode: viewRoot.selectedNode
view3D: overlayView view3D: overlayView
dragHelper: gizmoDragHelper dragHelper: gizmoDragHelper
onBrightnessCommit: viewRoot.commitObjectProperty(viewRoot.selectedNode, "brightness")
onBrightnessChange: viewRoot.changeObjectProperty(viewRoot.selectedNode, "brightness")
} }
AutoScaleHelper { AutoScaleHelper {
@@ -596,7 +599,7 @@ Item {
var l = Qt.locale(); var l = Qt.locale();
if (rotateGizmo.targetNode) { if (rotateGizmo.targetNode) {
var degrees = rotateGizmo.currentAngle * (180 / Math.PI); var degrees = rotateGizmo.currentAngle * (180 / Math.PI);
return qsTr(Number(degrees).toLocaleString(l, 'f', 1)); return Number(degrees).toLocaleString(l, 'f', 1);
} else { } else {
return ""; 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 { EditCameraController {
id: cameraControl id: cameraControl
camera: viewRoot.editView ? viewRoot.editView.camera : null camera: viewRoot.editView ? viewRoot.editView.camera : null

View File

@@ -55,6 +55,12 @@ Node {
return 100; 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) position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0)
visible: lightGizmo.targetNode instanceof SpotLight visible: lightGizmo.targetNode instanceof SpotLight
@@ -144,12 +150,38 @@ Node {
id: primaryArrow id: primaryArrow
eulerRotation: Qt.vector3d(-90, 0, 0) eulerRotation: Qt.vector3d(-90, 0, 0)
targetNode: lightGizmo.targetNode targetNode: lightGizmo.targetNode
color: lightGizmo.color color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color
view3D: lightGizmo.view3D view3D: lightGizmo.view3D
active: false active: lightGizmo.visible
dragHelper: lightGizmo.dragHelper dragHelper: lightGizmo.dragHelper
scale: autoScale.getScale(Qt.vector3d(5, 5, 5)) 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 { DefaultMaterial {

View File

@@ -170,31 +170,37 @@ void Qt5InformationNodeInstanceServer::handleSelectionChanged(const QVariant &ob
} }
QVector<Qt5InformationNodeInstanceServer::InstancePropertyValueTriple> QVector<Qt5InformationNodeInstanceServer::InstancePropertyValueTriple>
Qt5InformationNodeInstanceServer::vectorToPropertyValue( Qt5InformationNodeInstanceServer::propertyToPropertyValueTriples(
const ServerNodeInstance &instance, const ServerNodeInstance &instance,
const PropertyName &propertyName, const PropertyName &propertyName,
const QVariant &variant) const QVariant &variant)
{ {
QVector<InstancePropertyValueTriple> result; QVector<InstancePropertyValueTriple> result;
auto vector3d = variant.value<QVector3D>();
if (vector3d.isNull())
return result;
const PropertyName dot = propertyName.isEmpty() ? "" : ".";
InstancePropertyValueTriple propTriple; InstancePropertyValueTriple propTriple;
propTriple.instance = instance;
propTriple.propertyName = propertyName + dot + PropertyName("x"); if (variant.type() == QVariant::Vector3D) {
propTriple.propertyValue = vector3d.x(); auto vector3d = variant.value<QVector3D>();
result.append(propTriple);
propTriple.propertyName = propertyName + dot + PropertyName("y"); if (vector3d.isNull())
propTriple.propertyValue = vector3d.y(); return result;
result.append(propTriple);
propTriple.propertyName = propertyName + dot + PropertyName("z"); const PropertyName dot = propertyName.isEmpty() ? "" : ".";
propTriple.propertyValue = vector3d.z(); propTriple.instance = instance;
result.append(propTriple); 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; return result;
} }
@@ -222,7 +228,7 @@ void Qt5InformationNodeInstanceServer::modifyVariantValue(
instance.setModifiedFlag(false); instance.setModifiedFlag(false);
// We do have to split position into position.x, position.y, position.z // We do have to split position into position.x, position.y, position.z
ValuesModifiedCommand command = createValuesModifiedCommand(vectorToPropertyValue( ValuesModifiedCommand command = createValuesModifiedCommand(propertyToPropertyValueTriples(
instance, instance,
targetPropertyName, targetPropertyName,
obj->property(propertyName))); obj->property(propertyName)));

View File

@@ -97,9 +97,10 @@ private:
QObject *findView3DForSceneRoot(QObject *sceneRoot) const; QObject *findView3DForSceneRoot(QObject *sceneRoot) const;
QObject *find3DSceneRoot(const ServerNodeInstance &instance) const; QObject *find3DSceneRoot(const ServerNodeInstance &instance) const;
QObject *find3DSceneRoot(QObject *obj) const; QObject *find3DSceneRoot(QObject *obj) const;
QVector<InstancePropertyValueTriple> vectorToPropertyValue(const ServerNodeInstance &instance, QVector<InstancePropertyValueTriple> propertyToPropertyValueTriples(
const PropertyName &propertyName, const ServerNodeInstance &instance,
const QVariant &variant); const PropertyName &propertyName,
const QVariant &variant);
void modifyVariantValue(const QVariant &node, void modifyVariantValue(const QVariant &node,
const PropertyName &propertyName, const PropertyName &propertyName,
ValuesModifiedCommand::TransactionOption option); ValuesModifiedCommand::TransactionOption option);