diff options
author | Bea Lam <bea.lam@nokia.com> | 2012-06-04 13:34:57 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-06 10:14:01 +0200 |
commit | c37c4215b0cfd31967b5799ebb0f0e78a55f7e85 (patch) | |
tree | e4bc695f80093b598c325ab530ed61605b79a943 /src/quick | |
parent | 734c8ffbd361467d01eb278e9e289795f7139e94 (diff) |
Don't emit moving and flicking signals unnecessarily
The moving and flicking signals should only be emitted once when
the view has been moved/flicked both vertically and horizontally. (This
was already done correctly for the dragging signals.)
Also changes QQuickFlickable::flick() to return bool instead of void.
Subclasses no longer emit the flicking signals but call
flickingStarted() instead.
Also splits the tst_qquickflickable::movingAndDragging() test up into
several tests.
Change-Id: Ie527568a9702049dd0bcda18c2eb3e43d8938a18
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 163 | ||||
-rw-r--r-- | src/quick/items/qquickflickable_p.h | 3 | ||||
-rw-r--r-- | src/quick/items/qquickflickable_p_p.h | 7 | ||||
-rw-r--r-- | src/quick/items/qquickgridview.cpp | 22 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 28 |
5 files changed, 108 insertions, 115 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index a80f714fa7..c207c77458 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -267,19 +267,19 @@ void QQuickFlickablePrivate::itemGeometryChanged(QQuickItem *item, const QRectF } } -void QQuickFlickablePrivate::flickX(qreal velocity) +bool QQuickFlickablePrivate::flickX(qreal velocity) { Q_Q(QQuickFlickable); - flick(hData, q->minXExtent(), q->maxXExtent(), q->width(), fixupX_callback, velocity); + return flick(hData, q->minXExtent(), q->maxXExtent(), q->width(), fixupX_callback, velocity); } -void QQuickFlickablePrivate::flickY(qreal velocity) +bool QQuickFlickablePrivate::flickY(qreal velocity) { Q_Q(QQuickFlickable); - flick(vData, q->minYExtent(), q->maxYExtent(), q->height(), fixupY_callback, velocity); + return flick(vData, q->minYExtent(), q->maxYExtent(), q->height(), fixupY_callback, velocity); } -void QQuickFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal, +bool QQuickFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal, QQuickTimeLineCallback::Callback fixupCallback, qreal velocity) { Q_Q(QQuickFlickable); @@ -318,23 +318,16 @@ void QQuickFlickablePrivate::flick(AxisData &data, qreal minExtent, qreal maxExt else timeline.accel(data.move, v, accel, maxDistance); timeline.callback(QQuickTimeLineCallback(&data.move, fixupCallback, this)); - if (!hData.flicking && q->xflick() && (&data == &hData)) { - hData.flicking = true; - emit q->flickingChanged(); - emit q->flickingHorizontallyChanged(); - if (!vData.flicking) - emit q->flickStarted(); - } - if (!vData.flicking && q->yflick() && (&data == &vData)) { - vData.flicking = true; - emit q->flickingChanged(); - emit q->flickingVerticallyChanged(); - if (!hData.flicking) - emit q->flickStarted(); - } + + if (&data == &hData) + return !hData.flicking && q->xflick(); + else if (&data == &vData) + return !vData.flicking && q->yflick(); + return false; } else { timeline.reset(data.move); fixup(data, minExtent, maxExtent); + return false; } } @@ -641,7 +634,7 @@ void QQuickFlickable::setContentX(qreal pos) d->hData.explicitValue = true; d->timeline.reset(d->hData.move); d->vTime = d->timeline.time(); - movementXEnding(); + movementEnding(true, false); if (-pos != d->hData.move.value()) d->hData.move.setValue(-pos); } @@ -658,7 +651,7 @@ void QQuickFlickable::setContentY(qreal pos) d->vData.explicitValue = true; d->timeline.reset(d->vData.move); d->vTime = d->timeline.time(); - movementYEnding(); + movementEnding(false, true); if (-pos != d->vData.move.value()) d->vData.move.setValue(-pos); } @@ -1083,24 +1076,27 @@ void QQuickFlickablePrivate::handleMouseReleaseEvent(QMouseEvent *event) flickBoost = canBoost ? qBound(1.0, flickBoost+0.25, QML_FLICK_MULTIFLICK_MAXBOOST) : 1.0; + bool flickedV = false; vVelocity *= flickBoost; if (q->yflick() && qAbs(vVelocity) > MinimumFlickVelocity && qAbs(event->localPos().y() - pressPos.y()) > FlickThreshold) { velocityTimeline.reset(vData.smoothVelocity); vData.smoothVelocity.setValue(-vVelocity); - flickY(vVelocity); + flickedV = flickY(vVelocity); } else { fixupY(); } + bool flickedH = false; hVelocity *= flickBoost; if (q->xflick() && qAbs(hVelocity) > MinimumFlickVelocity && qAbs(event->localPos().x() - pressPos.x()) > FlickThreshold) { velocityTimeline.reset(hData.smoothVelocity); hData.smoothVelocity.setValue(-hVelocity); - flickX(hVelocity); + flickedH = flickX(hVelocity); } else { fixupX(); } + flickingStarted(flickedH, flickedV); if (!timeline.isActive()) q->movementEnding(); } @@ -1159,6 +1155,7 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event) if (valid) { d->vData.flicking = false; d->flickY(d->vData.velocity); + d->flickingStarted(false, true); if (d->vData.flicking) { d->vMoved = true; movementStarting(); @@ -1177,6 +1174,7 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event) if (valid) { d->hData.flicking = false; d->flickX(d->hData.velocity); + d->flickingStarted(true, false); if (d->hData.flicking) { d->hMoved = true; movementStarting(); @@ -1411,8 +1409,30 @@ void QQuickFlickable::geometryChanged(const QRectF &newGeometry, void QQuickFlickable::flick(qreal xVelocity, qreal yVelocity) { Q_D(QQuickFlickable); - d->flickX(xVelocity); - d->flickY(yVelocity); + bool flickedX = d->flickX(xVelocity); + bool flickedY = d->flickY(yVelocity); + d->flickingStarted(flickedX, flickedY); +} + +void QQuickFlickablePrivate::flickingStarted(bool flickingH, bool flickingV) +{ + Q_Q(QQuickFlickable); + if (!flickingH && !flickingV) + return; + + bool wasFlicking = hData.flicking || vData.flicking; + if (flickingH && !hData.flicking) { + hData.flicking = true; + emit q->flickingHorizontallyChanged(); + } + if (flickingV && !vData.flicking) { + vData.flicking = true; + emit q->flickingVerticallyChanged(); + } + if (!wasFlicking && (hData.flicking || vData.flicking)) { + emit q->flickingChanged(); + emit q->flickStarted(); + } } /*! @@ -2091,75 +2111,72 @@ bool QQuickFlickable::isMovingVertically() const void QQuickFlickable::movementStarting() { Q_D(QQuickFlickable); + bool wasMoving = d->hData.moving || d->vData.moving; if (d->hMoved && !d->hData.moving) { d->hData.moving = true; - emit movingChanged(); emit movingHorizontallyChanged(); - if (!d->vData.moving) - emit movementStarted(); } - else if (d->vMoved && !d->vData.moving) { + if (d->vMoved && !d->vData.moving) { d->vData.moving = true; - emit movingChanged(); emit movingVerticallyChanged(); - if (!d->hData.moving) - emit movementStarted(); + } + if (!wasMoving && (d->hData.moving || d->vData.moving)) { + emit movingChanged(); + emit movementStarted(); } } void QQuickFlickable::movementEnding() { - Q_D(QQuickFlickable); - movementXEnding(); - movementYEnding(); - d->hData.smoothVelocity.setValue(0); - d->vData.smoothVelocity.setValue(0); + movementEnding(true, true); } -void QQuickFlickable::movementXEnding() +void QQuickFlickable::movementEnding(bool hMovementEnding, bool vMovementEnding) { Q_D(QQuickFlickable); - if (d->hData.flicking) { + + // emit flicking signals + bool wasFlicking = d->hData.flicking || d->vData.flicking; + if (hMovementEnding && d->hData.flicking) { d->hData.flicking = false; - emit flickingChanged(); emit flickingHorizontallyChanged(); - if (!d->vData.flicking) - emit flickEnded(); - } - if (!d->pressed && !d->stealMouse) { - if (d->hData.moving) { - d->hData.moving = false; - d->hMoved = false; - emit movingChanged(); - emit movingHorizontallyChanged(); - if (!d->vData.moving) - emit movementEnded(); - } } - d->hData.fixingUp = false; -} - -void QQuickFlickable::movementYEnding() -{ - Q_D(QQuickFlickable); - if (d->vData.flicking) { + if (vMovementEnding && d->vData.flicking) { d->vData.flicking = false; - emit flickingChanged(); emit flickingVerticallyChanged(); - if (!d->hData.flicking) - emit flickEnded(); - } - if (!d->pressed && !d->stealMouse) { - if (d->vData.moving) { - d->vData.moving = false; - d->vMoved = false; - emit movingChanged(); - emit movingVerticallyChanged(); - if (!d->hData.moving) - emit movementEnded(); - } } - d->vData.fixingUp = false; + if (wasFlicking && (!d->hData.flicking || !d->vData.flicking)) { + emit flickingChanged(); + emit flickEnded(); + } + + // emit moving signals + bool wasMoving = d->hData.moving || d->vData.moving; + if (hMovementEnding && d->hData.moving + && (!d->pressed && !d->stealMouse)) { + d->hData.moving = false; + d->hMoved = false; + emit movingHorizontallyChanged(); + } + if (vMovementEnding && d->vData.moving + && (!d->pressed && !d->stealMouse)) { + d->vData.moving = false; + d->vMoved = false; + emit movingVerticallyChanged(); + } + if (wasMoving && (!d->hData.moving || !d->vData.moving)) { + emit movingChanged(); + emit movementEnded(); + } + + if (hMovementEnding) { + d->hData.fixingUp = false; + d->hData.smoothVelocity.setValue(0); + } + if (vMovementEnding) { + d->vData.fixingUp = false; + d->vData.smoothVelocity.setValue(0); + } } void QQuickFlickablePrivate::updateVelocity() diff --git a/src/quick/items/qquickflickable_p.h b/src/quick/items/qquickflickable_p.h index 109bca2112..08aa487951 100644 --- a/src/quick/items/qquickflickable_p.h +++ b/src/quick/items/qquickflickable_p.h @@ -237,10 +237,9 @@ protected: protected Q_SLOTS: void movementStarting(); void movementEnding(); + void movementEnding(bool hMovementEnding, bool vMovementEnding); protected: - void movementXEnding(); - void movementYEnding(); virtual qreal minXExtent() const; virtual qreal minYExtent() const; virtual qreal maxXExtent() const; diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h index ac6f2fffed..ab3070e5b1 100644 --- a/src/quick/items/qquickflickable_p_p.h +++ b/src/quick/items/qquickflickable_p_p.h @@ -145,10 +145,11 @@ public: mutable bool maxExtentDirty : 1; }; - void flickX(qreal velocity); - void flickY(qreal velocity); - virtual void flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, + bool flickX(qreal velocity); + bool flickY(qreal velocity); + virtual bool flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, QQuickTimeLineCallback::Callback fixupCallback, qreal velocity); + void flickingStarted(bool flickingH, bool flickingV); void fixupX(); void fixupY(); diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 3315deaebf..235005b758 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -229,7 +229,7 @@ public: virtual void updateViewport(); virtual void fixupPosition(); virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent); - virtual void flick(QQuickItemViewPrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, + virtual bool flick(QQuickItemViewPrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, QQuickTimeLineCallback::Callback fixupCallback, qreal velocity); QQuickGridView::Flow flow; @@ -1023,16 +1023,14 @@ void QQuickGridViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExte fixupMode = Normal; } -void QQuickGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, +bool QQuickGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, QQuickTimeLineCallback::Callback fixupCallback, qreal velocity) { - Q_Q(QQuickGridView); data.fixingUp = false; moveReason = Mouse; if ((!haveHighlightRange || highlightRange != QQuickGridView::StrictlyEnforceRange) && snapMode == QQuickGridView::NoSnap) { - QQuickItemViewPrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity); - return; + return QQuickItemViewPrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity); } qreal maxDistance = 0; qreal dataValue = isContentFlowReversed() ? -data.move.value()+size() : data.move.value(); @@ -1125,21 +1123,11 @@ void QQuickGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExte timeline.reset(data.move); timeline.accel(data.move, v, accel, maxDistance + overshootDist); timeline.callback(QQuickTimeLineCallback(&data.move, fixupCallback, this)); - if (!hData.flicking && q->xflick()) { - hData.flicking = true; - emit q->flickingChanged(); - emit q->flickingHorizontallyChanged(); - emit q->flickStarted(); - } - if (!vData.flicking && q->yflick()) { - vData.flicking = true; - emit q->flickingChanged(); - emit q->flickingVerticallyChanged(); - emit q->flickStarted(); - } + return true; } else { timeline.reset(data.move); fixup(data, minExtent, maxExtent); + return false; } } diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 48cdee8ea2..e2de19b498 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -132,7 +132,7 @@ public: void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry); virtual void fixupPosition(); virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent); - virtual void flick(QQuickItemViewPrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, + virtual bool flick(QQuickItemViewPrivate::AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, QQuickTimeLineCallback::Callback fixupCallback, qreal velocity); QQuickListView::Orientation orient; @@ -1471,17 +1471,14 @@ void QQuickListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExte fixupMode = Normal; } -void QQuickListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, +bool QQuickListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize, QQuickTimeLineCallback::Callback fixupCallback, qreal velocity) { - Q_Q(QQuickListView); - data.fixingUp = false; moveReason = Mouse; if ((!haveHighlightRange || highlightRange != QQuickListView::StrictlyEnforceRange) && snapMode == QQuickListView::NoSnap) { correctFlick = true; - QQuickItemViewPrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity); - return; + return QQuickItemViewPrivate::flick(data, minExtent, maxExtent, vSize, fixupCallback, velocity); } qreal maxDistance = 0; qreal dataValue = isContentFlowReversed() ? -data.move.value()+size() : data.move.value(); @@ -1587,19 +1584,8 @@ void QQuickListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExte timeline.reset(data.move); timeline.accel(data.move, v, accel, maxDistance + overshootDist); timeline.callback(QQuickTimeLineCallback(&data.move, fixupCallback, this)); - if (!hData.flicking && q->xflick()) { - hData.flicking = true; - emit q->flickingChanged(); - emit q->flickingHorizontallyChanged(); - emit q->flickStarted(); - } - if (!vData.flicking && q->yflick()) { - vData.flicking = true; - emit q->flickingChanged(); - emit q->flickingVerticallyChanged(); - emit q->flickStarted(); - } correctFlick = true; + return true; } else { // reevaluate the target boundary. qreal newtarget = data.flickTarget; @@ -1615,7 +1601,7 @@ void QQuickListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExte if (newtarget == data.flickTarget) { // boundary unchanged - nothing to do if (qAbs(velocity) < MinimumFlickVelocity) correctFlick = false; - return; + return false; } data.flickTarget = newtarget; qreal dist = -newtarget + data.move.value(); @@ -1623,16 +1609,18 @@ void QQuickListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExte correctFlick = false; timeline.reset(data.move); fixup(data, minExtent, maxExtent); - return; + return false; } timeline.reset(data.move); timeline.accelDistance(data.move, v, -dist); timeline.callback(QQuickTimeLineCallback(&data.move, fixupCallback, this)); + return false; } } else { correctFlick = false; timeline.reset(data.move); fixup(data, minExtent, maxExtent); + return false; } } |