Index: sources/gui/qml/components/ValueControl.qml =================================================================== diff -u -r16a8f25568b4636ebc31e76c86a8031940cc4ad7 -r3604ca12ed47f4c60a12bb42efa4949ef01b7d95 --- sources/gui/qml/components/ValueControl.qml (.../ValueControl.qml) (revision 16a8f25568b4636ebc31e76c86a8031940cc4ad7) +++ sources/gui/qml/components/ValueControl.qml (.../ValueControl.qml) (revision 3604ca12ed47f4c60a12bb42efa4949ef01b7d95) @@ -17,6 +17,8 @@ import "qrc:/components" import QtQuick 2.12 +import QtQuick.Controls 2.2 +import QtQuick.Shapes 1.9 Item { id: _root property real decimal : 0 @@ -46,21 +48,79 @@ else { _root.value -= _root.step } } - MouseArea { - anchors.fill : parent - propagateComposedEvents : true - onClicked: { - if ( _root.editable ) { active = focus = true } - } - } - Text { id: _text anchors.centerIn: parent text : _root.active ? _root.value.toFixed( _root.decimal ) : "-- --" color : Colors.offWhite font.pixelSize : Fonts.fontPixelValueControl } + Slider { id: _slider + property real pos : 0 + property int holdInterval : 600 + + anchors.fill : parent + anchors.rightMargin : Variables.defaultMargin + enabled : _root.editable + visible : enabled + opacity : 0 + stepSize : _root.step + from : _root.minimum.toFixed ( _root.decimal ) + to : _root.maximum.toFixed ( _root.decimal ) + value : _root.value.toFixed ( _root.decimal ) + snapMode : Slider.SnapOnRelease + + background : Rectangle { color: "transparent" } + + handle: Rectangle { id: _knob + width : 20 + height : 4 + radius : height + color : Colors.borderButton + x : _slider.pos * _slider.width + } + + MouseArea { id: _sliderMouseArea + anchors.fill: parent + property bool grabbed: false + + onClicked: if ( _root.editable ) { active = focus = true } + + onPressed: { + _slider.opacity = 0.3 + _holdTimer.restart() + } + + onReleased: { + _holdTimer.stop() + grabbed = false + _slider.opacity = 0 + } + + onPositionChanged: { + if (grabbed) { + _slider.pos = Math.max(0, Math.min(1, mouse.x / parent.width)) + var raw = _slider.from + _slider.pos * (_slider.to - _slider.from) + var stepped = Math.round((raw - _slider.from) / _root.step) * _root.step + _slider.from + _root.value = stepped + } + } + } + + Timer { id: _holdTimer + interval : _slider.holdInterval + repeat : false + onTriggered : { + if ( _root.editable ) { _root.active = focus = true } + + _slider.opacity = 1 + _sliderMouseArea.grabbed = true + } + } + + Behavior on opacity { NumberAnimation { duration: 200 } } + } + IconButton { id: _leftArrow anchors { verticalCenter : _root.verticalCenter