Index: sources/gui/qml/compounds/ValueAdjuster.qml =================================================================== diff -u -rea4de12b2c7d6306a9cb89ff23eb95ccd25077a1 -r56817942c7534dc34c2b0bce640534fa51671086 --- sources/gui/qml/compounds/ValueAdjuster.qml (.../ValueAdjuster.qml) (revision ea4de12b2c7d6306a9cb89ff23eb95ccd25077a1) +++ sources/gui/qml/compounds/ValueAdjuster.qml (.../ValueAdjuster.qml) (revision 56817942c7534dc34c2b0bce640534fa51671086) @@ -20,54 +20,44 @@ 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 real defaultValue : 0 - property real step : 0 - - property bool active : false + 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 bool isActive : false property bool editable : true + property bool canRefresh : false + property alias textColor : _text.color + property bool grabbed : false - property bool canIncrement : active ? value < maximum : true - property bool canDecrement : active ? allowOff ? value > 0 : - value > minimum : true + signal didChange (real vValue) + signal didActiveChange (bool vState) - property bool allowOff : false + onIsActiveChanged : { + if ( canRefresh ) { canRefresh = false; return } - // 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 + if ( isActive ) { didChange(_root.defaultValue) } + } - onActiveChanged : if ( active ) { _root.value = _root.defaultValue } + function refresh() { canRefresh = true } - function clear() { _root.active = false } + function clear() { didActiveChange(false) } - function increment() { - if ( ! active ) { active = true } - else { - if ( allowOff ) { value = val < minVal ? minVal : val + stepVal } - else { value += stepVal } - } + RangedValue { id: _rangedValue + objectName: "_rangedValue" } - function decrement() { - if ( ! active ) { active = true } - else { - if ( allowOff ) { value = val > minVal ? val - stepVal : 0 } - else { value -= stepVal } - } - } - Text { id: _text anchors.centerIn: parent - text : _root.active ? _root.allowOff ? _root.value === 0 ? - "OFF" : - _root.value.toFixed( _root.decimal ) : + text : _root.isActive ? _root.canOff ? _root.value === 0 ? + 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 } @@ -112,48 +102,43 @@ } MouseArea { id: _sliderMouseArea - property bool grabbed: false anchors.fill : parent pressAndHoldInterval: 0 + drag.axis : Drag.XAxis // only horizontal onClicked: { - if ( _root.editable ) { - active = true - focus = true - } + if ( _root.editable ) { didActiveChange(true); focus = true } _slider.opacity = 0 } onReleased: { - _sliderMouseArea.grabbed = true -. grabbed = false + _root.grabbed = false _slider.opacity = 0 } onPressAndHold: { - if ( _root.editable ) { - active = true - focus = true - } + 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 - _root.value = 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 } @@ -165,7 +150,7 @@ from : 0 to : 1 duration: 350 - running : _sliderMouseArea.grabbed + running : _root.grabbed } Behavior on opacity { NumberAnimation { duration: 200 } } @@ -178,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 @@ -192,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()) + } } }