forked from qt-creator/qt-creator
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:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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 {
|
||||
|
@@ -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)));
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user