aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2016-02-12 10:53:43 +0100
committerLiang Qi <liang.qi@theqtcompany.com>2016-02-12 10:53:43 +0100
commit20a51e87fd15b8a6c1503b905399f7befe31114b (patch)
tree5a8667150568ed798d63eb165372c198549498c2 /src/quick
parent6c152bf27f94f01b2942b02e370df4fa01e0d40f (diff)
parent084dbb06d7b00c4a67edb6ce58956150036c35f2 (diff)
Merge remote-tracking branch 'origin/5.6' into dev
Conflicts: .qmake.conf Change-Id: I356ec83cf687bd2833f9a7c5e820d56b1efa8979
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/items/context2d/qquickcontext2dtexture.cpp5
-rw-r--r--src/quick/items/qquickflickable.cpp36
-rw-r--r--src/quick/items/qquickflickable_p.h1
-rw-r--r--src/quick/items/qquickflickable_p_p.h1
-rw-r--r--src/quick/items/qquickitem.cpp2
-rw-r--r--src/quick/items/qquickitemview.cpp6
-rw-r--r--src/quick/items/qquickwindowattached.cpp16
-rw-r--r--src/quick/util/qquickanimator.cpp19
-rw-r--r--src/quick/util/qquickanimator_p_p.h2
9 files changed, 68 insertions, 20 deletions
diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp
index 12bd95101f..f3513f447a 100644
--- a/src/quick/items/context2d/qquickcontext2dtexture.cpp
+++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp
@@ -605,6 +605,11 @@ QPaintDevice* QQuickContext2DFBOTexture::beginPainting()
void QQuickContext2DFBOTexture::endPainting()
{
QQuickContext2DTexture::endPainting();
+
+ // There may not be an FBO due to zero width or height.
+ if (!m_fbo)
+ return;
+
if (m_multisampledFbo)
QOpenGLFramebufferObject::blitFramebuffer(m_fbo, m_multisampledFbo);
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp
index 3663b379bb..3bfd1e8b9a 100644
--- a/src/quick/items/qquickflickable.cpp
+++ b/src/quick/items/qquickflickable.cpp
@@ -65,6 +65,8 @@ static const int FlickThreshold = 15;
// will ensure the Flickable retains the grab on consecutive flicks.
static const int RetainGrabVelocity = 100;
+static const int MovementEndingTimerInterval = 100;
+
static qreal EaseOvershoot(qreal t) {
return qAtan(t);
}
@@ -244,6 +246,8 @@ void QQuickFlickablePrivate::init()
contentItem->setParentItem(q);
qmlobject_connect(&timeline, QQuickTimeLine, SIGNAL(completed()),
q, QQuickFlickable, SLOT(timelineCompleted()))
+ qmlobject_connect(&velocityTimeline, QQuickTimeLine, SIGNAL(completed()),
+ q, QQuickFlickable, SLOT(velocityTimelineCompleted()))
q->setAcceptedMouseButtons(Qt::LeftButton);
q->setFiltersChildMouseEvents(true);
QQuickItemPrivate *viewportPrivate = QQuickItemPrivate::get(contentItem);
@@ -1202,6 +1206,8 @@ void QQuickFlickablePrivate::drag(qint64 currentTimestamp, QEvent::Type eventTyp
hData.velocity = 0;
}
+ if (momentum && !hData.flicking && !vData.flicking)
+ flickingStarted(hData.velocity != 0, vData.velocity != 0);
draggingStarting();
if ((hMoved && !prevHMoved) || (vMoved && !prevVMoved))
@@ -1391,9 +1397,15 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event)
d->maybeBeginDrag(currentTimestamp, event->posF());
break;
case Qt::ScrollUpdate:
+ if (d->scrollingPhase) {
+ d->pressed = true;
+ d->movementEndingTimer.start(MovementEndingTimerInterval, this);
+ }
break;
case Qt::ScrollEnd:
+ d->pressed = false;
d->scrollingPhase = false;
+ d->movementEndingTimer.start(MovementEndingTimerInterval, this);
d->draggingEnding();
event->accept();
returnToBounds();
@@ -1415,7 +1427,6 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event)
valid = true;
}
if (valid) {
- d->vData.flicking = false;
d->flickY(d->vData.velocity);
d->flickingStarted(false, true);
if (d->vData.flicking) {
@@ -1435,7 +1446,6 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event)
valid = true;
}
if (valid) {
- d->hData.flicking = false;
d->flickX(d->hData.velocity);
d->flickingStarted(true, false);
if (d->hData.flicking) {
@@ -1548,6 +1558,12 @@ void QQuickFlickable::timerEvent(QTimerEvent *event)
if (d->delayedPressEvent) {
d->replayDelayedPress();
}
+ } else if (event->timerId() == d->movementEndingTimer.timerId()) {
+ d->movementEndingTimer.stop();
+ d->pressed = false;
+ d->stealMouse = false;
+ if (!d->velocityTimeline.isActive())
+ movementEnding(true, true);
}
}
@@ -2475,6 +2491,22 @@ bool QQuickFlickable::isMovingVertically() const
return d->vData.moving;
}
+void QQuickFlickable::velocityTimelineCompleted()
+{
+ Q_D(QQuickFlickable);
+ if ( (d->hData.transitionToBounds && d->hData.transitionToBounds->isActive())
+ || (d->vData.transitionToBounds && d->vData.transitionToBounds->isActive()) ) {
+ return;
+ }
+ // With subclasses such as GridView, velocityTimeline.completed is emitted repeatedly:
+ // for example setting currentIndex results in a visual "flick" which the user
+ // didn't initiate directly. We don't want to end movement repeatedly, and in
+ // that case movementEnding will happen after the sequence of movements ends.
+ if (d->vData.flicking)
+ movementEnding();
+ d->updateBeginningEnd();
+}
+
void QQuickFlickable::timelineCompleted()
{
Q_D(QQuickFlickable);
diff --git a/src/quick/items/qquickflickable_p.h b/src/quick/items/qquickflickable_p.h
index a7995c5025..6cf78dcf63 100644
--- a/src/quick/items/qquickflickable_p.h
+++ b/src/quick/items/qquickflickable_p.h
@@ -259,6 +259,7 @@ protected Q_SLOTS:
void movementStarting();
void movementEnding();
void movementEnding(bool hMovementEnding, bool vMovementEnding);
+ void velocityTimelineCompleted();
void timelineCompleted();
protected:
diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h
index 83e38af8a9..3c59b19ec2 100644
--- a/src/quick/items/qquickflickable_p_p.h
+++ b/src/quick/items/qquickflickable_p_p.h
@@ -218,6 +218,7 @@ public:
bool calcVelocity : 1;
bool pixelAligned : 1;
QElapsedTimer timer;
+ QBasicTimer movementEndingTimer;
qint64 lastPosTime;
qint64 lastPressTime;
QPointF lastPos;
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 5be1c86fb4..8715fa2772 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -7256,7 +7256,7 @@ void QQuickItem::setKeepTouchGrab(bool keep)
}
/*!
- \qmlmethod object QtQuick::Item::contains(point point)
+ \qmlmethod bool QtQuick::Item::contains(point point)
Returns true if this item contains \a point, which is in local coordinates;
returns false otherwise.
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
index 7009a8e328..188b347a20 100644
--- a/src/quick/items/qquickitemview.cpp
+++ b/src/quick/items/qquickitemview.cpp
@@ -2484,8 +2484,10 @@ void QQuickItemViewPrivate::updateUnrequestedIndexes()
void QQuickItemViewPrivate::updateUnrequestedPositions()
{
- for (QHash<QQuickItem*,int>::const_iterator it = unrequestedItems.cbegin(), cend = unrequestedItems.cend(); it != cend; ++it)
- repositionPackageItemAt(it.key(), it.value());
+ for (QHash<QQuickItem*,int>::const_iterator it = unrequestedItems.cbegin(), cend = unrequestedItems.cend(); it != cend; ++it) {
+ if (it.value() >= 0)
+ repositionPackageItemAt(it.key(), it.value());
+ }
}
void QQuickItemViewPrivate::updateVisibleIndex()
diff --git a/src/quick/items/qquickwindowattached.cpp b/src/quick/items/qquickwindowattached.cpp
index e1cd3c82f2..992bbae382 100644
--- a/src/quick/items/qquickwindowattached.cpp
+++ b/src/quick/items/qquickwindowattached.cpp
@@ -95,21 +95,21 @@ void QQuickWindowAttached::windowChanged(QQuickWindow *window)
if (oldWindow)
oldWindow->disconnect(this);
- if (!window)
- return; // No values to get, therefore nothing to emit
-
- if (!oldWindow || window->visibility() != oldWindow->visibility())
+ if (!oldWindow || !window || window->visibility() != oldWindow->visibility())
emit visibilityChanged();
- if (!oldWindow || window->isActive() != oldWindow->isActive())
+ if (!oldWindow || !window || window->isActive() != oldWindow->isActive())
emit activeChanged();
- if (!oldWindow || window->activeFocusItem() != oldWindow->activeFocusItem())
+ if (!oldWindow || !window || window->activeFocusItem() != oldWindow->activeFocusItem())
emit activeFocusItemChanged();
emit contentItemChanged();
- if (!oldWindow || window->width() != oldWindow->width())
+ if (!oldWindow || !window || window->width() != oldWindow->width())
emit widthChanged();
- if (!oldWindow || window->height() != oldWindow->height())
+ if (!oldWindow || !window || window->height() != oldWindow->height())
emit heightChanged();
+ if (!window)
+ return;
+
// QQuickWindowQmlImpl::visibilityChanged also exists, and window might even
// be QQuickWindowQmlImpl, but that's not what we are connecting to.
// So this is actual window state rather than a buffered or as-requested one.
diff --git a/src/quick/util/qquickanimator.cpp b/src/quick/util/qquickanimator.cpp
index f0d4caf7ab..abae6321b0 100644
--- a/src/quick/util/qquickanimator.cpp
+++ b/src/quick/util/qquickanimator.cpp
@@ -217,7 +217,8 @@ qreal QQuickAnimator::from() const
void QQuickAnimatorPrivate::apply(QQuickAnimatorJob *job,
const QString &propertyName,
QQuickStateActions &actions,
- QQmlProperties &modified)
+ QQmlProperties &modified,
+ QObject *defaultTarget)
{
if (actions.size()) {
@@ -249,14 +250,20 @@ void QQuickAnimatorPrivate::apply(QQuickAnimatorJob *job,
// the item when a transition is cancelled.
action.fromValue = action.toValue;
}
- } else {
+ }
+
+ if (modified.isEmpty()) {
job->setTarget(target);
job->setFrom(from);
job->setTo(to);
}
- if (!job->target() && defaultProperty.object())
- job->setTarget(qobject_cast<QQuickItem *>(defaultProperty.object()));
+ if (!job->target()) {
+ if (defaultProperty.object())
+ job->setTarget(qobject_cast<QQuickItem *>(defaultProperty.object()));
+ else
+ job->setTarget(qobject_cast<QQuickItem *>(defaultTarget));
+ }
job->setDuration(duration);
job->setLoopCount(loopCount);
@@ -266,7 +273,7 @@ void QQuickAnimatorPrivate::apply(QQuickAnimatorJob *job,
QAbstractAnimationJob *QQuickAnimator::transition(QQuickStateActions &actions,
QQmlProperties &modified,
TransitionDirection direction,
- QObject *)
+ QObject *defaultTarget)
{
Q_D(QQuickAnimator);
@@ -283,7 +290,7 @@ QAbstractAnimationJob *QQuickAnimator::transition(QQuickStateActions &actions,
if (!job)
return 0;
- d->apply(job, propertyName(), actions, modified);
+ d->apply(job, propertyName(), actions, modified, defaultTarget);
if (!job->target()) {
delete job;
diff --git a/src/quick/util/qquickanimator_p_p.h b/src/quick/util/qquickanimator_p_p.h
index 7a61462762..b176119c70 100644
--- a/src/quick/util/qquickanimator_p_p.h
+++ b/src/quick/util/qquickanimator_p_p.h
@@ -82,7 +82,7 @@ public:
uint isFromDefined : 1;
uint isToDefined : 1;
- void apply(QQuickAnimatorJob *job, const QString &propertyName, QQuickStateActions &actions, QQmlProperties &modified);
+ void apply(QQuickAnimatorJob *job, const QString &propertyName, QQuickStateActions &actions, QQmlProperties &modified, QObject *defaultTarget);
};
class QQuickRotationAnimatorPrivate : public QQuickAnimatorPrivate