{
Q_D(const QQuickAnimatedImage);
if (!d->_movie)
- return false;
+ return d->paused;
return d->_movie->state()==QMovie::Paused;
}
Q_D(QQuickAnimatedImage);
if (pause == d->paused)
return;
- d->paused = pause;
- if (!d->_movie)
- return;
- d->_movie->setPaused(pause);
+ if (!d->_movie) {
+ d->paused = pause;
+ emit pausedChanged();
+ } else {
+ d->_movie->setPaused(pause);
+ }
}
/*!
By default, this property is true, meaning that the animation
will start playing immediately.
+
+ \b Note: this property is affected by changes to the actual playing
+ state of AnimatedImage. If non-animated images are used, \a playing
+ will need to be manually set to \a true in order to animate
+ following images.
+ \qml
+ AnimatedImage {
+ onStatusChanged: playing = (status == AnimatedImage.Ready)
+ }
+ \endqml
*/
bool QQuickAnimatedImage::isPlaying() const
{
Q_D(const QQuickAnimatedImage);
if (!d->_movie)
- return false;
+ return d->playing;
return d->_movie->state()!=QMovie::NotRunning;
}
Q_D(QQuickAnimatedImage);
if (play == d->playing)
return;
- d->playing = play;
- if (!d->_movie)
+ if (!d->_movie) {
+ d->playing = play;
+ emit playingChanged();
return;
+ }
if (play)
d->_movie->start();
else
d->reply = 0;
}
+ d->oldPlaying = isPlaying();
if (d->_movie) {
delete d->_movie;
d->_movie = 0;
d->oldSourceSize = sourceSize();
emit sourceSizeChanged();
}
+ if (isPlaying() != d->oldPlaying)
+ emit playingChanged();
} else {
QString lf = QQmlFile::urlToLocalFileOrQrc(d->url);
if (!lf.isEmpty()) {
d->oldSourceSize = sourceSize();
emit sourceSizeChanged();
}
+ if (isPlaying() != d->oldPlaying)
+ emit playingChanged();
return;
}
d->progress = 1.0;
emit progressChanged(d->progress);
}
- if (d->playing)
- d->_movie->start();
- if (d->paused)
+ bool pausedAtStart = d->paused;
+ if (d->playing) {
+ d->_movie->start();
+ }
+ if (pausedAtStart)
d->_movie->setPaused(true);
if (d->paused || !d->playing) {
d->_movie->jumpToFrame(d->preset_currentframe);
}
d->setImage(d->_movie->currentPixmap().toImage());
+ if (isPlaying() != d->oldPlaying)
+ emit playingChanged();
if (sourceSize() != d->oldSourceSize) {
d->oldSourceSize = sourceSize();
emit sourceSizeChanged();
emit playingChanged();
}
if ((d->_movie->state() == QMovie::Paused) != d->paused) {
- d->playing = (d->_movie->state() == QMovie::Paused);
+ d->paused = (d->_movie->state() == QMovie::Paused);
emit pausedChanged();
}
}
void QQuickAnimatedImage::componentComplete()
{
- Q_D(QQuickAnimatedImage);
QQuickItem::componentComplete(); // NOT QQuickImage
load();
}
void invalidSource();
void qtbug_16520();
void progressAndStatusChanges();
+ void playingAndPausedChanges();
};
void tst_qquickanimatedimage::cleanup()
QQmlComponent component(&engine, testFileUrl("stickmanstopped.qml"));
QQuickAnimatedImage *anim = qobject_cast<QQuickAnimatedImage *>(component.create());
QVERIFY(anim);
- QVERIFY(!anim->isPlaying());
+ QTRY_VERIFY(!anim->isPlaying());
QCOMPARE(anim->currentFrame(), 0);
delete anim;
QQuickAnimatedImage *anim = qobject_cast<QQuickAnimatedImage *>(component.create());
QVERIFY(anim);
- QVERIFY(!anim->isPlaying());
+ QVERIFY(anim->isPlaying());
QVERIFY(!anim->isPaused());
QCOMPARE(anim->currentFrame(), 0);
QCOMPARE(anim->frameCount(), 0);
- QTRY_VERIFY(anim->status() == 3);
+ QTRY_COMPARE(anim->status(), QQuickAnimatedImage::Error);
delete anim;
}
delete obj;
}
+void tst_qquickanimatedimage::playingAndPausedChanges()
+{
+ QQmlEngine engine;
+ QString componentStr = "import QtQuick 2.0\nAnimatedImage { source: srcImage }";
+ QQmlContext *ctxt = engine.rootContext();
+ ctxt->setContextProperty("srcImage", QUrl(""));
+ QQmlComponent component(&engine);
+ component.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
+ QQuickAnimatedImage *obj = qobject_cast<QQuickAnimatedImage*>(component.create());
+ QVERIFY(obj != 0);
+ QVERIFY(obj->status() == QQuickAnimatedImage::Null);
+ QTRY_VERIFY(obj->isPlaying());
+ QTRY_VERIFY(!obj->isPaused());
+ QSignalSpy playingSpy(obj, SIGNAL(playingChanged()));
+ QSignalSpy pausedSpy(obj, SIGNAL(pausedChanged()));
+
+ // initial state
+ obj->setProperty("playing", true);
+ obj->setProperty("paused", false);
+ QTRY_VERIFY(obj->isPlaying());
+ QTRY_VERIFY(!obj->isPaused());
+ QTRY_COMPARE(playingSpy.count(), 0);
+ QTRY_COMPARE(pausedSpy.count(), 0);
+
+ obj->setProperty("playing", false);
+ obj->setProperty("paused", true);
+ QTRY_VERIFY(!obj->isPlaying());
+ QTRY_VERIFY(obj->isPaused());
+ QTRY_COMPARE(playingSpy.count(), 1);
+ QTRY_COMPARE(pausedSpy.count(), 1);
+
+ obj->setProperty("playing", true);
+ obj->setProperty("paused", false);
+ QTRY_VERIFY(obj->isPlaying());
+ QTRY_VERIFY(!obj->isPaused());
+ QTRY_COMPARE(playingSpy.count(), 2);
+ QTRY_COMPARE(pausedSpy.count(), 2);
+
+ ctxt->setContextProperty("srcImage", testFileUrl("stickman.gif"));
+ QTRY_VERIFY(obj->isPlaying());
+ QTRY_VERIFY(!obj->isPaused());
+ QTRY_COMPARE(playingSpy.count(), 2);
+ QTRY_COMPARE(pausedSpy.count(), 2);
+
+ obj->setProperty("paused", true);
+ QTRY_VERIFY(obj->isPlaying());
+ QTRY_VERIFY(obj->isPaused());
+ QTRY_COMPARE(playingSpy.count(), 2);
+ QTRY_COMPARE(pausedSpy.count(), 3);
+
+ obj->setProperty("playing", false);
+ QTRY_VERIFY(!obj->isPlaying());
+ QTRY_VERIFY(!obj->isPaused());
+ QTRY_COMPARE(playingSpy.count(), 3);
+ QTRY_COMPARE(pausedSpy.count(), 4);
+
+ obj->setProperty("playing", true);
+
+ // Cannot animate this image, playing will be false
+ ctxt->setContextProperty("srcImage", testFileUrl("green.png"));
+ QTRY_VERIFY(!obj->isPlaying());
+ QTRY_VERIFY(!obj->isPaused());
+ QTRY_COMPARE(playingSpy.count(), 5);
+ QTRY_COMPARE(pausedSpy.count(), 4);
+
+ delete obj;
+}
QTEST_MAIN(tst_qquickanimatedimage)
#include "tst_qquickanimatedimage.moc"