diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2015-11-24 14:56:12 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2015-11-24 15:10:22 +0000 |
commit | 4d2021e7d600959c8a30e4d8b57278791301831b (patch) | |
tree | f1c0be004e85f27c875298706ab7c4ce2ed8c1e5 /src/templates/qquickscrollbar.cpp | |
parent | 9c038a71c383a7fb01a9ef4bc847b34807cec31f (diff) |
Fix ScrollBar layouting
QQuickScrollBar was relying on itemGeometryChanged() for the attached
flickable. If the flickable geometry didn't change _after_ scroll bar
was attached, the bar was not positioned and resized as appropriate.
Change-Id: I8f8695b468596acf570e028dae96f7c31d73ffba
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/templates/qquickscrollbar.cpp')
-rw-r--r-- | src/templates/qquickscrollbar.cpp | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/src/templates/qquickscrollbar.cpp b/src/templates/qquickscrollbar.cpp index a2c399c3..f6499004 100644 --- a/src/templates/qquickscrollbar.cpp +++ b/src/templates/qquickscrollbar.cpp @@ -314,6 +314,9 @@ public: void scrollHorizontal(); void scrollVertical(); + 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; @@ -363,27 +366,34 @@ void QQuickScrollBarAttachedPrivate::scrollVertical() flickable->setContentY(cy); } +void QQuickScrollBarAttachedPrivate::layoutHorizontal(bool move) +{ + Q_ASSERT(horizontal && flickable); + horizontal->setWidth(flickable->width()); + if (move) + horizontal->setY(flickable->height() - horizontal->height()); +} + +void QQuickScrollBarAttachedPrivate::layoutVertical(bool move) +{ + Q_ASSERT(vertical && flickable); + vertical->setHeight(flickable->height()); + if (move && !QQuickItemPrivate::get(vertical)->isMirrored()) + vertical->setX(flickable->width() - vertical->width()); +} + void QQuickScrollBarAttachedPrivate::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); } } @@ -442,6 +452,7 @@ void QQuickScrollBarAttached::setHorizontal(QQuickScrollBar *horizontal) 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()); } @@ -496,6 +507,7 @@ void QQuickScrollBarAttached::setVertical(QQuickScrollBar *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()); } |