aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSoheil Armin <soheil.armin@qt.io>2022-05-02 12:14:05 +0300
committerSoheil Armin <soheil.armin@qt.io>2022-05-24 00:50:09 +0000
commitce441f819389d729dea63a7d1ae02fae35b35bfc (patch)
treedf4fd048d9a5e1bfb0c21ffee8e60ccbea566e7b
parent99a4d40065cffd8047ed4f97aa1ba21fac420940 (diff)
Fix visualSize calculation when width is changing
Position of the ScrollBar handle is fixed when it's being resized except when it's on the extreme side (position + size = 1). In this case, when the width is growing, the handle size should grow and the position should decrease as a result. Fixes: QTBUG-98387 Change-Id: Ibb18c03a741bb4e5a19425a57f14a68d27d68d12 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
-rw-r--r--src/quicktemplates2/qquickscrollbar.cpp18
-rw-r--r--src/quicktemplates2/qquickscrollindicator.cpp11
-rw-r--r--tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml23
-rw-r--r--tests/auto/quickcontrols2/controls/data/tst_scrollindicator.qml23
4 files changed, 68 insertions, 7 deletions
diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp
index 9858ad1f38..9397f098d2 100644
--- a/src/quicktemplates2/qquickscrollbar.cpp
+++ b/src/quicktemplates2/qquickscrollbar.cpp
@@ -169,10 +169,12 @@ QQuickScrollBarPrivate::VisualArea QQuickScrollBarPrivate::visualArea() const
if (minimumSize > size && size != 1.0)
visualPos = position / (1.0 - size) * (1.0 - minimumSize);
- qreal visualSize = qBound<qreal>(0, qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
- qMax(0.0, 1.0 - visualPos));
+ qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
+ qreal visualSize = qMax<qreal>(minimumSize,
+ qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
+ maximumSize));
- visualPos = qBound<qreal>(0, visualPos, qMax<qreal>(0, 1.0 - visualSize));
+ visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
return VisualArea(visualPos, visualSize);
}
@@ -333,7 +335,7 @@ bool QQuickScrollBarPrivate::handleMove(const QPointF &point, ulong timestamp)
if (!pressed)
return true;
- qreal pos = qBound<qreal>(0.0, positionAt(point) - offset, 1.0 - size);
+ qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
if (snapMode == QQuickScrollBar::SnapAlways)
pos = snapPosition(pos);
q->setPosition(pos);
@@ -353,7 +355,7 @@ bool QQuickScrollBarPrivate::handleRelease(const QPointF &point, ulong timestamp
return true;
}
- qreal pos = qBound<qreal>(0.0, positionAt(point) - offset, 1.0 - size);
+ qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
if (snapMode != QQuickScrollBar::NoSnap)
pos = snapPosition(pos);
q->setPosition(pos);
@@ -446,6 +448,12 @@ void QQuickScrollBar::setSize(qreal size)
d->size = size;
auto oldVisualArea = d->visualArea();
+ d->size = qBound(0.0, size, 1.0);
+ if (d->size + d->position > 1.0) {
+ setPosition(1.0 - d->size);
+ oldVisualArea = d->visualArea();
+ }
+
if (isComponentComplete())
d->resizeContent();
emit sizeChanged();
diff --git a/src/quicktemplates2/qquickscrollindicator.cpp b/src/quicktemplates2/qquickscrollindicator.cpp
index 7f83f36813..918f7db86d 100644
--- a/src/quicktemplates2/qquickscrollindicator.cpp
+++ b/src/quicktemplates2/qquickscrollindicator.cpp
@@ -163,9 +163,12 @@ QQuickScrollIndicatorPrivate::VisualArea QQuickScrollIndicatorPrivate::visualAre
if (minimumSize > size)
visualPos = position / (1.0 - size) * (1.0 - minimumSize);
- qreal visualSize = qBound<qreal>(0, qMax(size, minimumSize) + qMin<qreal>(0, visualPos), 1.0 - visualPos);
+ qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
+ qreal visualSize = qMax<qreal>(minimumSize,
+ qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
+ maximumSize));
- visualPos = qBound<qreal>(0, visualPos, 1.0 - visualSize);
+ visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
return VisualArea(visualPos, visualSize);
}
@@ -234,6 +237,10 @@ void QQuickScrollIndicator::setSize(qreal size)
auto oldVisualArea = d->visualArea();
d->size = size;
+ if (d->size + d->position > 1.0) {
+ setPosition(1.0 - d->size);
+ oldVisualArea = d->visualArea();
+ }
if (isComponentComplete())
d->resizeContent();
emit sizeChanged();
diff --git a/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml b/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml
index d453f017e7..9e3f8e31d9 100644
--- a/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml
+++ b/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml
@@ -965,6 +965,29 @@ TestCase {
compare(vertical.contentItem.y, vertical.topPadding + 0.2 * vertical.availableHeight)
}
+ function test_resize() {
+ var vertical = createTemporaryObject(scrollBar, testCase, { height:200, orientation: Qt.Vertical, size: 0.5, position: 0.5 })
+ verify(vertical)
+
+ vertical.size = 0.8
+ compare(vertical.position, 0.2)
+ compare(vertical.visualPosition, 0.2)
+ vertical.size = 0.5
+ compare(vertical.position, 0.2)
+ compare(vertical.visualPosition, 0.2)
+
+
+ var horizontal = createTemporaryObject(scrollBar, testCase, { width:200, orientation: Qt.Horizontal, size: 0.5, position: 0.5 })
+ verify(horizontal)
+
+ horizontal.size = 0.8
+ compare(horizontal.position, 0.2)
+ compare(horizontal.visualPosition, 0.2)
+ horizontal.size = 0.5
+ compare(horizontal.position, 0.2)
+ compare(horizontal.visualPosition, 0.2)
+ }
+
function test_setting_invalid_property_values() {
var control = createTemporaryObject(scrollBar, testCase, {size: 2.0, minimumSize: -1.0})
verify(control)
diff --git a/tests/auto/quickcontrols2/controls/data/tst_scrollindicator.qml b/tests/auto/quickcontrols2/controls/data/tst_scrollindicator.qml
index 363048c0bd..672b349719 100644
--- a/tests/auto/quickcontrols2/controls/data/tst_scrollindicator.qml
+++ b/tests/auto/quickcontrols2/controls/data/tst_scrollindicator.qml
@@ -306,4 +306,27 @@ TestCase {
compare(vertical.visualPosition, 0.2)
compare(vertical.contentItem.y, vertical.topPadding + 0.2 * vertical.availableHeight)
}
+
+ function test_resize() {
+ var vertical = createTemporaryObject(scrollIndicator, testCase, { height:200, orientation: Qt.Vertical, size: 0.5, position: 0.5 })
+ verify(vertical)
+
+ vertical.size = 0.8
+ compare(vertical.position, 0.2)
+ compare(vertical.visualPosition, 0.2)
+ vertical.size = 0.5
+ compare(vertical.position, 0.2)
+ compare(vertical.visualPosition, 0.2)
+
+
+ var horizontal = createTemporaryObject(scrollIndicator, testCase, { width:200, orientation: Qt.Horizontal, size: 0.5, position: 0.5 })
+ verify(horizontal)
+
+ horizontal.size = 0.8
+ compare(horizontal.position, 0.2)
+ compare(horizontal.visualPosition, 0.2)
+ horizontal.size = 0.5
+ compare(horizontal.position, 0.2)
+ compare(horizontal.visualPosition, 0.2)
+ }
}