From d5686fa2ac2248d5a31237573fa08697f18f035f Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 9 Sep 2011 16:48:03 +1000 Subject: [PATCH] Experimental 'pixelAligned' property for Flickable. Change-Id: I671af87c4d2db3403ab506ae32608c91d6982338 Reviewed-on: http://codereview.qt-project.org/4506 Reviewed-by: Qt Sanity Bot Reviewed-by: Alan Alpert --- src/declarative/items/qsgflickable.cpp | 21 +++++++++++++++++++-- src/declarative/items/qsgflickable_p.h | 6 ++++++ src/declarative/items/qsgflickable_p_p.h | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/declarative/items/qsgflickable.cpp b/src/declarative/items/qsgflickable.cpp index d62197f..962eb96 100644 --- a/src/declarative/items/qsgflickable.cpp +++ b/src/declarative/items/qsgflickable.cpp @@ -174,6 +174,7 @@ QSGFlickablePrivate::QSGFlickablePrivate() , hMoved(false), vMoved(false) , movingHorizontally(false), movingVertically(false) , stealMouse(false), pressed(false), interactive(true), calcVelocity(false) + , pixelAligned(false) , deceleration(QML_FLICK_DEFAULTDECELERATION) , maxVelocity(QML_FLICK_DEFAULTMAXVELOCITY), reportedVelocitySmoothing(100) , delayedPressEvent(0), delayedPressTarget(0), pressDelay(0), fixupDuration(400) @@ -777,6 +778,21 @@ void QSGFlickable::setFlickableDirection(FlickableDirection direction) } } +bool QSGFlickable::pixelAligned() const +{ + Q_D(const QSGFlickable); + return d->pixelAligned; +} + +void QSGFlickable::setPixelAligned(bool align) +{ + Q_D(QSGFlickable); + if (align != d->pixelAligned) { + d->pixelAligned = align; + emit pixelAlignedChanged(); + } +} + void QSGFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event) { Q_Q(QSGFlickable); @@ -1097,14 +1113,15 @@ void QSGFlickablePrivate::clearDelayedPress() } } +//XXX pixelAligned ignores the global position of the Flickable, i.e. assumes Flickable itself is pixel aligned. void QSGFlickablePrivate::setViewportX(qreal x) { - contentItem->setX(x); + contentItem->setX(pixelAligned ? qRound(x) : x); } void QSGFlickablePrivate::setViewportY(qreal y) { - contentItem->setY(y); + contentItem->setY(pixelAligned ? qRound(y) : y); } void QSGFlickable::timerEvent(QTimerEvent *event) diff --git a/src/declarative/items/qsgflickable_p.h b/src/declarative/items/qsgflickable_p.h index 7f12e8a..e7d0448 100644 --- a/src/declarative/items/qsgflickable_p.h +++ b/src/declarative/items/qsgflickable_p.h @@ -90,6 +90,8 @@ class Q_AUTOTEST_EXPORT QSGFlickable : public QSGItem Q_PROPERTY(QSGFlickableVisibleArea *visibleArea READ visibleArea CONSTANT) + Q_PROPERTY(bool pixelAligned READ pixelAligned WRITE setPixelAligned NOTIFY pixelAlignedChanged) + Q_PROPERTY(QDeclarativeListProperty flickableData READ flickableData) Q_PROPERTY(QDeclarativeListProperty flickableChildren READ flickableChildren) Q_CLASSINFO("DefaultProperty", "flickableData") @@ -156,6 +158,9 @@ public: FlickableDirection flickableDirection() const; void setFlickableDirection(FlickableDirection); + bool pixelAligned() const; + void setPixelAligned(bool align); + Q_INVOKABLE void resizeContent(qreal w, qreal h, QPointF center); Q_INVOKABLE void returnToBounds(); @@ -188,6 +193,7 @@ Q_SIGNALS: void flickEnded(); void dragStarted(); void dragEnded(); + void pixelAlignedChanged(); protected: virtual bool childMouseEventFilter(QSGItem *, QEvent *); diff --git a/src/declarative/items/qsgflickable_p_p.h b/src/declarative/items/qsgflickable_p_p.h index 9e854af..45a7d77 100644 --- a/src/declarative/items/qsgflickable_p_p.h +++ b/src/declarative/items/qsgflickable_p_p.h @@ -168,6 +168,7 @@ public: bool pressed : 1; bool interactive : 1; bool calcVelocity : 1; + bool pixelAligned : 1; QElapsedTimer lastPosTime; QPointF lastPos; QPointF pressPos; -- 1.7.2.5