Index: sources/gui/qml/compounds/ValueAdjuster.qml =================================================================== diff -u -r90f945668f1fff9ecb182b16ee33997cf515f52c -r56817942c7534dc34c2b0bce640534fa51671086 --- sources/gui/qml/compounds/ValueAdjuster.qml (.../ValueAdjuster.qml) (revision 90f945668f1fff9ecb182b16ee33997cf515f52c) +++ sources/gui/qml/compounds/ValueAdjuster.qml (.../ValueAdjuster.qml) (revision 56817942c7534dc34c2b0bce640534fa51671086) @@ -20,31 +20,25 @@ import QtQuick.Controls 2.2 Item { id: _root - property real decimal : 0 - property real minimum : 0 - property real maximum : 0 - property real value : 0 + property string extraText : "" + property alias value : _rangedValue.rawValue + property alias minimum : _rangedValue.rawMin + property alias maximum : _rangedValue.rawMax + property alias step : _rangedValue.rawStep + property alias decimal : _rangedValue.precision + property alias canOff : _rangedValue.canOff property real defaultValue: 0 - property real step : 0 property bool isActive : false property bool editable : true - property bool canOff : false property bool canRefresh : false + property alias textColor : _text.color + property bool grabbed : false - // fix floating-point precision issue - readonly property real stepVal : Math.round(step * 100) / 100 - readonly property real minVal : Math.round(minimum * 100) / 100 - readonly property real val : Math.round(value * 100) / 100 - - readonly property bool canIncrement : isActive ? value < maximum : true - readonly property bool canDecrement : isActive ? canOff ? value > 0 : - value > minimum : true - signal didChange (real vValue) signal didActiveChange (bool vState) onIsActiveChanged : { - if ( canRefresh ) { canRefresh = false; return; } + if ( canRefresh ) { canRefresh = false; return } if ( isActive ) { didChange(_root.defaultValue) } } @@ -53,34 +47,17 @@ function clear() { didActiveChange(false) } - function increment() { - let tValue = value - if ( ! isActive ) { didActiveChange(true); return; } - - if ( canOff ) { tValue = val < minVal ? minVal : val + stepVal } - else { tValue += stepVal } - - didChange(tValue) - + RangedValue { id: _rangedValue + objectName: "_rangedValue" } - function decrement(vValue) { - let tValue = value - if ( ! isActive ) { didActiveChange(true); return; } - - if ( canOff ) { tValue = val > minVal ? val - stepVal : 0 } - else { tValue -= stepVal } - - didChange(tValue) - } - Text { id: _text anchors.centerIn: parent text : _root.isActive ? _root.canOff ? _root.value === 0 ? - "OFF" : + qsTr("OFF") : _root.value.toFixed( _root.decimal ) : _root.value.toFixed( _root.decimal ) : Variables.emptyEntry - color : Colors.offWhite + color : _rangedValue.isValueInRange || ! _root.isActive ? Colors.offWhite : Colors.red font.pixelSize : Fonts.fontPixelValueControl } @@ -125,10 +102,10 @@ } MouseArea { id: _sliderMouseArea - property bool grabbed: false anchors.fill : parent pressAndHoldInterval: 0 + drag.axis : Drag.XAxis // only horizontal onClicked: { if ( _root.editable ) { didActiveChange(true); focus = true } @@ -137,30 +114,31 @@ } onReleased: { - _sliderMouseArea.grabbed = true -. grabbed = false + _root.grabbed = false _slider.opacity = 0 } onPressAndHold: { if ( _root.editable ) { didActiveChange(true); focus = true } - _sliderMouseArea.grabbed = true + _root.grabbed = true } onPositionChanged: { - if (grabbed) { + if (_root.grabbed) { if ( _slider.opacity === 0 ) { _animator.start() } - _slider.pos = Math.max(0, Math.min(1, mouse.x / parent.width)) - let raw = _slider.from + _slider.pos * (_slider.to - _slider.from) - let stepped = Math.round((raw - _slider.from) / _root.step) * _root.step + _slider.from - didChange(stepped) + if (_root.step != 0) { + _slider.pos = Math.max(0, Math.min(1, mouse.x / parent.width)) + let raw = _slider.from + _slider.pos * (_slider.to - _slider.from) + let stepped = Math.round((raw - _slider.from) / _root.step) * _root.step + _slider.from + didChange(stepped) + } } } onExited: { - if ( ! _sliderMouseArea.grabbed ) { + if ( ! _root.grabbed ) { _animator.stop() _slider.opacity = 0 } @@ -172,7 +150,7 @@ from : 0 to : 1 duration: 350 - running : _sliderMouseArea.grabbed + running : _root.grabbed } Behavior on opacity { NumberAnimation { duration: 200 } } @@ -185,11 +163,15 @@ leftMargin : Variables.defaultMargin } iconSize : Variables.circleButtonDefaultDiameter - enabled : _root.canDecrement + enabled : _rangedValue.canDecrement visible : _root.editable iconImageSource : enabled ? "qrc:/images/iArrowLeft" : "qrc:/images/iArrowLeftDisabled" - onClicked : decrement() + onClicked : { + if ( ! isActive ) { didActiveChange(true); return } + + didChange(_rangedValue.decrementedValue()) + } } IconButton { id: _rightArrow @@ -199,10 +181,14 @@ rightMargin : Variables.defaultMargin } iconSize : Variables.circleButtonDefaultDiameter - enabled : _root.canIncrement + enabled : _rangedValue.canIncrement visible : _root.editable iconImageSource : enabled ? "qrc:/images/iArrowRight" : "qrc:/images/iArrowRightDisabled" - onClicked : increment() + onClicked : { + if ( ! isActive ) { didActiveChange(true); return } + + didChange(_rangedValue.incrementedValue()) + } } }