Index: sources/gui/qml/compounds/ValueAdjuster.qml =================================================================== diff -u -rb16fd955f65d83321decdc54bd3d5695fc81c32c -r56817942c7534dc34c2b0bce640534fa51671086 --- sources/gui/qml/compounds/ValueAdjuster.qml (.../ValueAdjuster.qml) (revision b16fd955f65d83321decdc54bd3d5695fc81c32c) +++ sources/gui/qml/compounds/ValueAdjuster.qml (.../ValueAdjuster.qml) (revision 56817942c7534dc34c2b0bce640534fa51671086) @@ -20,91 +20,20 @@ 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 - QtObject { id: _private - // fix floating-point precision issue - readonly property int multiplier : Math.pow(10, decimal) - readonly property real stepVal : calculatePrecisionValue(step) - readonly property real minVal : calculatePrecisionValue(minimum) - readonly property real maxVal : calculatePrecisionValue(maximum) - readonly property real val : calculatePrecisionValue(value) - - readonly property bool canIncrement : isActive ? val < calculateMaximum() : true - readonly property bool canDecrement : isActive ? canOff ? val > 0 : - val > calculateMinimum() : true - - // round the value based on the given precision (not step) - function calculatePrecisionValue(value) { - return Math.round(value * _private.multiplier) / _private.multiplier - } - - // calculate the minimum value rounded up to the next higher step size - function calculateMinimum() { - let fixedMin = _private.fixedValue(_private.minVal) - let fixedStep = _private.fixedValue(_private.stepVal) - return (Math.ceil(fixedMin / fixedStep) * fixedStep) / _private.multiplier - } - - // calculate the maximum value rounded down to the next higher step size - function calculateMaximum() { - let fixedMax = _private.fixedValue(_private.maxVal) - let fixedStep = _private.fixedValue(_private.stepVal) - return (Math.floor(fixedMax / fixedStep) * fixedStep) / _private.multiplier - } - - // return a fixed point int from the inputted float (using the set precision) - function fixedValue(value) { - return Math.round(value * _private.multiplier) - } - - function increment() { - if ( ! isActive ) { didActiveChange(true); return } - - let tValue = _private.val - if (canOff && _private.val < _private.minVal) { - tValue = _private.minVal - } - else { - let fixedVal = _private.fixedValue(_private.val) - let fixedStep = _private.fixedValue(_private.stepVal) - let fixedDelta = fixedStep - (fixedVal % fixedStep) - tValue = (fixedVal + fixedDelta) / _private.multiplier - tValue = Math.min(_private.maxVal, tValue) - } - - didChange(tValue) - } - - function decrement() { - if ( ! isActive ) { didActiveChange(true); return } - - let tValue = _private.val - if (canOff && _private.val === _private.minVal) { - tValue = 0 - } - else { - let fixedVal = _private.fixedValue(_private.val) - let fixedStep = _private.fixedValue(_private.stepVal) - let fixedDelta = fixedVal % fixedStep - tValue = (fixedVal - (fixedDelta > 0 ? fixedDelta : fixedStep)) / _private.multiplier - tValue = Math.max(_private.minVal, tValue) - } - - didChange(tValue) - } - } - signal didChange (real vValue) signal didActiveChange (bool vState) @@ -118,13 +47,17 @@ function clear() { didActiveChange(false) } + RangedValue { id: _rangedValue + objectName: "_rangedValue" + } + Text { id: _text anchors.centerIn: parent 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 } @@ -169,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 } @@ -181,29 +114,31 @@ } onReleased: { - _sliderMouseArea.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 } @@ -215,7 +150,7 @@ from : 0 to : 1 duration: 350 - running : _sliderMouseArea.grabbed + running : _root.grabbed } Behavior on opacity { NumberAnimation { duration: 200 } } @@ -228,11 +163,15 @@ leftMargin : Variables.defaultMargin } iconSize : Variables.circleButtonDefaultDiameter - enabled : _private.canDecrement + enabled : _rangedValue.canDecrement visible : _root.editable iconImageSource : enabled ? "qrc:/images/iArrowLeft" : "qrc:/images/iArrowLeftDisabled" - onClicked : _private.decrement() + onClicked : { + if ( ! isActive ) { didActiveChange(true); return } + + didChange(_rangedValue.decrementedValue()) + } } IconButton { id: _rightArrow @@ -242,10 +181,14 @@ rightMargin : Variables.defaultMargin } iconSize : Variables.circleButtonDefaultDiameter - enabled : _private.canIncrement + enabled : _rangedValue.canIncrement visible : _root.editable iconImageSource : enabled ? "qrc:/images/iArrowRight" : "qrc:/images/iArrowRightDisabled" - onClicked : _private.increment() + onClicked : { + if ( ! isActive ) { didActiveChange(true); return } + + didChange(_rangedValue.incrementedValue()) + } } }