From 2b7bc9203f7432faac0ef0e180a060b6b5808c83 Mon Sep 17 00:00:00 2001 From: Danny Pope Date: Mon, 16 Jan 2012 12:41:08 +1000 Subject: Fix Model Tweaker "Lock" icon not working. Turns out it was never implemented in any way to begin with. Task-number: QTBUG-23546 Change-Id: I74a5c8e205ad3877e994aa54953866d3acdcc27d Reviewed-by: Danny Pope --- util/qt3d/modeltweak/qml/BlenderValueSlider.qml | 40 +++++-- util/qt3d/modeltweak/qml/ModelPropertiesPane.qml | 145 ++++++++++++++++++++++- util/qt3d/modeltweak/qml/ModelTweak.qml | 36 +++--- util/qt3d/modeltweak/qml/images/unlock.png | Bin 0 -> 292 bytes 4 files changed, 189 insertions(+), 32 deletions(-) create mode 100644 util/qt3d/modeltweak/qml/images/unlock.png diff --git a/util/qt3d/modeltweak/qml/BlenderValueSlider.qml b/util/qt3d/modeltweak/qml/BlenderValueSlider.qml index 1904aaf7..6203d020 100644 --- a/util/qt3d/modeltweak/qml/BlenderValueSlider.qml +++ b/util/qt3d/modeltweak/qml/BlenderValueSlider.qml @@ -12,6 +12,7 @@ Item { property double min: -1; property bool limitMax: false; property bool limitMin: false; + property bool locked: false width: rect.width height: 20 @@ -21,6 +22,7 @@ Item { signal next signal prev signal gotFocus + signal fail Rectangle { id: rect @@ -45,8 +47,10 @@ Item { visible: true } + TextInput { id: textInput + readOnly: valueSlider.locked anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter horizontalAlignment: TextInput.AlignHCenter @@ -91,12 +95,17 @@ Item { onExited: parent.color = "#B4B4B4" hoverEnabled: true onClicked: { - if (mouse.xwidth/3*2) - incDelta(); - else { - valueSlider.gotFocus() + if (!valueSlider.locked) + { + if (mouse.xwidth/3*2) + incDelta(); + else { + valueSlider.gotFocus() + } + } else { + valueSlider.fail(); } } @@ -109,14 +118,14 @@ Item { interval: 100; running: mouseArea.pressedButtons & Qt.LeftButton && (mouseArea.mouseX > valueSlider.width/3*2) repeat: true - onTriggered: incDelta() + onTriggered: if (!valueSlider.locked) incDelta() } Timer { interval: 100; running: mouseArea.pressedButtons & Qt.LeftButton && (mouseArea.mouseX < valueSlider.width/3) repeat: true - onTriggered: decDelta() + onTriggered: if (!valueSlider.locked) decDelta() } function updateMe() { @@ -149,7 +158,16 @@ Item { onFocusChanged: if (focus) valueSlider.gotFocus() - Keys.onUpPressed: incDelta() - Keys.onDownPressed: decDelta() - Keys.onReturnPressed: updateMe() + Keys.onUpPressed: { + if (!valueSlider.locked) incDelta(); + else valueSlider.fail(); + } + Keys.onDownPressed: { + if (!valueSlider.locked) decDelta(); + else valueSlider.fail(); + } + Keys.onReturnPressed: { + if (!valueSlider.locked) updateMe(); + else valueSlider.fail(); + } } diff --git a/util/qt3d/modeltweak/qml/ModelPropertiesPane.qml b/util/qt3d/modeltweak/qml/ModelPropertiesPane.qml index 2c3c96fd..8fa9988d 100644 --- a/util/qt3d/modeltweak/qml/ModelPropertiesPane.qml +++ b/util/qt3d/modeltweak/qml/ModelPropertiesPane.qml @@ -7,8 +7,13 @@ Column { height: parent.height spacing: 4 + property alias rotateLocked: imageR.isLocked + property alias scaleLocked: imageS.isLocked + property alias translateLocked: imageP.isLocked; + // POSITION Item { + id: positionPanel width: parent.width height: imageP.height @@ -22,43 +27,88 @@ Column { id: imageP anchors.right: parent.right anchors.rightMargin: 8 - source: "images/lock.png" + + //Animation to pulse the lock icon if attempting to modify while locked. + property bool bounce: false + + SequentialAnimation on scale{ + running: imageP.bounce + NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } + onCompleted: imageP.bounce = false + } + + //Manage locked/unlocked state + state: "UNLOCKED" + property bool isLocked: false + + states: [ + State { + name: "UNLOCKED" + PropertyChanges { target: imageP; source: "images/unlock.png"} + PropertyChanges { target: imageP; isLocked: false;} + }, + State { + name: "LOCKED" + PropertyChanges { target: imageP; source: "images/lock.png"} + PropertyChanges { target: imageP; isLocked: true;} + } + ] + + MouseArea { + anchors.fill: parent + onDoubleClicked: { + if (parent.state=="LOCKED") + parent.state="UNLOCKED" + else + parent.state="LOCKED" + } + } } } BlenderValueSlider { focus: true id: posX label: "X:" + locked: imageP.isLocked value: transformTranslate.translate.x.toFixed(3) function update (f) { transformTranslate.translate = Qt.vector3d(f, transformTranslate.translate.y, transformTranslate.translate.z); } onNext: { updateMe(); focus = false; posY.focus = true; } onPrev: { updateMe(); focus = false; scaleZ.focus = true; } + onFail: { imageP.bounce=true; } } BlenderValueSlider { id: posY label: "Y:" + locked: imageP.isLocked value: transformTranslate.translate.y.toFixed(3) function update (f) { transformTranslate.translate = Qt.vector3d(transformTranslate.translate.x, f, transformTranslate.translate.z); } onNext: { updateMe(); focus = false; posZ.focus = true; } onPrev: { updateMe(); focus = false; posX.focus = true; } + onFail: { imageP.bounce=true; } } BlenderValueSlider { id: posZ label: "Z:" + locked: imageP.isLocked value: transformTranslate.translate.z.toFixed(3) function update (f) { transformTranslate.translate = Qt.vector3d(transformTranslate.translate.x, transformTranslate.translate.y, f); } onNext: { updateMe(); focus = false; rotX.focus = true; } onPrev: { updateMe(); focus = false; posY.focus = true; } + onFail: { imageP.bounce=true; } } // ROTATE Item { + id: rotationPanel width: parent.width height: imageR.height @@ -72,45 +122,90 @@ Column { id: imageR anchors.right: parent.right anchors.rightMargin: 8 - source: "images/lock.png" + + //Animation to pulse the lock icon if attempting to modify while locked. + property bool bounce: false + + SequentialAnimation on scale{ + running: imageR.bounce + NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } + onCompleted: imageR.bounce = false + } + + //Manage locked/unlocked state + state: "UNLOCKED" + property bool isLocked: false + + states: [ + State { + name: "UNLOCKED" + PropertyChanges { target: imageR; source: "images/unlock.png"} + PropertyChanges { target: imageR; isLocked: false;} + }, + State { + name: "LOCKED" + PropertyChanges { target: imageR; source: "images/lock.png"} + PropertyChanges { target: imageR; isLocked: true;} + } + ] + + MouseArea { + anchors.fill: parent + onDoubleClicked: { + if (parent.state=="LOCKED") + parent.state="UNLOCKED" + else + parent.state="LOCKED" + } + } } } BlenderValueSlider { id: rotX label: "X:" delta: 1 + locked: imageR.isLocked min: 0; limitMin: true max: 360; limitMax: true value: transformRotateX.angle.toFixed(3) function update (f) { transformRotateX.angle = f } onNext: { updateMe(); focus = false; rotY.focus = true; } onPrev: { updateMe(); focus = false; posZ.focus = true; } + onFail: { imageR.bounce=true; } } BlenderValueSlider { id: rotY label: "Y:" delta: 1 + locked: imageR.isLocked min: 0; limitMin: true max: 360; limitMax: true value: transformRotateY.angle.toFixed(3) function update (f) { transformRotateY.angle = f } onNext: { updateMe(); focus = false; rotZ.focus = true; } onPrev: { updateMe(); focus = false; rotX.focus = true; } + onFail: { imageR.bounce=true; } } BlenderValueSlider { id: rotZ label: "Z:" delta: 1 + locked: imageR.isLocked min: 0; limitMin: true max: 360; limitMax: true value: transformRotateZ.angle.toFixed(3) function update (f) { transformRotateZ.angle = f } onNext: { updateMe(); focus = false; scaleX.focus = true; } onPrev: { updateMe(); focus = false; rotY.focus = true; } + onFail: { imageR.bounce=true; } } // SCALE Item { + id: scalePanel width: parent.width height: imageS.height @@ -124,34 +219,78 @@ Column { id: imageS anchors.right: parent.right anchors.rightMargin: 8 - source: "images/lock.png" + + //Animation to pulse the lock icon if attempting to modify while locked. + property bool bounce: false + + SequentialAnimation on scale{ + running: imageS.bounce + NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } + NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } + onCompleted: imageS.bounce = false + } + + //Manage locked/unlocked state + state: "UNLOCKED" + property bool isLocked: false + + states: [ + State { + name: "UNLOCKED" + PropertyChanges { target: imageS; source: "images/unlock.png"} + PropertyChanges { target: imageS; isLocked: false;} + }, + State { + name: "LOCKED" + PropertyChanges { target: imageS; source: "images/lock.png"} + PropertyChanges { target: imageS; isLocked: true;} + } + ] + + MouseArea { + anchors.fill: parent + onDoubleClicked: { + if (parent.state=="LOCKED") + parent.state="UNLOCKED" + else + parent.state="LOCKED" + } + } } } BlenderValueSlider { id: scaleX label: "X:" + locked: imageS.isLocked min: 0; limitMin: true value: transformScale.scale.x.toFixed(3) function update (f) { transformScale.scale = Qt.vector3d(f, transformScale.scale.y, transformScale.scale.z); } onNext: { updateMe(); focus = false; scaleY.focus = true; } onPrev: { updateMe(); focus = false; rotZ.focus = true; } + onFail: { imageS.bounce=true; } } BlenderValueSlider { id: scaleY label: "Y:" + locked: imageS.isLocked min: 0; limitMin: true value: transformScale.scale.y.toFixed(3) function update (f) { transformScale.scale = Qt.vector3d(transformScale.scale.x, f, transformScale.scale.z); } onNext: { updateMe(); focus = false; scaleZ.focus = true; } onPrev: { updateMe(); focus = false; scaleX.focus = true; } + onFail: { imageS.bounce=true; } } BlenderValueSlider { id: scaleZ label: "Z:" + locked: imageS.isLocked min: 0; limitMin: true value: transformScale.scale.z.toFixed(3) function update (f) { transformScale.scale = Qt.vector3d(transformScale.scale.x, transformScale.scale.y, f); } onNext: { updateMe(); focus = false; posX.focus = true; } onPrev: { updateMe(); focus = false; scaleY.focus = true; } + onFail: { imageS.bounce=true; } } } diff --git a/util/qt3d/modeltweak/qml/ModelTweak.qml b/util/qt3d/modeltweak/qml/ModelTweak.qml index e7dc57fa..f3b1bc6c 100644 --- a/util/qt3d/modeltweak/qml/ModelTweak.qml +++ b/util/qt3d/modeltweak/qml/ModelTweak.qml @@ -76,15 +76,15 @@ Rectangle { property alias position: transformTranslate.translate; - onMouseTranslateX: position = Qt.vector3d(position.x, position.y, translate.z + (down.x - mouse.x)/translateSensitivity) - onMouseTranslateY: position = Qt.vector3d(position.x, translate.y + (down.y - mouse.y)/translateSensitivity, position.z) - onMouseRotateX: transformRotateY.angle = rotate.y - (down.x - mouse.x)/rotateSensitivity - onMouseRotateY: transformRotateZ.angle = rotate.z - (down.y - mouse.y)/rotateSensitivity - onMouseScaleX: { + onMouseTranslateX: if (!modelPropertiesPane.translateLocked) position = Qt.vector3d(position.x, position.y, translate.z + (down.x - mouse.x)/translateSensitivity) + onMouseTranslateY: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(position.x, translate.y + (down.y - mouse.y)/translateSensitivity, position.z) + onMouseRotateX: if (!modelPropertiesPane.rotateLocked)transformRotateY.angle = rotate.y - (down.x - mouse.x)/rotateSensitivity + onMouseRotateY: if (!modelPropertiesPane.rotateLocked)transformRotateZ.angle = rotate.z - (down.y - mouse.y)/rotateSensitivity + onMouseScaleX: if (!modelPropertiesPane.scaleLocked) { var s = scale3d.z - (down.x - mouse.x)/scaleSensitivity; transformScale.scale = Qt.vector3d(transformScale.scale.x, transformScale.scale.y, s<0 ? 0 : s) } - onMouseScaleY: { + onMouseScaleY: if (!modelPropertiesPane.scaleLocked) { var s = scale3d.y + (down.y - mouse.y)/scaleSensitivity; transformScale.scale = Qt.vector3d(transformScale.scale.x, s<0 ? 0 : s, transformScale.scale.z) } @@ -100,15 +100,15 @@ Rectangle { property alias position: transformTranslate.translate; - onMouseTranslateX: position = Qt.vector3d(translate.x - (down.x - mouse.x)/translateSensitivity, position.y, position.z) - onMouseTranslateY: position = Qt.vector3d(position.x, translate.y + (down.y - mouse.y)/translateSensitivity, position.z) - onMouseRotateX: transformRotateY.angle = rotate.y - (down.x - mouse.x)/rotateSensitivity - onMouseRotateY: transformRotateX.angle = rotate.x - (down.y - mouse.y)/rotateSensitivity - onMouseScaleX: { + onMouseTranslateX: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(translate.x - (down.x - mouse.x)/translateSensitivity, position.y, position.z) + onMouseTranslateY: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(position.x, translate.y + (down.y - mouse.y)/translateSensitivity, position.z) + onMouseRotateX: if (!modelPropertiesPane.rotateLocked) transformRotateY.angle = rotate.y - (down.x - mouse.x)/rotateSensitivity + onMouseRotateY: if (!modelPropertiesPane.rotateLocked) transformRotateX.angle = rotate.x - (down.y - mouse.y)/rotateSensitivity + onMouseScaleX: if (!modelPropertiesPane.scaleLocked) { var s = scale3d.x - (down.x - mouse.x)/scaleSensitivity transformScale.scale = Qt.vector3d(s<0 ? 0 : s, transformScale.scale.y, transformScale.scale.z) } - onMouseScaleY: { + onMouseScaleY: if (!modelPropertiesPane.scaleLocked) { var s = scale3d.y + (down.y - mouse.y)/scaleSensitivity transformScale.scale = Qt.vector3d(transformScale.scale.x, s<0 ? 0 : s, transformScale.scale.z) } @@ -125,15 +125,15 @@ Rectangle { property alias position: transformTranslate.translate; - onMouseTranslateX: position = Qt.vector3d(translate.x - (down.x - mouse.x)/translateSensitivity, position.y, position.z) - onMouseTranslateY: position = Qt.vector3d(position.x, position.y, translate.z - (down.y - mouse.y)/translateSensitivity) - onMouseRotateX: transformRotateZ.angle = rotate.z + (down.x - mouse.x)/rotateSensitivity - onMouseRotateY: transformRotateX.angle = rotate.x - (down.y - mouse.y)/rotateSensitivity - onMouseScaleX: { + onMouseTranslateX: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(translate.x - (down.x - mouse.x)/translateSensitivity, position.y, position.z) + onMouseTranslateY: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(position.x, position.y, translate.z - (down.y - mouse.y)/translateSensitivity) + onMouseRotateX: if (!modelPropertiesPane.rotateLocked)transformRotateZ.angle = rotate.z + (down.x - mouse.x)/rotateSensitivity + onMouseRotateY: if (!modelPropertiesPane.rotateLocked)transformRotateX.angle = rotate.x - (down.y - mouse.y)/rotateSensitivity + onMouseScaleX: if (!modelPropertiesPane.scaleLocked) { var s = scale3d.x - (down.x - mouse.x)/scaleSensitivity; transformScale.scale = Qt.vector3d(s<0 ? 0 : s, transformScale.scale.y, transformScale.scale.z) } - onMouseScaleY: { + onMouseScaleY: if (!modelPropertiesPane.scaleLocked) { var s = scale3d.z + (down.y - mouse.y)/scaleSensitivity; transformScale.scale = Qt.vector3d(transformScale.scale.x, transformScale.scale.y, s<0 ? 0 : s) } diff --git a/util/qt3d/modeltweak/qml/images/unlock.png b/util/qt3d/modeltweak/qml/images/unlock.png new file mode 100644 index 00000000..80c3f945 Binary files /dev/null and b/util/qt3d/modeltweak/qml/images/unlock.png differ -- cgit v1.2.3