Experimental 'pixelAligned' property for Flickable.
authorMartin Jones <martin.jones@nokia.com>
Fri, 9 Sep 2011 06:48:03 +0000 (16:48 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 12 Sep 2011 02:04:42 +0000 (04:04 +0200)
Change-Id: I671af87c4d2db3403ab506ae32608c91d6982338
Reviewed-on: http://codereview.qt-project.org/4506
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Alan Alpert <alan.alpert@nokia.com>
src/declarative/items/qsgflickable.cpp
src/declarative/items/qsgflickable_p.h
src/declarative/items/qsgflickable_p_p.h

index d62197f..962eb96 100644 (file)
@@ -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)
index 7f12e8a..e7d0448 100644 (file)
@@ -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<QObject> flickableData READ flickableData)
     Q_PROPERTY(QDeclarativeListProperty<QSGItem> 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 *);
index 9e854af..45a7d77 100644 (file)
@@ -168,6 +168,7 @@ public:
     bool pressed : 1;
     bool interactive : 1;
     bool calcVelocity : 1;
+    bool pixelAligned : 1;
     QElapsedTimer lastPosTime;
     QPointF lastPos;
     QPointF pressPos;