ginebra2/ScrollHelper.h
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
hgs
parents:
diff changeset
     2
#ifndef SCROLLHELPER_H_
hgs
parents:
diff changeset
     3
#define SCROLLHELPER_H_
hgs
parents:
diff changeset
     4
hgs
parents:
diff changeset
     5
#include <QPropertyAnimation>
hgs
parents:
diff changeset
     6
#include <QRectF>
hgs
parents:
diff changeset
     7
#include <QPoint>
hgs
parents:
diff changeset
     8
#include <QTime>
hgs
parents:
diff changeset
     9
#include <QTimer>
hgs
parents:
diff changeset
    10
#include "uitimer.h"
hgs
parents:
diff changeset
    11
hgs
parents:
diff changeset
    12
namespace GVA {
hgs
parents:
diff changeset
    13
class ScrollHelper: public QObject
hgs
parents:
diff changeset
    14
{
hgs
parents:
diff changeset
    15
    Q_OBJECT
hgs
parents:
diff changeset
    16
    
hgs
parents:
diff changeset
    17
public:
hgs
parents:
diff changeset
    18
    enum ScrollMode {
hgs
parents:
diff changeset
    19
        ReadyMode = 0,
hgs
parents:
diff changeset
    20
        PanScrollMode,
hgs
parents:
diff changeset
    21
        KineticScrollMode
hgs
parents:
diff changeset
    22
    };
hgs
parents:
diff changeset
    23
    
hgs
parents:
diff changeset
    24
    enum ScrollState {
hgs
parents:
diff changeset
    25
        IdleState = 0,   // no scrolling
hgs
parents:
diff changeset
    26
        ActiveState, // scroll poins added
hgs
parents:
diff changeset
    27
        WaitState    // no new scroll points
hgs
parents:
diff changeset
    28
    };
hgs
parents:
diff changeset
    29
    
hgs
parents:
diff changeset
    30
    enum ScrollProperty {
hgs
parents:
diff changeset
    31
        Geometry,
hgs
parents:
diff changeset
    32
        Position,
hgs
parents:
diff changeset
    33
        Velocity
hgs
parents:
diff changeset
    34
    };
hgs
parents:
diff changeset
    35
    
hgs
parents:
diff changeset
    36
    ScrollHelper(QObject* scrolledWidget);
hgs
parents:
diff changeset
    37
    ~ScrollHelper();
hgs
parents:
diff changeset
    38
    void scroll(QPointF& delta);
hgs
parents:
diff changeset
    39
    
hgs
parents:
diff changeset
    40
    bool isScrolling();
hgs
parents:
diff changeset
    41
    void panFromOvershoot();
hgs
parents:
diff changeset
    42
    void setFlickDurationLimits(int minDuration, int midDuration, int maxDuration);
hgs
parents:
diff changeset
    43
    void setFlickSpeedLimits(qreal minSpeed, qreal midSpeed, qreal maxSpeed);
hgs
parents:
diff changeset
    44
    void setDeceleration(qreal decel);
hgs
parents:
diff changeset
    45
    qreal getDeceleration();
hgs
parents:
diff changeset
    46
    void kineticScroll(QPointF& speed);
hgs
parents:
diff changeset
    47
    QSizeF viewportSize();
hgs
parents:
diff changeset
    48
    void setViewportSize(const QSizeF& size);
hgs
parents:
diff changeset
    49
    void setFlickLimits(qreal minFlick, qreal midFlick, qreal maxFlick);
hgs
parents:
diff changeset
    50
    void stopScrollNoSignal();
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
public slots:
hgs
parents:
diff changeset
    53
    void stopScroll();    
hgs
parents:
diff changeset
    54
    void scrollTimerCallback();
hgs
parents:
diff changeset
    55
    void scrollAnimationStateChanged(QAbstractAnimation::State newState,
hgs
parents:
diff changeset
    56
                                     QAbstractAnimation::State);
hgs
parents:
diff changeset
    57
signals:
hgs
parents:
diff changeset
    58
    void scrollFinished();
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
private:
hgs
parents:
diff changeset
    61
    void reset();
hgs
parents:
diff changeset
    62
    void doScroll(QPointF& delta);
hgs
parents:
diff changeset
    63
    QPointF getScrollPos();
hgs
parents:
diff changeset
    64
    QPointF getMaxScrollPos();
hgs
parents:
diff changeset
    65
    void setScrollPos(QPointF& pos);
hgs
parents:
diff changeset
    66
    bool clampScrollPosition(QPointF& scrollPos);
hgs
parents:
diff changeset
    67
    void startScrollAnimation(QPointF& scrollPos, QPointF& targetPos,
hgs
parents:
diff changeset
    68
                              int duration, QEasingCurve::Type& easingCurveType);
hgs
parents:
diff changeset
    69
    int calcScrollDuration(const QPointF& speed, const QPointF& delta);
hgs
parents:
diff changeset
    70
    int calcScrollDuration(qreal motionFactor);
hgs
parents:
diff changeset
    71
    QPointF calcTargetScrollPosAndDuration(const QPointF& speed,
hgs
parents:
diff changeset
    72
                                           const QPointF& scrollPos, int& duration);
hgs
parents:
diff changeset
    73
    qreal calcMotionFactor(const qreal speed);
hgs
parents:
diff changeset
    74
    QPointF calcDeceleration(const QPointF& initSpeed, const QPointF& distance, long time);
hgs
parents:
diff changeset
    75
    QPointF speedForNextInterval(const QPointF& initSpeed, long timeInterval, const QPointF& decel);
hgs
parents:
diff changeset
    76
private:
hgs
parents:
diff changeset
    77
    ScrollMode          m_scrollMode;
hgs
parents:
diff changeset
    78
    ScrollState         m_scrollState;
hgs
parents:
diff changeset
    79
    QPointF             m_scrollDelta;
hgs
parents:
diff changeset
    80
    QPointF             m_curScrollPos;
hgs
parents:
diff changeset
    81
    QPropertyAnimation* m_scrollAnimation;
hgs
parents:
diff changeset
    82
    UiTimer*            m_scrollTimer;
hgs
parents:
diff changeset
    83
    QObject*            m_scrolledWidget;
hgs
parents:
diff changeset
    84
    int                 m_minFlickDuration;
hgs
parents:
diff changeset
    85
    int                 m_maxFlickDuration;
hgs
parents:
diff changeset
    86
    int                 m_midFlickDuration;
hgs
parents:
diff changeset
    87
    qreal               m_minFlickSpeed;
hgs
parents:
diff changeset
    88
    qreal               m_maxFlickSpeed;
hgs
parents:
diff changeset
    89
    qreal               m_midFlickSpeed;
hgs
parents:
diff changeset
    90
    qreal               m_decel;
hgs
parents:
diff changeset
    91
    QPointF             m_decelVec;
hgs
parents:
diff changeset
    92
    QSizeF              m_viewportSize;
hgs
parents:
diff changeset
    93
    qreal               m_maxFlickInViewportUnits;
hgs
parents:
diff changeset
    94
    qreal               m_minFlickInViewportUnits;
hgs
parents:
diff changeset
    95
    qreal               m_midFlickInViewportUnits;
hgs
parents:
diff changeset
    96
    bool                m_lockToY;
hgs
parents:
diff changeset
    97
    bool                m_lockToX;
hgs
parents:
diff changeset
    98
    QPointF             m_targetScrollPos;
hgs
parents:
diff changeset
    99
    QPointF             m_startScrollPos;
hgs
parents:
diff changeset
   100
    QPointF             m_kineticSpeed;
hgs
parents:
diff changeset
   101
    long                m_scrollTotalDuration;
hgs
parents:
diff changeset
   102
    long                m_scrollDuration;
hgs
parents:
diff changeset
   103
    QEasingCurve::Type  m_easingCurveType;
hgs
parents:
diff changeset
   104
    QEasingCurve*       m_easingCurve;
hgs
parents:
diff changeset
   105
    QEasingCurve*       m_easingCurveOvershoot;
hgs
parents:
diff changeset
   106
    QEasingCurve*       m_curEasingCurve;
hgs
parents:
diff changeset
   107
};
hgs
parents:
diff changeset
   108
}
hgs
parents:
diff changeset
   109
#endif /* SCROLLHELPER_H_ */