aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2012-06-04 13:34:57 +1000
committerQt by Nokia <qt-info@nokia.com>2012-06-06 10:14:01 +0200
commitc37c4215b0cfd31967b5799ebb0f0e78a55f7e85 (patch)
treee4bc695f80093b598c325ab530ed61605b79a943 /src
parent734c8ffbd361467d01eb278e9e289795f7139e94 (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')
-rw-r--r--src/quick/items/qquickflickable.cpp163
-rw-r--r--src/quick/items/qquickflickable_p.h3
-rw-r--r--src/quick/items/qquickflickable_p_p.h7
-rw-r--r--src/quick/items/qquickgridview.cpp22
-rw-r--r--src/quick/items/qquicklistview.cpp28
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;
}
}