diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-06-25 12:16:25 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-12-29 11:43:59 +0000 |
commit | bb594453f9cb96bf8f2975d4a8aa5379cfc46e23 (patch) | |
tree | ce081a574c6fb7e54cb3d519c9556fe3536e38c2 /src/quick/items | |
parent | 9a272ad1854d744ea57296ba633b9d0dc19d1625 (diff) |
Flickable: add horizontal/verticalOvershoot properties
[ChangeLog][QtQuick][Flickable] Added horizontalOvershoot and
verticalOvershoot properties that can be used for implementing
boundary actions and effects.
Task-number: QTBUG-38515
Change-Id: I06379348a67d03507b56788d6fc7020bbb2d375f
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 80 | ||||
-rw-r--r-- | src/quick/items/qquickflickable_p.h | 9 | ||||
-rw-r--r-- | src/quick/items/qquickflickable_p_p.h | 3 | ||||
-rw-r--r-- | src/quick/items/qquickitemsmodule.cpp | 1 |
4 files changed, 90 insertions, 3 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 00a1306627..4ab604b30f 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -1570,12 +1570,52 @@ void QQuickFlickablePrivate::replayDelayedPress() //XXX pixelAligned ignores the global position of the Flickable, i.e. assumes Flickable itself is pixel aligned. void QQuickFlickablePrivate::setViewportX(qreal x) { - contentItem->setX(pixelAligned ? -Round(-x) : x); + Q_Q(QQuickFlickable); + if (pixelAligned) + x = -Round(-x); + + contentItem->setX(x); + if (contentItem->x() != x) + return; // reentered + + const qreal maxX = q->maxXExtent(); + const qreal minX = q->minXExtent(); + + qreal overshoot = 0.0; + if (x <= maxX) + overshoot = maxX - x; + else if (x >= minX) + overshoot = minX - x; + + if (overshoot != hData.overshoot) { + hData.overshoot = overshoot; + emit q->horizontalOvershootChanged(); + } } void QQuickFlickablePrivate::setViewportY(qreal y) { - contentItem->setY(pixelAligned ? -Round(-y) : y); + Q_Q(QQuickFlickable); + if (pixelAligned) + y = -Round(-y); + + contentItem->setY(y); + if (contentItem->y() != y) + return; // reentered + + const qreal maxY = q->maxYExtent(); + const qreal minY = q->minYExtent(); + + qreal overshoot = 0.0; + if (y <= maxY) + overshoot = maxY - y; + else if (y >= minY) + overshoot = minY - y; + + if (overshoot != vData.overshoot) { + vData.overshoot = overshoot; + emit q->verticalOvershootChanged(); + } } void QQuickFlickable::timerEvent(QTimerEvent *event) @@ -1841,6 +1881,8 @@ QQmlListProperty<QQuickItem> QQuickFlickable::flickableChildren() beyond the boundary of the Flickable, and can overshoot the boundary when flicked. \endlist + + \sa horizontalOvershoot, verticalOvershoot */ QQuickFlickable::BoundsBehavior QQuickFlickable::boundsBehavior() const { @@ -2638,4 +2680,38 @@ void QQuickFlickablePrivate::updateVelocity() emit q->verticalVelocityChanged(); } +/*! + \qmlproperty real QtQuick::Flickable::horizontalOvershoot + \since 5.9 + + This property holds the horizontal overshoot, that is, the horizontal distance by + which the contents has been dragged or flicked past the bounds of the flickable. + The value is negative when the content is dragged or flicked beyond the beginning, + and positive when beyond the end; \c 0.0 otherwise. + + \sa verticalOvershoot, boundsBehavior +*/ +qreal QQuickFlickable::horizontalOvershoot() const +{ + Q_D(const QQuickFlickable); + return d->hData.overshoot; +} + +/*! + \qmlproperty real QtQuick::Flickable::verticalOvershoot + \since 5.9 + + This property holds the vertical overshoot, that is, the vertical distance by + which the contents has been dragged or flicked past the bounds of the flickable. + The value is negative when the content is dragged or flicked beyond the beginning, + and positive when beyond the end; \c 0.0 otherwise. + + \sa horizontalOvershoot, boundsBehavior +*/ +qreal QQuickFlickable::verticalOvershoot() const +{ + Q_D(const QQuickFlickable); + return d->vData.overshoot; +} + QT_END_NAMESPACE diff --git a/src/quick/items/qquickflickable_p.h b/src/quick/items/qquickflickable_p.h index 7384c7271a..78c8271525 100644 --- a/src/quick/items/qquickflickable_p.h +++ b/src/quick/items/qquickflickable_p.h @@ -106,6 +106,9 @@ class Q_QUICK_PRIVATE_EXPORT QQuickFlickable : public QQuickItem Q_PROPERTY(bool pixelAligned READ pixelAligned WRITE setPixelAligned NOTIFY pixelAlignedChanged) + Q_PROPERTY(qreal horizontalOvershoot READ horizontalOvershoot NOTIFY horizontalOvershootChanged REVISION 9) + Q_PROPERTY(qreal verticalOvershoot READ verticalOvershoot NOTIFY verticalOvershootChanged REVISION 9) + Q_PROPERTY(QQmlListProperty<QObject> flickableData READ flickableData) Q_PROPERTY(QQmlListProperty<QQuickItem> flickableChildren READ flickableChildren) Q_CLASSINFO("DefaultProperty", "flickableData") @@ -201,6 +204,9 @@ public: bool pixelAligned() const; void setPixelAligned(bool align); + qreal horizontalOvershoot() const; + qreal verticalOvershoot() const; + Q_INVOKABLE void resizeContent(qreal w, qreal h, QPointF center); Q_INVOKABLE void returnToBounds(); Q_INVOKABLE void flick(qreal xVelocity, qreal yVelocity); @@ -243,6 +249,8 @@ Q_SIGNALS: void dragStarted(); void dragEnded(); void pixelAlignedChanged(); + Q_REVISION(9) void horizontalOvershootChanged(); + Q_REVISION(9) void verticalOvershootChanged(); protected: bool childMouseEventFilter(QQuickItem *, QEvent *) Q_DECL_OVERRIDE; @@ -286,6 +294,7 @@ protected: private: Q_DISABLE_COPY(QQuickFlickable) Q_DECLARE_PRIVATE(QQuickFlickable) + friend class QQuickFlickableContentItem; friend class QQuickFlickableVisibleArea; friend class QQuickFlickableReboundTransition; }; diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h index 0c3bc21071..1ceff22dfc 100644 --- a/src/quick/items/qquickflickable_p_p.h +++ b/src/quick/items/qquickflickable_p_p.h @@ -101,7 +101,7 @@ public: : move(fp, func) , transitionToBounds(0) , viewSize(-1), lastPos(0), previousDragDelta(0), velocity(0), startMargin(0), endMargin(0) - , origin(0) + , origin(0), overshoot(0) , transitionTo(0) , continuousFlickVelocity(0), velocityTime(), vTime(0) , smoothVelocity(fp), atEnd(false), atBeginning(true) @@ -148,6 +148,7 @@ public: qreal startMargin; qreal endMargin; qreal origin; + qreal overshoot; qreal transitionTo; qreal continuousFlickVelocity; QElapsedTimer velocityTime; diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp index b0ddbb0034..b8db5d76e4 100644 --- a/src/quick/items/qquickitemsmodule.cpp +++ b/src/quick/items/qquickitemsmodule.cpp @@ -374,6 +374,7 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor) qmlRegisterType<QQuickBorderImageMesh>("QtQuick", 2, 8, "BorderImageMesh"); #endif + qmlRegisterType<QQuickFlickable, 9>(uri, 2, 9, "Flickable"); qmlRegisterType<QQuickMouseArea, 9>(uri, 2, 9, "MouseArea"); } |