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 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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)));
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user