Make sure animation drivers knows about the temporal offset after a pause
authorGunnar Sletta <gunnar.sletta@nokia.com>
Thu, 10 May 2012 08:39:42 +0000 (10:39 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 10 May 2012 23:42:02 +0000 (01:42 +0200)
Change-Id: I932e469389241f6a12816b52180936f061cd78f8
Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@nokia.com>
Reviewed-by: J-P Nurmi <j-p.nurmi@nokia.com>
src/corelib/animation/qabstractanimation.cpp
src/corelib/animation/qabstractanimation.h
src/corelib/animation/qabstractanimation_p.h

index 04df52c..969a547 100644 (file)
@@ -317,6 +317,7 @@ void QUnifiedTimer::localRestart()
     } else if (!driver->isRunning()) {
         if (pauseTimer.isActive())
             pauseTimer.stop();
+        driver->setStartTime(time.isValid() ? time.elapsed() : 0);
         driver->start();
     }
 
@@ -339,6 +340,7 @@ void QUnifiedTimer::setTimingInterval(int interval)
     if (driver->isRunning() && !pauseTimer.isActive()) {
         //we changed the timing interval
         driver->stop();
+        driver->setStartTime(time.isValid() ? time.elapsed() : 0);
         driver->start();
     }
 }
@@ -477,6 +479,7 @@ void QUnifiedTimer::installAnimationDriver(QAnimationDriver *d)
 
     if (driver->isRunning()) {
         driver->stop();
+        d->setStartTime(time.isValid() ? time.elapsed() : 0);
         d->start();
     }
 
@@ -495,6 +498,7 @@ void QUnifiedTimer::uninstallAnimationDriver(QAnimationDriver *d)
 
     if (d->isRunning()) {
         d->stop();
+        driver->setStartTime(time.isValid() ? time.elapsed() : 0);
         driver->start();
     }
 }
@@ -732,6 +736,28 @@ QAnimationDriver::~QAnimationDriver()
 }
 
 
+/*!
+    Sets the time at which an animation driver should start at.
+
+    This is to take into account that pauses can occur in running
+    animations which will stop the driver, but the time still
+    increases.
+ */
+void QAnimationDriver::setStartTime(qint64 startTime)
+{
+    Q_D(QAnimationDriver);
+    d->startTime = startTime;
+}
+
+/*!
+    Returns the start time of the animation.
+ */
+qint64 QAnimationDriver::startTime() const
+{
+    Q_D(const QAnimationDriver);
+    return d->startTime;
+}
+
 
 /*!
     Advances the animation based to the specified \a timeStep. This function should
@@ -821,6 +847,8 @@ void QAnimationDriver::stop()
 
 qint64 QAnimationDriver::elapsed() const
 {
+    // The default implementation picks up the elapsed time from the
+    // unified timer and can ignore the time offset.
     return QUnifiedTimer::instance()->time.elapsed();
 }
 
index 34ddbc6..fe0a72f 100644 (file)
@@ -151,6 +151,9 @@ public:
 
     virtual qint64 elapsed() const;
 
+    void setStartTime(qint64 startTime);
+    qint64 startTime() const;
+
 Q_SIGNALS:
     void started();
     void stopped();
index 02a3c02..fcf50a7 100644 (file)
@@ -132,8 +132,9 @@ private:
 class Q_CORE_EXPORT QAnimationDriverPrivate : public QObjectPrivate
 {
 public:
-    QAnimationDriverPrivate() : running(false) {}
+    QAnimationDriverPrivate() : running(false), startTime(0) {}
     bool running;
+    qint64 startTime;
 };
 
 class Q_CORE_EXPORT QAbstractAnimationTimer : public QObject