diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-01-20 16:01:51 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-01-20 15:26:30 +0000 |
commit | 7f2a5162511f5ce47ce8ff2b7e90071cedab37f9 (patch) | |
tree | 916b59627d936427564f765512c19ca1119a16ea /src/quicktemplates2/qquickscrollbar.cpp | |
parent | 6c0ee76c646778d6a45018acc8d561c5a5d931f8 (diff) |
QQuickScrollBar: fix overshoot
ScrollBar should not always force a range of 0.0-1.0, but only when
interacted with. This way, the scrollbar stops at bounds when dragged,
but flicking the attached Flickable respects its boundsBehavior and
overshoots if appropriate.
The logic and test is adapted from QQuickScrollIndicator commit 8d093a.
Change-Id: Ida720d4cc2bb1de06ba0c02dfb25be51dd3108fc
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickscrollbar.cpp')
-rw-r--r-- | src/quicktemplates2/qquickscrollbar.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index f118a2b3..25d2f087 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -199,12 +199,17 @@ void QQuickScrollBarPrivate::resizeContent() if (!contentItem) return; + // - negative overshoot (pos < 0): clamp the pos to 0, and deduct the overshoot from the size + // - positive overshoot (pos + size > 1): clamp the size to 1-pos + const qreal clampedSize = qBound<qreal>(0, size + qMin<qreal>(0, position), 1.0 - position); + const qreal clampedPos = qBound<qreal>(0, position, 1.0 - clampedSize); + if (orientation == Qt::Horizontal) { - contentItem->setPosition(QPointF(q->leftPadding() + position * q->availableWidth(), q->topPadding())); - contentItem->setSize(QSizeF(q->availableWidth() * size, q->availableHeight())); + contentItem->setPosition(QPointF(q->leftPadding() + clampedPos * q->availableWidth(), q->topPadding())); + contentItem->setSize(QSizeF(q->availableWidth() * clampedSize, q->availableHeight())); } else { - contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + position * q->availableHeight())); - contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * size)); + contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + clampedPos * q->availableHeight())); + contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * clampedSize)); } } @@ -275,7 +280,6 @@ qreal QQuickScrollBar::size() const void QQuickScrollBar::setSize(qreal size) { Q_D(QQuickScrollBar); - size = qBound<qreal>(0.0, size, 1.0 - d->position); if (qFuzzyCompare(d->size, size)) return; @@ -304,7 +308,6 @@ qreal QQuickScrollBar::position() const void QQuickScrollBar::setPosition(qreal position) { Q_D(QQuickScrollBar); - position = qBound<qreal>(0.0, position, 1.0 - d->size); if (qFuzzyCompare(d->position, position)) return; @@ -531,7 +534,7 @@ void QQuickScrollBar::increase() qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize; bool wasActive = d->active; setActive(true); - setPosition(d->position + step); + setPosition(qMin<qreal>(1.0 - d->size, d->position + step)); setActive(wasActive); } @@ -548,7 +551,7 @@ void QQuickScrollBar::decrease() qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize; bool wasActive = d->active; setActive(true); - setPosition(d->position - step); + setPosition(qMax<qreal>(0.0, d->position - step)); setActive(wasActive); } |