diff options
-rw-r--r-- | src/templates/qquickscrollindicator.cpp | 40 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_scrollindicator.qml | 16 |
2 files changed, 42 insertions, 14 deletions
diff --git a/src/templates/qquickscrollindicator.cpp b/src/templates/qquickscrollindicator.cpp index 81a96ac5..94b47e4d 100644 --- a/src/templates/qquickscrollindicator.cpp +++ b/src/templates/qquickscrollindicator.cpp @@ -228,6 +228,9 @@ public: void activateHorizontal(); void activateVertical(); + void layoutHorizontal(bool move = true); + void layoutVertical(bool move = true); + void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; QQuickFlickable *flickable; @@ -245,27 +248,34 @@ void QQuickScrollIndicatorAttachedPrivate::activateVertical() vertical->setActive(flickable->isMovingVertically()); } +void QQuickScrollIndicatorAttachedPrivate::layoutHorizontal(bool move) +{ + Q_ASSERT(horizontal && flickable); + horizontal->setWidth(flickable->width()); + if (move) + horizontal->setY(flickable->height() - horizontal->height()); +} + +void QQuickScrollIndicatorAttachedPrivate::layoutVertical(bool move) +{ + Q_ASSERT(vertical && flickable); + vertical->setHeight(flickable->height()); + if (move && !QQuickItemPrivate::get(vertical)->isMirrored()) + vertical->setX(flickable->width() - vertical->width()); +} + void QQuickScrollIndicatorAttachedPrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) { Q_UNUSED(item); + Q_UNUSED(newGeometry); Q_ASSERT(item == flickable); if (horizontal) { - QQuickItemPrivate *p = QQuickItemPrivate::get(horizontal); - if (!p->widthValid) { - horizontal->setWidth(newGeometry.width()); - p->widthValid = false; - } - if (qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), oldGeometry.height() - horizontal->height())) - horizontal->setY(newGeometry.height() - horizontal->height()); + bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), oldGeometry.height() - horizontal->height()); + layoutHorizontal(move); } if (vertical) { - QQuickItemPrivate *p = QQuickItemPrivate::get(vertical); - if (!p->heightValid) { - vertical->setHeight(newGeometry.height()); - p->heightValid = false; - } - if (!p->isMirrored() && (qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), oldGeometry.width() - vertical->width()))) - vertical->setX(newGeometry.width() - vertical->width()); + bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), oldGeometry.width() - vertical->width()); + layoutVertical(move); } } @@ -322,6 +332,7 @@ void QQuickScrollIndicatorAttached::setHorizontal(QQuickScrollIndicator *horizon connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal))); connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal))); + d->layoutHorizontal(); horizontal->setSize(area->property("widthRatio").toReal()); horizontal->setPosition(area->property("xPosition").toReal()); } @@ -374,6 +385,7 @@ void QQuickScrollIndicatorAttached::setVertical(QQuickScrollIndicator *vertical) connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal))); connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal))); + d->layoutVertical(); vertical->setSize(area->property("heightRatio").toReal()); vertical->setPosition(area->property("yPosition").toReal()); } diff --git a/tests/auto/controls/data/tst_scrollindicator.qml b/tests/auto/controls/data/tst_scrollindicator.qml index 71e09784..99eef833 100644 --- a/tests/auto/controls/data/tst_scrollindicator.qml +++ b/tests/auto/controls/data/tst_scrollindicator.qml @@ -78,12 +78,20 @@ TestCase { compare(vertical.position, 0.0) compare(vertical.active, false) compare(vertical.orientation, Qt.Vertical) + compare(vertical.x, 0) + compare(vertical.y, 0) + verify(vertical.width > 0) + verify(vertical.height > 0) container.ScrollIndicator.vertical = vertical compare(vertical.parent, container) compare(vertical.orientation, Qt.Vertical) compare(vertical.size, container.visibleArea.heightRatio) compare(vertical.position, container.visibleArea.yPosition) + compare(vertical.x, container.width - vertical.width) + compare(vertical.y, 0) + verify(vertical.width > 0) + compare(vertical.height, container.height) var horizontal = scrollIndicator.createObject() verify(!horizontal.parent) @@ -91,12 +99,20 @@ TestCase { compare(horizontal.position, 0.0) compare(horizontal.active, false) compare(horizontal.orientation, Qt.Vertical) + compare(horizontal.x, 0) + compare(horizontal.y, 0) + verify(horizontal.width > 0) + verify(horizontal.height > 0) container.ScrollIndicator.horizontal = horizontal compare(horizontal.parent, container) compare(horizontal.orientation, Qt.Horizontal) compare(horizontal.size, container.visibleArea.widthRatio) compare(horizontal.position, container.visibleArea.xPosition) + compare(horizontal.x, 0) + compare(horizontal.y, container.height - horizontal.height) + compare(horizontal.width, container.width) + verify(horizontal.height > 0) var velocity = container.maximumFlickVelocity |