aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandr Akulich <akulichalexander@gmail.com>2016-06-16 11:15:12 +0500
committerJędrzej Nowacki <jedrzej.nowacki@qt.io>2017-11-03 08:27:25 +0000
commiteb2265d4c89b64c571f276e628b751abac29f895 (patch)
tree183a79eacc5ef0d7a9d99b3837f13a3a0b3285f8
parent0d84aaf05c7306c8e39bac7acd7c85dc04358b17 (diff)
QQuickFlickable: Use QQuickItem::setSize() in resizeContent()
Sequential call of setWidth() and setHeight() results in outdated height on widthChanged() signal. Use setSize() to set width and height at once. Change-Id: I013f5e1fcfc65a8606f9596ddc196b633873dc98 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r--src/quick/items/qquickflickable.cpp34
-rw-r--r--tests/auto/quick/qquickflickable/tst_qquickflickable.cpp8
2 files changed, 25 insertions, 17 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp
index c75a682f4a..3462752370 100644
--- a/src/quick/items/qquickflickable.cpp
+++ b/src/quick/items/qquickflickable.cpp
@@ -2181,25 +2181,25 @@ qreal QQuickFlickable::originX() const
void QQuickFlickable::resizeContent(qreal w, qreal h, QPointF center)
{
Q_D(QQuickFlickable);
- if (w != d->hData.viewSize) {
- qreal oldSize = d->hData.viewSize;
- d->hData.viewSize = w;
- d->contentItem->setWidth(w);
+ const qreal oldHSize = d->hData.viewSize;
+ const qreal oldVSize = d->vData.viewSize;
+ const bool needToUpdateWidth = w != oldHSize;
+ const bool needToUpdateHeight = h != oldVSize;
+ d->hData.viewSize = w;
+ d->vData.viewSize = h;
+ d->contentItem->setSize(QSizeF(w, h));
+ if (needToUpdateWidth)
emit contentWidthChanged();
- if (center.x() != 0) {
- qreal pos = center.x() * w / oldSize;
- setContentX(contentX() + pos - center.x());
- }
- }
- if (h != d->vData.viewSize) {
- qreal oldSize = d->vData.viewSize;
- d->vData.viewSize = h;
- d->contentItem->setHeight(h);
+ if (needToUpdateHeight)
emit contentHeightChanged();
- if (center.y() != 0) {
- qreal pos = center.y() * h / oldSize;
- setContentY(contentY() + pos - center.y());
- }
+
+ if (center.x() != 0) {
+ qreal pos = center.x() * w / oldHSize;
+ setContentX(contentX() + pos - center.x());
+ }
+ if (center.y() != 0) {
+ qreal pos = center.y() * h / oldVSize;
+ setContentY(contentY() + pos - center.y());
}
d->updateBeginningEnd();
}
diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
index f8277c6895..4ae021e609 100644
--- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
+++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
@@ -38,6 +38,7 @@
#include <private/qqmlvaluetype_p.h>
#include <math.h>
#include "../../shared/util.h"
+#include "../shared/geometrytestutil.h"
#include "../shared/viewtestutil.h"
#include "../shared/visualtestutil.h"
@@ -784,7 +785,14 @@ void tst_qquickflickable::resizeContent()
QCOMPARE(obj->contentWidth(), 300.);
QCOMPARE(obj->contentHeight(), 300.);
+ QQuickFlickablePrivate *fp = QQuickFlickablePrivate::get(obj);
+ QSizeChangeListener sizeListener(fp->contentItem);
+
QMetaObject::invokeMethod(root, "resizeContent");
+ for (const QSize sizeOnGeometryChanged : sizeListener) {
+ // Check that we have the correct size on all signals
+ QCOMPARE(sizeOnGeometryChanged, QSize(600, 600));
+ }
QCOMPARE(obj->contentX(), 100.);
QCOMPARE(obj->contentY(), 100.);