diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-06-28 16:37:29 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-06-28 18:00:16 +0000 |
commit | 97c88459d88fede84f725152ad7929bd83d08933 (patch) | |
tree | fb251ebe30296b639abb4b4a8c625f9be2401e55 | |
parent | fff036ab4d755bce4d1e4d1fbfb5ac1b79bf8150 (diff) |
RangeSlider: add first.hovered and second.hovered properties
The actual hover effects are coming in separate patches.
[ChangeLog][RangeSlider] Added first.hovered and second.hovered
properties that hold whether the respective handles are hovered.
Change-Id: I3ffeed5de6c9a168534c8e9d4f1642161fc52caf
Task-number: QTBUG-50003
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/imports/controls/qtquickcontrols2plugin.cpp | 1 | ||||
-rw-r--r-- | src/imports/templates/qtquicktemplates2plugin.cpp | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickrangeslider.cpp | 63 | ||||
-rw-r--r-- | src/quicktemplates2/qquickrangeslider_p.h | 8 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_rangeslider.qml | 27 |
5 files changed, 99 insertions, 1 deletions
diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp index cea3894a..416e57ef 100644 --- a/src/imports/controls/qtquickcontrols2plugin.cpp +++ b/src/imports/controls/qtquickcontrols2plugin.cpp @@ -140,6 +140,7 @@ void QtQuickControls2Plugin::registerTypes(const char *uri) qmlRegisterType<QQuickButtonGroup,1 >(uri, 2, 1, "ButtonGroup"); qmlRegisterType<QQuickContainer,1>(uri, 2, 1, "Container"); qmlRegisterType(selector.select(QStringLiteral("DialogButtonBox.qml")), uri, 2, 1, "DialogButtonBox"); + qmlRegisterType(selector.select(QStringLiteral("RangeSlider.qml")), uri, 2, 1, "RangeSlider"); qmlRegisterType(selector.select(QStringLiteral("Slider.qml")), uri, 2, 1, "Slider"); qmlRegisterType(selector.select(QStringLiteral("SpinBox.qml")), uri, 2, 1, "SpinBox"); qmlRegisterType(selector.select(QStringLiteral("StackView.qml")), uri, 2, 1, "StackView"); diff --git a/src/imports/templates/qtquicktemplates2plugin.cpp b/src/imports/templates/qtquicktemplates2plugin.cpp index 1af21a73..1903d52c 100644 --- a/src/imports/templates/qtquicktemplates2plugin.cpp +++ b/src/imports/templates/qtquicktemplates2plugin.cpp @@ -178,6 +178,7 @@ void QtQuickTemplates2Plugin::registerTypes(const char *uri) qmlRegisterType<QQuickContainer, 1>(uri, 2, 1, "Container"); qmlRegisterType<QQuickDialogButtonBox>(uri, 2, 1, "DialogButtonBox"); qmlRegisterType<QQuickDialogButtonBoxAttached>(); + qmlRegisterType<QQuickRangeSlider, 1>(uri, 2, 1, "RangeSlider"); qmlRegisterType<QQuickSlider, 1>(uri, 2, 1, "Slider"); qmlRegisterType<QQuickSpinBox, 1>(uri, 2, 1, "SpinBox"); qmlRegisterType<QQuickStackView, 1>(uri, 2, 1, "StackView"); diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp index db211433..52b11dae 100644 --- a/src/quicktemplates2/qquickrangeslider.cpp +++ b/src/quicktemplates2/qquickrangeslider.cpp @@ -88,7 +88,8 @@ public: position(0), handle(nullptr), slider(slider), - pressed(false) + pressed(false), + hovered(false) { } @@ -109,6 +110,7 @@ private: QQuickItem *handle; QQuickRangeSlider *slider; bool pressed; + bool hovered; }; bool QQuickRangeSliderNodePrivate::isFirst() const @@ -272,6 +274,22 @@ void QQuickRangeSliderNode::setPressed(bool pressed) emit pressedChanged(); } +bool QQuickRangeSliderNode::isHovered() const +{ + Q_D(const QQuickRangeSliderNode); + return d->hovered; +} + +void QQuickRangeSliderNode::setHovered(bool hovered) +{ + Q_D(QQuickRangeSliderNode); + if (d->hovered == hovered) + return; + + d->hovered = hovered; + emit hoveredChanged(); +} + void QQuickRangeSliderNode::increase() { Q_D(QQuickRangeSliderNode); @@ -305,6 +323,8 @@ public: { } + void updateHover(const QPointF &pos); + qreal from; qreal to; qreal stepSize; @@ -315,6 +335,15 @@ public: QQuickRangeSlider::SnapMode snapMode; }; +void QQuickRangeSliderPrivate::updateHover(const QPointF &pos) +{ + Q_Q(QQuickRangeSlider); + QQuickItem *firstHandle = first->handle(); + QQuickItem *secondHandle = second->handle(); + first->setHovered(firstHandle && firstHandle->isEnabled() && firstHandle->contains(q->mapToItem(firstHandle, pos))); + second->setHovered(secondHandle && secondHandle->isEnabled() && secondHandle->contains(q->mapToItem(secondHandle, pos))); +} + static qreal valueAt(const QQuickRangeSlider *slider, qreal position) { return slider->from() + (slider->to() - slider->from()) * position; @@ -428,6 +457,7 @@ void QQuickRangeSlider::setTo(qreal to) \qmlproperty real QtQuick.Controls::RangeSlider::first.visualPosition \qmlproperty Item QtQuick.Controls::RangeSlider::first.handle \qmlproperty bool QtQuick.Controls::RangeSlider::first.pressed + \qmlproperty bool QtQuick.Controls::RangeSlider::first.hovered \table \header @@ -468,6 +498,10 @@ void QQuickRangeSlider::setTo(qreal to) \row \li pressed \li This property holds whether the first handle is pressed. + \row + \li hovered + \li This property holds whether the first handle is hovered. + This property was introduced in QtQuick.Controls 2.1. \endtable \sa first.increase(), first.decrease() @@ -485,6 +519,7 @@ QQuickRangeSliderNode *QQuickRangeSlider::first() const \qmlproperty real QtQuick.Controls::RangeSlider::second.visualPosition \qmlproperty Item QtQuick.Controls::RangeSlider::second.handle \qmlproperty bool QtQuick.Controls::RangeSlider::second.pressed + \qmlproperty bool QtQuick.Controls::RangeSlider::second.hovered \table \header @@ -525,6 +560,10 @@ QQuickRangeSliderNode *QQuickRangeSlider::first() const \row \li pressed \li This property holds whether the second handle is pressed. + \row + \li hovered + \li This property holds whether the second handle is hovered. + This property was introduced in QtQuick.Controls 2.1. \endtable \sa second.increase(), second.decrease() @@ -725,6 +764,28 @@ void QQuickRangeSlider::keyPressEvent(QKeyEvent *event) } } +void QQuickRangeSlider::hoverEnterEvent(QHoverEvent *event) +{ + Q_D(QQuickRangeSlider); + QQuickControl::hoverEnterEvent(event); + d->updateHover(event->posF()); +} + +void QQuickRangeSlider::hoverMoveEvent(QHoverEvent *event) +{ + Q_D(QQuickRangeSlider); + QQuickControl::hoverMoveEvent(event); + d->updateHover(event->posF()); +} + +void QQuickRangeSlider::hoverLeaveEvent(QHoverEvent *event) +{ + Q_D(QQuickRangeSlider); + QQuickControl::hoverLeaveEvent(event); + d->first->setHovered(false); + d->second->setHovered(false); +} + void QQuickRangeSlider::keyReleaseEvent(QKeyEvent *event) { Q_D(QQuickRangeSlider); diff --git a/src/quicktemplates2/qquickrangeslider_p.h b/src/quicktemplates2/qquickrangeslider_p.h index 4c2eb4bb..1b102e87 100644 --- a/src/quicktemplates2/qquickrangeslider_p.h +++ b/src/quicktemplates2/qquickrangeslider_p.h @@ -105,6 +105,9 @@ Q_SIGNALS: protected: void focusInEvent(QFocusEvent *event) override; + void hoverEnterEvent(QHoverEvent *event) override; + void hoverMoveEvent(QHoverEvent *event) override; + void hoverLeaveEvent(QHoverEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; @@ -135,6 +138,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickRangeSliderNode : public QObject Q_PROPERTY(qreal visualPosition READ visualPosition NOTIFY visualPositionChanged FINAL) Q_PROPERTY(QQuickItem *handle READ handle WRITE setHandle NOTIFY handleChanged FINAL) Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) + Q_PROPERTY(bool hovered READ isHovered WRITE setHovered NOTIFY hoveredChanged FINAL REVISION 1) public: explicit QQuickRangeSliderNode(qreal value, QQuickRangeSlider *slider); @@ -152,6 +156,9 @@ public: bool isPressed() const; void setPressed(bool pressed); + bool isHovered() const; + void setHovered(bool hovered); + public Q_SLOTS: void increase(); void decrease(); @@ -162,6 +169,7 @@ Q_SIGNALS: void visualPositionChanged(); void handleChanged(); void pressedChanged(); + Q_REVISION(1) void hoveredChanged(); private: Q_DISABLE_COPY(QQuickRangeSliderNode) diff --git a/tests/auto/controls/data/tst_rangeslider.qml b/tests/auto/controls/data/tst_rangeslider.qml index e5670470..81d6cf71 100644 --- a/tests/auto/controls/data/tst_rangeslider.qml +++ b/tests/auto/controls/data/tst_rangeslider.qml @@ -689,4 +689,31 @@ TestCase { control.destroy() } + + function test_hover_data() { + return [ + { tag: "first:true", node: "first", hoverEnabled: true }, + { tag: "first:false", node: "first", hoverEnabled: false }, + { tag: "second:true", node: "second", hoverEnabled: true }, + { tag: "second:false", node: "second", hoverEnabled: false } + ] + } + + function test_hover(data) { + var control = sliderComponent.createObject(testCase, {hoverEnabled: data.hoverEnabled}) + verify(control) + + var node = control[data.node] + compare(control.hovered, false) + compare(node.hovered, false) + + mouseMove(control, node.handle.x + node.handle.width / 2, node.handle.y + node.handle.height / 2) + compare(control.hovered, data.hoverEnabled) + compare(node.hovered, data.hoverEnabled && node.handle.enabled) + + mouseMove(control, node.handle.x - 1, node.handle.y - 1) + compare(node.hovered, false) + + control.destroy() + } } |