diff options
Diffstat (limited to 'src/quicktemplates/qquickrangeslider.cpp')
-rw-r--r-- | src/quicktemplates/qquickrangeslider.cpp | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/src/quicktemplates/qquickrangeslider.cpp b/src/quicktemplates/qquickrangeslider.cpp index ff15a9194e..d97dfdff90 100644 --- a/src/quicktemplates/qquickrangeslider.cpp +++ b/src/quicktemplates/qquickrangeslider.cpp @@ -117,8 +117,6 @@ void QQuickRangeSliderNodePrivate::updatePosition(bool ignoreOtherPosition) setPosition(pos, ignoreOtherPosition); } -static inline QString handleName() { return QStringLiteral("handle"); } - void QQuickRangeSliderNodePrivate::cancelHandle() { Q_Q(QQuickRangeSliderNode); @@ -227,6 +225,8 @@ void QQuickRangeSliderNode::setHandle(QQuickItem *handle) if (d->handle == handle) return; + QQuickControlPrivate::warnIfCustomizationNotSupported(d->slider, handle, QStringLiteral("handle")); + if (!d->handle.isExecuting()) d->cancelHandle(); @@ -356,6 +356,7 @@ public: void itemImplicitWidthChanged(QQuickItem *item) override; void itemImplicitHeightChanged(QQuickItem *item) override; + void itemDestroyed(QQuickItem *item) override; bool live = true; qreal from = defaultFrom; @@ -485,8 +486,14 @@ bool QQuickRangeSliderPrivate::handlePress(const QPointF &point, ulong timestamp if (hitNode) { hitNode->setPressed(true); - if (QQuickItem *handle = hitNode->handle()) + if (QQuickItem *handle = hitNode->handle()) { handle->setZ(1); + + // A specific handle was hit, so it should get focus, rather than the default + // (first handle) that gets focus whenever the RangeSlider itself does - see focusInEvent(). + if (focusPolicy & Qt::ClickFocus) + handle->forceActiveFocus(Qt::MouseFocusReason); + } QQuickRangeSliderNodePrivate::get(hitNode)->touchId = touchId; } if (otherNode) { @@ -528,22 +535,21 @@ bool QQuickRangeSliderPrivate::handleRelease(const QPointF &point, ulong timesta return true; QQuickRangeSliderNodePrivate *pressedNodePrivate = QQuickRangeSliderNodePrivate::get(pressedNode); - if (q->keepMouseGrab() || q->keepTouchGrab()) { - const qreal oldPos = pressedNode->position(); - qreal pos = positionAt(q, pressedNode->handle(), point); - if (snapMode != QQuickRangeSlider::NoSnap) - pos = snapPosition(q, pos); - qreal val = valueAt(q, pos); - if (!qFuzzyCompare(val, pressedNode->value())) - pressedNode->setValue(val); - else if (snapMode != QQuickRangeSlider::NoSnap) - pressedNodePrivate->setPosition(pos); - q->setKeepMouseGrab(false); - q->setKeepTouchGrab(false); + const qreal oldPos = pressedNode->position(); + qreal pos = positionAt(q, pressedNode->handle(), point); + if (snapMode != QQuickRangeSlider::NoSnap) + pos = snapPosition(q, pos); + qreal val = valueAt(q, pos); + if (!qFuzzyCompare(val, pressedNode->value())) + pressedNode->setValue(val); + else if (snapMode != QQuickRangeSlider::NoSnap) + pressedNodePrivate->setPosition(pos); + q->setKeepMouseGrab(false); + q->setKeepTouchGrab(false); + + if (!qFuzzyCompare(pressedNode->position(), oldPos)) + emit pressedNode->moved(); - if (!qFuzzyCompare(pressedNode->position(), oldPos)) - emit pressedNode->moved(); - } pressedNode->setPressed(false); pressedNodePrivate->touchId = -1; return true; @@ -597,14 +603,29 @@ void QQuickRangeSliderPrivate::itemImplicitHeightChanged(QQuickItem *item) emit second->implicitHandleHeightChanged(); } +void QQuickRangeSliderPrivate::itemDestroyed(QQuickItem *item) +{ + QQuickControlPrivate::itemDestroyed(item); + if (item == first->handle()) + first->setHandle(nullptr); + else if (item == second->handle()) + second->setHandle(nullptr); +} + QQuickRangeSlider::QQuickRangeSlider(QQuickItem *parent) : QQuickControl(*(new QQuickRangeSliderPrivate), parent) { Q_D(QQuickRangeSlider); d->first = new QQuickRangeSliderNode(0.0, this); d->second = new QQuickRangeSliderNode(1.0, this); + d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed); setFlag(QQuickItem::ItemIsFocusScope); +#ifdef Q_OS_MACOS + setFocusPolicy(Qt::TabFocus); +#else + setFocusPolicy(Qt::StrongFocus); +#endif setAcceptedMouseButtons(Qt::LeftButton); #if QT_CONFIG(quicktemplates2_multitouch) setAcceptTouchEvents(true); @@ -959,6 +980,11 @@ void QQuickRangeSlider::setOrientation(Qt::Orientation orientation) if (d->orientation == orientation) return; + if (orientation == Qt::Horizontal) + d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed); + else + d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred); + d->orientation = orientation; emit orientationChanged(); } |