diff -r 6aeb7a756187 -r 3c88a81ff781 ginebra2/ScrollHelper.h --- /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 +#include +#include +#include +#include +#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_ */