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 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)
}
}

View File

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

View File

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

View File

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

View File

@@ -170,31 +170,37 @@ void Qt5InformationNodeInstanceServer::handleSelectionChanged(const QVariant &ob
}
QVector<Qt5InformationNodeInstanceServer::InstancePropertyValueTriple>
Qt5InformationNodeInstanceServer::vectorToPropertyValue(
Qt5InformationNodeInstanceServer::propertyToPropertyValueTriples(
const ServerNodeInstance &instance,
const PropertyName &propertyName,
const QVariant &variant)
{
QVector<InstancePropertyValueTriple> result;
auto vector3d = variant.value<QVector3D>();
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<QVector3D>();
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)));

View File

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