aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickscrollbar.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-01-20 16:01:51 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-01-20 15:26:30 +0000
commit7f2a5162511f5ce47ce8ff2b7e90071cedab37f9 (patch)
tree916b59627d936427564f765512c19ca1119a16ea /src/quicktemplates2/qquickscrollbar.cpp
parent6c0ee76c646778d6a45018acc8d561c5a5d931f8 (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.cpp19
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);
}