aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates/qquickrangeslider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicktemplates/qquickrangeslider.cpp')
-rw-r--r--src/quicktemplates/qquickrangeslider.cpp62
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();
}