ginebra2/ScrollHelper.h
changeset 16 3c88a81ff781
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ginebra2/ScrollHelper.h	Fri Oct 15 17:30:59 2010 -0400
@@ -0,0 +1,109 @@
+
+#ifndef SCROLLHELPER_H_
+#define SCROLLHELPER_H_
+
+#include <QPropertyAnimation>
+#include <QRectF>
+#include <QPoint>
+#include <QTime>
+#include <QTimer>
+#include "uitimer.h"
+
+namespace GVA {
+class ScrollHelper: public QObject
+{
+    Q_OBJECT
+    
+public:
+    enum ScrollMode {
+        ReadyMode = 0,
+        PanScrollMode,
+        KineticScrollMode
+    };
+    
+    enum ScrollState {
+        IdleState = 0,   // no scrolling
+        ActiveState, // scroll poins added
+        WaitState    // no new scroll points
+    };
+    
+    enum ScrollProperty {
+        Geometry,
+        Position,
+        Velocity
+    };
+    
+    ScrollHelper(QObject* scrolledWidget);
+    ~ScrollHelper();
+    void scroll(QPointF& delta);
+    
+    bool isScrolling();
+    void panFromOvershoot();
+    void setFlickDurationLimits(int minDuration, int midDuration, int maxDuration);
+    void setFlickSpeedLimits(qreal minSpeed, qreal midSpeed, qreal maxSpeed);
+    void setDeceleration(qreal decel);
+    qreal getDeceleration();
+    void kineticScroll(QPointF& speed);
+    QSizeF viewportSize();
+    void setViewportSize(const QSizeF& size);
+    void setFlickLimits(qreal minFlick, qreal midFlick, qreal maxFlick);
+    void stopScrollNoSignal();
+
+public slots:
+    void stopScroll();    
+    void scrollTimerCallback();
+    void scrollAnimationStateChanged(QAbstractAnimation::State newState,
+                                     QAbstractAnimation::State);
+signals:
+    void scrollFinished();
+
+private:
+    void reset();
+    void doScroll(QPointF& delta);
+    QPointF getScrollPos();
+    QPointF getMaxScrollPos();
+    void setScrollPos(QPointF& pos);
+    bool clampScrollPosition(QPointF& scrollPos);
+    void startScrollAnimation(QPointF& scrollPos, QPointF& targetPos,
+                              int duration, QEasingCurve::Type& easingCurveType);
+    int calcScrollDuration(const QPointF& speed, const QPointF& delta);
+    int calcScrollDuration(qreal motionFactor);
+    QPointF calcTargetScrollPosAndDuration(const QPointF& speed,
+                                           const QPointF& scrollPos, int& duration);
+    qreal calcMotionFactor(const qreal speed);
+    QPointF calcDeceleration(const QPointF& initSpeed, const QPointF& distance, long time);
+    QPointF speedForNextInterval(const QPointF& initSpeed, long timeInterval, const QPointF& decel);
+private:
+    ScrollMode          m_scrollMode;
+    ScrollState         m_scrollState;
+    QPointF             m_scrollDelta;
+    QPointF             m_curScrollPos;
+    QPropertyAnimation* m_scrollAnimation;
+    UiTimer*            m_scrollTimer;
+    QObject*            m_scrolledWidget;
+    int                 m_minFlickDuration;
+    int                 m_maxFlickDuration;
+    int                 m_midFlickDuration;
+    qreal               m_minFlickSpeed;
+    qreal               m_maxFlickSpeed;
+    qreal               m_midFlickSpeed;
+    qreal               m_decel;
+    QPointF             m_decelVec;
+    QSizeF              m_viewportSize;
+    qreal               m_maxFlickInViewportUnits;
+    qreal               m_minFlickInViewportUnits;
+    qreal               m_midFlickInViewportUnits;
+    bool                m_lockToY;
+    bool                m_lockToX;
+    QPointF             m_targetScrollPos;
+    QPointF             m_startScrollPos;
+    QPointF             m_kineticSpeed;
+    long                m_scrollTotalDuration;
+    long                m_scrollDuration;
+    QEasingCurve::Type  m_easingCurveType;
+    QEasingCurve*       m_easingCurve;
+    QEasingCurve*       m_easingCurveOvershoot;
+    QEasingCurve*       m_curEasingCurve;
+};
+}
+#endif /* SCROLLHELPER_H_ */