diff --git a/lib/kwineffects.cpp b/lib/kwineffects.cpp index 8fb82557e3..140bb67eea 100644 --- a/lib/kwineffects.cpp +++ b/lib/kwineffects.cpp @@ -25,6 +25,7 @@ along with this program. If not, see . #include #include #include +#include #include #include #include @@ -866,6 +867,110 @@ QRect PaintClipper::Iterator::boundingRect() const } +/*************************************************************** + TimeLine +***************************************************************/ + +TimeLine::TimeLine(const int duration) + { + m_Time = 0; + m_CurveShape = TimeLine::EaseInCurve; + m_Duration = duration; + m_TimeLine = new QTimeLine(m_Duration); + m_TimeLine->setFrameRange(0, m_Duration); + m_TimeLine->setCurveShape(QTimeLine::EaseInCurve); + } + +TimeLine::TimeLine(const TimeLine &other) + { + m_Time = other.m_Time; + m_CurveShape = other.m_CurveShape; + m_Duration = other.m_Duration; + m_TimeLine = new QTimeLine(m_Duration); + m_TimeLine->setFrameRange(0, m_Duration); + setProgress(m_Progress); + setCurveShape(m_CurveShape); + } + +TimeLine::~TimeLine() + { + delete m_TimeLine; + } + +int TimeLine::duration() const + { + return m_Duration; + } + +void TimeLine::setDuration(const int msec) + { + m_Duration = msec; + m_TimeLine->setDuration(msec); + } + +double TimeLine::value() const + { + return valueForTime(m_Time); + } + +double TimeLine::valueForTime(const int msec) const + { + // Catch non QTimeLine CurveShapes here, (but there are none right now) + + + // else use QTimeLine ... + return m_TimeLine->valueForTime(msec); + } + +void TimeLine::addTime(const int msec) + { + m_Time = qMin(m_Duration, m_Time + msec); + } + +void TimeLine::removeTime(const int msec) + { + m_Time = qMax(0, m_Time - msec); + } + +void TimeLine::setProgress(const double progress) + { + m_Progress = progress; + m_Time = (int)(m_Duration * progress); + } + +double TimeLine::progress() const + { + return m_Progress; + } + +void TimeLine::addProgress(const double progress) + { + m_Progress += progress; + } + +void TimeLine::setCurveShape(CurveShape curveShape) + { + switch (curveShape) + { + case EaseInCurve: + m_TimeLine->setCurveShape(QTimeLine::EaseInCurve); + break; + case EaseOutCurve: + m_TimeLine->setCurveShape(QTimeLine::EaseOutCurve); + break; + case EaseInOutCurve: + m_TimeLine->setCurveShape(QTimeLine::EaseInOutCurve); + break; + case LinearCurve: + m_TimeLine->setCurveShape(QTimeLine::LinearCurve); + break; + case SineCurve: + m_TimeLine->setCurveShape(QTimeLine::SineCurve); + break; + } + m_CurveShape = curveShape; + } + #ifdef KWIN_HAVE_XRENDER_COMPOSITING // Convert QRegion to XserverRegion. All code uses XserverRegion // only when really necessary as the shared implementation uses diff --git a/lib/kwineffects.h b/lib/kwineffects.h index ce366d5384..0b9e912a6c 100644 --- a/lib/kwineffects.h +++ b/lib/kwineffects.h @@ -33,6 +33,7 @@ along with this program. If not, see . #include #include #include +#include #include #include @@ -981,6 +982,120 @@ class KWIN_EXPORT PaintClipper static QStack< QRegion >* areas; }; + +/** + * @short Wrapper class for using timelines in KWin effects. + * + * This class provides an easy and specialised interface for + * effects that want a non-linear timeline. Currently, most + * it does is wrapping QTimeLine. In the future, this class + * could help using physics animations in KWin. + */ +class KWIN_EXPORT TimeLine + { + + Q_ENUMS( CurveShape ) + + public: + /** + * The CurveShape describes the relationship between time + * and values. We can pass some of them through to QTimeLine + * but also invent our own ones. + */ + enum CurveShape + { + EaseInCurve = 0, + EaseOutCurve, + EaseInOutCurve, + LinearCurve, + SineCurve + }; + + /** + * Creates a TimeLine and computes the progress data. The default + * duration can be overridden from the Effect. Usually, for larger + * animations you want to choose values more towards 300 milliseconds. + * For small animations, values around 150 milliseconds are sensible. + */ + explicit TimeLine(const int duration = 250); + + /** + * Creates a copy of the TimeLine so we can have the state copied + * as well. + */ + TimeLine(const TimeLine &other); + /** + * Cleans up. + */ + ~TimeLine(); + /** + * Returns the duration of the timeline in msec. + */ + int duration() const; + /** + * Set the duration of the TimeLine. + */ + void setDuration(const int msec); + /** + * Returns the Value at the time set, this method will + * usually be used to get the progress in the paintWindow() + * and related methods. + */ + double value() const; + /** + * Returns the Value at the time provided, this method will + * usually be used to get the progress in the paintWindow() + * and related methods, the y value of the current state x. + */ + double valueForTime(const int msec) const; + /** + * Returns the progress of the TimeLine, between 0 and 1, + * it's equivalent to the y-axis on a curve. + */ + double progress() const; + /** + * Increases the internal progress accounting of the timeline. + */ + void addProgress(const double progress); + /** + * Increases the internal counter, this is usually done in + * prePaintWindow(). + */ + void addTime(const int msec); + /** + * Decreases the internal counter, this is usually done in + * prePaintWindow(). This function comes handy for reverse + * animations. + */ + void removeTime(const int msec); + /** + * Set the time to progress * duration. This will change the + * internal time in the TimeLine. It's usually used in + * prePaintWindow() or prePaintScreen() so the value() + * taken in paint* is increased. + */ + void setProgress(const double progress); + /** + * Set the CurveShape. The CurveShape describes the relation + * between the value and the time. progress is between 0 and 1 + * It's used as input for the timeline, the x axis of the curve. + */ + void setCurveShape(CurveShape curveShape); + /** + * Set the CurveShape. The CurveShape describes the relation + * between the value and the time. + */ + //void setCurveShape(CurveShape curveShape); + + private: + QTimeLine* m_TimeLine; + int m_Time; + double m_Progress; + int m_Duration; + CurveShape m_CurveShape; + //Q_DISABLE_COPY(TimeLine) + }; + /** * Pointer to the global EffectsHandler object. **/