diff options
-rw-r--r-- | src/imports/controls/material/ScrollBar.qml | 1 | ||||
-rw-r--r-- | src/imports/controls/universal/ScrollBar.qml | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickrangeslider.cpp | 7 | ||||
-rw-r--r-- | src/quicktemplates2/qquickspinbox.cpp | 57 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_scrollbar.qml | 40 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_spinbox.qml | 103 |
6 files changed, 108 insertions, 101 deletions
diff --git a/src/imports/controls/material/ScrollBar.qml b/src/imports/controls/material/ScrollBar.qml index 1b014b87..8743a16e 100644 --- a/src/imports/controls/material/ScrollBar.qml +++ b/src/imports/controls/material/ScrollBar.qml @@ -81,6 +81,7 @@ T.ScrollBar { Transition { from: "active" SequentialAnimation { + PropertyAction{ targets: [contentItem, background]; property: "opacity"; value: 1.0 } PauseAnimation { duration: 2450 } NumberAnimation { targets: [contentItem, background]; property: "opacity"; to: 0.0 } } diff --git a/src/imports/controls/universal/ScrollBar.qml b/src/imports/controls/universal/ScrollBar.qml index c6ca874e..894e09e7 100644 --- a/src/imports/controls/universal/ScrollBar.qml +++ b/src/imports/controls/universal/ScrollBar.qml @@ -83,6 +83,7 @@ T.ScrollBar { Transition { from: "active" SequentialAnimation { + PropertyAction{ targets: [contentItem, background]; property: "opacity"; value: 1.0 } PauseAnimation { duration: 3000 } NumberAnimation { targets: [contentItem, background]; property: "opacity"; to: 0.0 } } diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp index c1cf13db..3c9065db 100644 --- a/src/quicktemplates2/qquickrangeslider.cpp +++ b/src/quicktemplates2/qquickrangeslider.cpp @@ -68,6 +68,13 @@ QT_BEGIN_NAMESPACE } \endcode + In order to perform an action when the value for a particular handle changes, + use the following syntax: + + \code + first.onValueChanged: console.log("first.value changed to " + first.value) + \endcode + The \l {first.position} and \l {second.position} properties are expressed as fractions of the control's size, in the range \c {0.0 - 1.0}. The \l {first.visualPosition} and \l {second.visualPosition} properties are diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index f7458011..69b315b2 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -124,8 +124,10 @@ public: int boundValue(int value, bool wrap) const; void updateValue(); - bool setValue(int value, bool wrap); - bool stepBy(int steps); + bool setValue(int value, bool wrap, bool modified); + bool stepBy(int steps, bool modified); + void increase(bool modified); + void decrease(bool modified); int effectiveStepSize() const; @@ -187,16 +189,13 @@ void QQuickSpinBoxPrivate::updateValue() QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(engine); QJSValue loc(v4, QQmlLocale::wrap(v4, locale)); QJSValue val = q->valueFromText().call(QJSValueList() << text.toString() << loc); - const int oldValue = value; - setValue(val.toInt(), /* allowWrap = */ false); - if (oldValue != value) - emit q->valueModified(); + setValue(val.toInt(), /* modified = */ true, /* allowWrap = */ false); } } } } -bool QQuickSpinBoxPrivate::setValue(int newValue, bool allowWrap) +bool QQuickSpinBoxPrivate::setValue(int newValue, bool allowWrap, bool modified) { Q_Q(QQuickSpinBox); if (q->isComponentComplete()) @@ -211,12 +210,24 @@ bool QQuickSpinBoxPrivate::setValue(int newValue, bool allowWrap) updateDownEnabled(); emit q->valueChanged(); + if (modified) + emit q->valueModified(); return true; } -bool QQuickSpinBoxPrivate::stepBy(int steps) +bool QQuickSpinBoxPrivate::stepBy(int steps, bool modified) +{ + return setValue(value + steps, wrap, modified); +} + +void QQuickSpinBoxPrivate::increase(bool modified) +{ + setValue(value + effectiveStepSize(), wrap, modified); +} + +void QQuickSpinBoxPrivate::decrease(bool modified) { - return setValue(value + steps, wrap); + setValue(value - effectiveStepSize(), wrap, modified); } int QQuickSpinBoxPrivate::effectiveStepSize() const @@ -392,7 +403,7 @@ void QQuickSpinBox::setFrom(int from) d->from = from; emit fromChanged(); if (isComponentComplete()) { - if (!d->setValue(d->value, /* allowWrap = */ false)) { + if (!d->setValue(d->value, /* allowWrap = */ false, /* modified = */ false)) { d->updateUpEnabled(); d->updateDownEnabled(); } @@ -421,7 +432,7 @@ void QQuickSpinBox::setTo(int to) d->to = to; emit toChanged(); if (isComponentComplete()) { - if (!d->setValue(d->value, /* allowWrap = */false)) { + if (!d->setValue(d->value, /* allowWrap = */false, /* modified = */ false)) { d->updateUpEnabled(); d->updateDownEnabled(); } @@ -442,7 +453,7 @@ int QQuickSpinBox::value() const void QQuickSpinBox::setValue(int value) { Q_D(QQuickSpinBox); - d->setValue(value, /* allowWrap = */ false); + d->setValue(value, /* allowWrap = */ false, /* modified = */ false); } /*! @@ -751,7 +762,7 @@ void QQuickSpinBox::setWrap(bool wrap) void QQuickSpinBox::increase() { Q_D(QQuickSpinBox); - d->stepBy(d->effectiveStepSize()); + d->increase(false); } /*! @@ -764,7 +775,7 @@ void QQuickSpinBox::increase() void QQuickSpinBox::decrease() { Q_D(QQuickSpinBox); - d->stepBy(-d->effectiveStepSize()); + d->decrease(false); } void QQuickSpinBox::focusInEvent(QFocusEvent *event) @@ -804,11 +815,10 @@ void QQuickSpinBox::keyPressEvent(QKeyEvent *event) Q_D(QQuickSpinBox); QQuickControl::keyPressEvent(event); - const int oldValue = d->value; switch (event->key()) { case Qt::Key_Up: if (d->upEnabled()) { - increase(); + d->increase(true); d->up->setPressed(true); event->accept(); } @@ -816,7 +826,7 @@ void QQuickSpinBox::keyPressEvent(QKeyEvent *event) case Qt::Key_Down: if (d->downEnabled()) { - decrease(); + d->decrease(true); d->down->setPressed(true); event->accept(); } @@ -825,8 +835,6 @@ void QQuickSpinBox::keyPressEvent(QKeyEvent *event) default: break; } - if (d->value != oldValue) - emit valueModified(); setAccessibleProperty("pressed", d->up->isPressed() || d->down->isPressed()); } @@ -852,9 +860,9 @@ void QQuickSpinBox::timerEvent(QTimerEvent *event) d->startPressRepeat(); } else if (event->timerId() == d->repeatTimer) { if (d->up->isPressed()) - increase(); + d->increase(true); else if (d->down->isPressed()) - decrease(); + d->decrease(true); } } @@ -864,13 +872,10 @@ void QQuickSpinBox::wheelEvent(QWheelEvent *event) Q_D(QQuickSpinBox); QQuickControl::wheelEvent(event); if (d->wheelEnabled) { - const int oldValue = d->value; const QPointF angle = event->angleDelta(); const qreal delta = (qFuzzyIsNull(angle.y()) ? angle.x() : angle.y()) / QWheelEvent::DefaultDeltasPerStep; - d->stepBy(qRound(d->effectiveStepSize() * delta)); - if (d->value != oldValue) - emit valueModified(); - event->setAccepted(d->value != oldValue); + if (!d->stepBy(qRound(d->effectiveStepSize() * delta), true)) + event->ignore(); } } #endif diff --git a/tests/auto/controls/data/tst_scrollbar.qml b/tests/auto/controls/data/tst_scrollbar.qml index ec0be3f8..bc424a27 100644 --- a/tests/auto/controls/data/tst_scrollbar.qml +++ b/tests/auto/controls/data/tst_scrollbar.qml @@ -750,4 +750,44 @@ TestCase { compare(control.horizontal, true) compare(control.vertical, false) } + + function test_flashing() { + var control = createTemporaryObject(scrollBar, testCase, {size: 0.2}) + verify(control) + + var activeSpy = signalSpy.createObject(control, {target: control, signalName: "activeChanged"}) + verify(activeSpy.valid) + + compare(control.active, false) + if (control.contentItem) + compare(control.contentItem.opacity, 0) + if (control.background) + compare(control.background.opacity, 0) + + control.increase() + compare(control.position, 0.1) + compare(control.active, false) + compare(activeSpy.count, 2) + if (control.contentItem) + verify(control.contentItem.opacity > 0) + if (control.background) + verify(control.background.opacity > 0) + if (control.contentItem) + tryCompare(control.contentItem, "opacity", 0) + if (control.background) + tryCompare(control.background, "opacity", 0) + + control.decrease() + compare(control.position, 0.0) + compare(control.active, false) + compare(activeSpy.count, 4) + if (control.contentItem) + verify(control.contentItem.opacity > 0) + if (control.background) + verify(control.background.opacity > 0) + if (control.contentItem) + tryCompare(control.contentItem, "opacity", 0) + if (control.background) + tryCompare(control.background, "opacity", 0) + } } diff --git a/tests/auto/controls/data/tst_spinbox.qml b/tests/auto/controls/data/tst_spinbox.qml index 17e4b592..54b81453 100644 --- a/tests/auto/controls/data/tst_spinbox.qml +++ b/tests/auto/controls/data/tst_spinbox.qml @@ -197,91 +197,44 @@ TestCase { compare(control.down.indicator.enabled, true) } - function test_mouse() { - var control = createTemporaryObject(spinBox, testCase, {stepSize: 50}) + function test_mouse_data() { + return [ + { tag: "up", button: "up", value: 50, enabled: true, hold: false, modified: 1, expected: 51 }, + { tag: "down", button: "down", value: 50, enabled: true, hold: false, modified: 1, expected: 49 }, + { tag: "up:disabled", button: "up", value: 99, enabled: false, hold: false, modified: 0, expected: 99 }, + { tag: "down:disabled", button: "down", value: 0, enabled: false, hold: false, modified: 0, expected: 0 }, + { tag: "up:hold", button: "up", value: 95, enabled: true, hold: true, modified: 4, expected: 99 }, + { tag: "down:hold", button: "down", value: 5, enabled: true, hold: true, modified: 5, expected: 0 } + ] + } + + function test_mouse(data) { + var control = createTemporaryObject(spinBox, testCase, {value: data.value}) verify(control) - var upPressedSpy = signalSpy.createObject(control, {target: control.up, signalName: "pressedChanged"}) - verify(upPressedSpy.valid) + var button = control[data.button] + verify(button) - var downPressedSpy = signalSpy.createObject(control, {target: control.down, signalName: "pressedChanged"}) - verify(downPressedSpy.valid) + var pressedSpy = signalSpy.createObject(control, {target: button, signalName: "pressedChanged"}) + verify(pressedSpy.valid) var valueModifiedSpy = signalSpy.createObject(control, {target: control, signalName: "valueModified"}) verify(valueModifiedSpy.valid) - mousePress(control.up.indicator) - compare(upPressedSpy.count, 1) - compare(control.up.pressed, true) - compare(downPressedSpy.count, 0) - compare(control.down.pressed, false) - compare(control.value, 0) + mousePress(button.indicator) + compare(pressedSpy.count, data.enabled ? 1 : 0) + compare(button.pressed, data.enabled) + compare(control.value, data.value) compare(valueModifiedSpy.count, 0) - mouseRelease(control.up.indicator) - compare(upPressedSpy.count, 2) - compare(control.up.pressed, false) - compare(downPressedSpy.count, 0) - compare(control.down.pressed, false) - compare(control.value, 50) - compare(valueModifiedSpy.count, 1) - - // Disable the up button and try again. - control.value = control.to - compare(control.up.indicator.enabled, false) - - mousePress(control.up.indicator) - compare(upPressedSpy.count, 2) - compare(control.up.pressed, false) - compare(downPressedSpy.count, 0) - compare(control.down.pressed, false) - compare(control.value, control.to) - compare(valueModifiedSpy.count, 1) - - mouseRelease(control.up.indicator) - compare(upPressedSpy.count, 2) - compare(control.up.pressed, false) - compare(downPressedSpy.count, 0) - compare(control.down.pressed, false) - compare(control.value, control.to) - compare(valueModifiedSpy.count, 1) - - control.value = 50; - mousePress(control.down.indicator) - compare(downPressedSpy.count, 1) - compare(control.down.pressed, true) - compare(upPressedSpy.count, 2) - compare(control.up.pressed, false) - compare(control.value, 50) - compare(valueModifiedSpy.count, 1) - - mouseRelease(control.down.indicator) - compare(downPressedSpy.count, 2) - compare(control.down.pressed, false) - compare(upPressedSpy.count, 2) - compare(control.up.pressed, false) - compare(control.value, 0) - compare(valueModifiedSpy.count, 2) - - // Disable the down button and try again. - control.value = control.from - compare(control.down.indicator.enabled, false) + if (data.hold) + tryCompare(control, "value", data.expected) - mousePress(control.down.indicator) - compare(downPressedSpy.count, 2) - compare(control.down.pressed, false) - compare(upPressedSpy.count, 2) - compare(control.up.pressed, false) - compare(control.value, control.from) - compare(valueModifiedSpy.count, 2) - - mouseRelease(control.down.indicator) - compare(downPressedSpy.count, 2) - compare(control.down.pressed, false) - compare(upPressedSpy.count, 2) - compare(control.up.pressed, false) - compare(control.value, control.from) - compare(valueModifiedSpy.count, 2) + mouseRelease(button.indicator) + compare(pressedSpy.count, data.enabled ? 2 : 0) + compare(button.pressed, false) + compare(control.value, data.expected) + compare(valueModifiedSpy.count, data.modified) } function test_keys_data() { |