Flickable now emits contentX/YChanged after the content is updated
authorMartin Jones <martin.jones@nokia.com>
Fri, 6 Jan 2012 06:14:53 +0000 (16:14 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 6 Jan 2012 07:27:24 +0000 (08:27 +0100)
Currently view content is not created until after onContentYChanged
handlers are called, which is not what the user would expect
This change moves the contentX/YChanged emission to
after the content update and also removes the need for a
connect() in Flickable init.

Task-number: QTBUG-23462
Change-Id: I11e87a78160033e3ec6a9e7de733474f8345050d
Reviewed-by: Bea Lam <bea.lam@nokia.com>
src/quick/items/qquickflickable.cpp
src/quick/items/qquickflickable_p.h

index cb8c525..6df84f3 100644 (file)
@@ -190,7 +190,6 @@ void QQuickFlickablePrivate::init()
     Q_Q(QQuickFlickable);
     QDeclarative_setParent_noEvent(contentItem, q);
     contentItem->setParentItem(q);
-    FAST_CONNECT(&timeline, SIGNAL(updated()), q, SLOT(ticked()))
     FAST_CONNECT(&timeline, SIGNAL(completed()), q, SLOT(movementEnding()))
     q->setAcceptedMouseButtons(Qt::LeftButton);
     q->setFiltersChildMouseEvents(true);
@@ -238,9 +237,13 @@ void QQuickFlickablePrivate::itemGeometryChanged(QQuickItem *item, const QRectF
 {
     Q_Q(QQuickFlickable);
     if (item == contentItem) {
-        if (newGeom.x() != oldGeom.x())
+        bool xChanged = newGeom.x() != oldGeom.x();
+        bool yChanged = newGeom.y() != oldGeom.y();
+        if (xChanged || yChanged)
+            q->viewportMoved();
+        if (xChanged)
             emit q->contentXChanged();
-        if (newGeom.y() != oldGeom.y())
+        if (yChanged)
             emit q->contentYChanged();
     }
 }
@@ -595,10 +598,8 @@ void QQuickFlickable::setContentX(qreal pos)
     d->timeline.reset(d->hData.move);
     d->vTime = d->timeline.time();
     movementXEnding();
-    if (-pos != d->hData.move.value()) {
+    if (-pos != d->hData.move.value())
         d->hData.move.setValue(-pos);
-        viewportMoved();
-    }
 }
 
 qreal QQuickFlickable::contentY() const
@@ -614,10 +615,8 @@ void QQuickFlickable::setContentY(qreal pos)
     d->timeline.reset(d->vData.move);
     d->vTime = d->timeline.time();
     movementYEnding();
-    if (-pos != d->vData.move.value()) {
+    if (-pos != d->vData.move.value())
         d->vData.move.setValue(-pos);
-        viewportMoved();
-    }
 }
 
 /*!
@@ -711,11 +710,6 @@ bool QQuickFlickable::isAtYBeginning() const
     return d->vData.atBeginning;
 }
 
-void QQuickFlickable::ticked()
-{
-    viewportMoved();
-}
-
 /*!
     \qmlproperty Item QtQuick2::Flickable::contentItem
 
@@ -927,7 +921,6 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
     if (hMoved || vMoved) {
         draggingStarting();
         q->movementStarting();
-        q->viewportMoved();
     }
 
     if (!lastPos.isNull()) {
index 28df326..2c8e243 100644 (file)
@@ -233,7 +233,6 @@ protected:
     QQuickFlickableVisibleArea *visibleArea();
 
 protected Q_SLOTS:
-    virtual void ticked();
     void movementStarting();
     void movementEnding();