aboutsummaryrefslogtreecommitdiffstats
path: root/src/templates/qquickscrollbar.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2015-11-24 14:56:12 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2015-11-24 15:10:22 +0000
commit4d2021e7d600959c8a30e4d8b57278791301831b (patch)
treef1c0be004e85f27c875298706ab7c4ce2ed8c1e5 /src/templates/qquickscrollbar.cpp
parent9c038a71c383a7fb01a9ef4bc847b34807cec31f (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.cpp40
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());
}