Fix emitting originYChanged signals even when originY wouldn't change
[profile/ivi/qtdeclarative.git] / src / quick / items / qquickflickable_p_p.h
index 7b16f1a..ab5f03f 100644 (file)
@@ -1,38 +1,38 @@
 /****************************************************************************
 **
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
 **
-** This file is part of the QtDeclarative module of the Qt Toolkit.
+** This file is part of the QtQml module of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
 ** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 **
 ** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
 **
 **
 ** $QT_END_LICENSE$
 #include "qquickitem_p.h"
 #include "qquickitemchangelistener_p.h"
 
-#include <QtDeclarative/qdeclarative.h>
+#include <QtQml/qqml.h>
 #include <QtCore/qdatetime.h>
 #include "qplatformdefs.h"
 
-#include <private/qdeclarativetimeline_p_p.h>
-#include <private/qdeclarativeanimation_p_p.h>
+#include <private/qquicktimeline_p_p.h>
+#include <private/qquickanimation_p_p.h>
+#include <private/qquicktransitionmanager_p_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -70,6 +71,9 @@ QT_BEGIN_NAMESPACE
 const qreal MinimumFlickVelocity = 75.0;
 
 class QQuickFlickableVisibleArea;
+class QQuickTransition;
+class QQuickFlickableReboundTransition;
+
 class Q_AUTOTEST_EXPORT QQuickFlickablePrivate : public QQuickItemPrivate, public QQuickItemChangeListener
 {
     Q_DECLARE_PUBLIC(QQuickFlickable)
@@ -80,13 +84,13 @@ public:
     QQuickFlickablePrivate();
     void init();
 
-    struct Velocity : public QDeclarativeTimeLineValue
+    struct Velocity : public QQuickTimeLineValue
     {
         Velocity(QQuickFlickablePrivate *p)
             : parent(p) {}
         virtual void setValue(qreal v) {
             if (v != value()) {
-                QDeclarativeTimeLineValue::setValue(v);
+                QQuickTimeLineValue::setValue(v);
                 parent->updateVelocity();
             }
         }
@@ -95,14 +99,21 @@ public:
 
     struct AxisData {
         AxisData(QQuickFlickablePrivate *fp, void (QQuickFlickablePrivate::*func)(qreal))
-            : move(fp, func), viewSize(-1), startMargin(0), endMargin(0)
-            , continuousFlickVelocity(0)
+            : move(fp, func)
+            , transitionToBounds(0)
+            , viewSize(-1), startMargin(0), endMargin(0)
+            , origin(0)
+            , transitionTo(0)
+            , continuousFlickVelocity(0), vTime(0)
             , smoothVelocity(fp), atEnd(false), atBeginning(true)
+            , transitionToSet(false)
             , fixingUp(false), inOvershoot(false), moving(false), flicking(false)
             , dragging(false), extentsChanged(false)
             , explicitValue(false), minExtentDirty(true), maxExtentDirty(true)
         {}
 
+        ~AxisData();
+
         void reset() {
             velocityBuffer.clear();
             dragStartOffset = 0;
@@ -116,12 +127,19 @@ public:
             extentsChanged = true;
         }
 
+        void resetTransitionTo() {
+            transitionTo = 0;
+            transitionToSet = false;
+        }
+
         void addVelocitySample(qreal v, qreal maxVelocity);
         void updateVelocity();
 
-        QDeclarativeTimeLineValueProxy<QQuickFlickablePrivate> move;
+        QQuickTimeLineValueProxy<QQuickFlickablePrivate> move;
+        QQuickFlickableReboundTransition *transitionToBounds;
         qreal viewSize;
         qreal pressPos;
+        qreal lastPos;
         qreal dragStartOffset;
         qreal dragMinBound;
         qreal dragMaxBound;
@@ -129,11 +147,16 @@ public:
         qreal flickTarget;
         qreal startMargin;
         qreal endMargin;
+        qreal origin;
+        qreal transitionTo;
         qreal continuousFlickVelocity;
+        QElapsedTimer velocityTime;
+        int vTime;
         QQuickFlickablePrivate::Velocity smoothVelocity;
         QPODVector<qreal,10> velocityBuffer;
         bool atEnd : 1;
         bool atBeginning : 1;
+        bool transitionToSet : 1;
         bool fixingUp : 1;
         bool inOvershoot : 1;
         bool moving : 1;
@@ -145,14 +168,18 @@ public:
         mutable bool maxExtentDirty : 1;
     };
 
-    void flickX(qreal velocity);
-    void flickY(qreal velocity);
-    virtual void flick(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
-                        QDeclarativeTimeLineCallback::Callback fixupCallback, qreal velocity);
+    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();
     virtual void fixup(AxisData &data, qreal minExtent, qreal maxExtent);
+    void adjustContentPos(AxisData &data, qreal toPos);
+    void resetTimeline(AxisData &data);
+    void clearTimeline();
 
     void updateBeginningEnd();
 
@@ -170,13 +197,15 @@ public:
     void draggingStarting();
     void draggingEnding();
 
+    bool isViewMoving() const;
+
 public:
     QQuickItem *contentItem;
 
     AxisData hData;
     AxisData vData;
 
-    QDeclarativeTimeLine timeline;
+    QQuickTimeLine timeline;
     bool hMoved : 1;
     bool vMoved : 1;
     bool stealMouse : 1;
@@ -191,8 +220,6 @@ public:
     QPointF pressPos;
     qreal deceleration;
     qreal maxVelocity;
-    QElapsedTimer velocityTime;
-    QPointF lastFlickablePosition;
     qreal reportedVelocitySmoothing;
     QMouseEvent *delayedPressEvent;
     QQuickItem *delayedPressTarget;
@@ -209,10 +236,14 @@ public:
 
     void updateVelocity();
     int vTime;
-    QDeclarativeTimeLine velocityTimeline;
+    QQuickTimeLine velocityTimeline;
     QQuickFlickableVisibleArea *visibleArea;
     QQuickFlickable::FlickableDirection flickableDirection;
     QQuickFlickable::BoundsBehavior boundsBehavior;
+    QQuickTransition *rebound;
+
+    void viewportAxisMoved(AxisData &data, qreal minExtent, qreal maxExtent, qreal vSize,
+                       QQuickTimeLineCallback::Callback fixupCallback);
 
     void handleMousePressEvent(QMouseEvent *);
     void handleMouseMoveEvent(QMouseEvent *);
@@ -221,10 +252,10 @@ public:
     qint64 computeCurrentTime(QInputEvent *event);
 
     // flickableData property
-    static void data_append(QDeclarativeListProperty<QObject> *, QObject *);
-    static int data_count(QDeclarativeListProperty<QObject> *);
-    static QObject *data_at(QDeclarativeListProperty<QObject> *, int);
-    static void data_clear(QDeclarativeListProperty<QObject> *);
+    static void data_append(QQmlListProperty<QObject> *, QObject *);
+    static int data_count(QQmlListProperty<QObject> *);
+    static QObject *data_at(QQmlListProperty<QObject> *, int);
+    static void data_clear(QQmlListProperty<QObject> *);
 };
 
 class QQuickFlickableVisibleArea : public QObject