aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickanimatedimage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/items/qquickanimatedimage.cpp')
-rw-r--r--src/quick/items/qquickanimatedimage.cpp169
1 files changed, 91 insertions, 78 deletions
diff --git a/src/quick/items/qquickanimatedimage.cpp b/src/quick/items/qquickanimatedimage.cpp
index b4c1bd435a..72b24a7fac 100644
--- a/src/quick/items/qquickanimatedimage.cpp
+++ b/src/quick/items/qquickanimatedimage.cpp
@@ -131,6 +131,8 @@ QQuickAnimatedImage::QQuickAnimatedImage(QQuickItem *parent)
QQuickAnimatedImage::~QQuickAnimatedImage()
{
Q_D(QQuickAnimatedImage);
+ if (d->reply)
+ d->reply->deleteLater();
delete d->_movie;
}
@@ -233,14 +235,16 @@ void QQuickAnimatedImage::setSource(const QUrl &url)
if (url == d->url)
return;
- delete d->_movie;
- d->_movie = 0;
-
if (d->reply) {
d->reply->deleteLater();
d->reply = 0;
}
+ if (d->_movie) {
+ delete d->_movie;
+ d->_movie = 0;
+ }
+
d->url = url;
emit sourceChanged(d->url);
@@ -252,64 +256,43 @@ void QQuickAnimatedImage::load()
{
Q_D(QQuickAnimatedImage);
- QQuickImageBase::Status oldStatus = d->status;
- qreal oldProgress = d->progress;
-
if (d->url.isEmpty()) {
- delete d->_movie;
+ if (d->progress != 0) {
+ d->progress = 0;
+ emit progressChanged(d->progress);
+ }
+
d->setImage(QImage());
- d->progress = 0;
d->status = Null;
- if (d->status != oldStatus)
- emit statusChanged(d->status);
- if (d->progress != oldProgress)
- emit progressChanged(d->progress);
+ emit statusChanged(d->status);
+
+ if (sourceSize() != d->oldSourceSize) {
+ d->oldSourceSize = sourceSize();
+ emit sourceSizeChanged();
+ }
} else {
QString lf = QQmlFile::urlToLocalFileOrQrc(d->url);
if (!lf.isEmpty()) {
- //### should be unified with movieRequestFinished
d->_movie = new QMovie(lf);
- if (!d->_movie->isValid()){
- qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString();
- delete d->_movie;
- d->_movie = 0;
- d->status = Error;
- if (d->status != oldStatus)
- emit statusChanged(d->status);
- return;
- }
- connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
- this, SLOT(playingStatusChanged()));
- connect(d->_movie, SIGNAL(frameChanged(int)),
- this, SLOT(movieUpdate()));
- d->_movie->setCacheMode(QMovie::CacheAll);
- if (d->playing)
- d->_movie->start();
- else
- d->_movie->jumpToFrame(0);
- if (d->paused)
- d->_movie->setPaused(true);
- d->setImage(d->_movie->currentPixmap().toImage());
- d->status = Ready;
- d->progress = 1.0;
- if (d->status != oldStatus)
+ movieRequestFinished();
+ } else {
+ if (d->status != Loading) {
+ d->status = Loading;
emit statusChanged(d->status);
- if (d->progress != oldProgress)
+ }
+ if (d->progress != 0) {
+ d->progress = 0;
emit progressChanged(d->progress);
- return;
+ }
+ QNetworkRequest req(d->url);
+ req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
+
+ d->reply = qmlEngine(this)->networkAccessManager()->get(req);
+ QObject::connect(d->reply, SIGNAL(finished()),
+ this, SLOT(movieRequestFinished()));
+ QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
+ this, SLOT(requestProgress(qint64,qint64)));
}
-
- d->status = Loading;
- d->progress = 0;
- emit statusChanged(d->status);
- emit progressChanged(d->progress);
- QNetworkRequest req(d->url);
- req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
- d->reply = qmlEngine(this)->networkAccessManager()->get(req);
- QObject::connect(d->reply, SIGNAL(finished()),
- this, SLOT(movieRequestFinished()));
- QObject::connect(d->reply, SIGNAL(downloadProgress(qint64,qint64)),
- this, SLOT(requestProgress(qint64,qint64)));
}
}
@@ -319,58 +302,85 @@ void QQuickAnimatedImage::movieRequestFinished()
{
Q_D(QQuickAnimatedImage);
- d->redirectCount++;
- if (d->redirectCount < ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION) {
- QVariant redirect = d->reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
- if (redirect.isValid()) {
- QUrl url = d->reply->url().resolved(redirect.toUrl());
- d->reply->deleteLater();
- d->reply = 0;
- setSource(url);
- return;
+ if (d->reply) {
+ d->redirectCount++;
+ if (d->redirectCount < ANIMATEDIMAGE_MAXIMUM_REDIRECT_RECURSION) {
+ QVariant redirect = d->reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+ if (redirect.isValid()) {
+ QUrl url = d->reply->url().resolved(redirect.toUrl());
+ d->reply->deleteLater();
+ setSource(url);
+ return;
+ }
}
+
+ d->redirectCount=0;
+ d->_movie = new QMovie(d->reply);
}
- d->redirectCount=0;
- d->_movie = new QMovie(d->reply);
- if (!d->_movie->isValid()){
-#ifndef QT_NO_DEBUG_STREAM
- qmlInfo(this) << "Error Reading Animated Image File " << d->url;
-#endif
+ if (!d->_movie->isValid()) {
+ qmlInfo(this) << "Error Reading Animated Image File " << d->url.toString();
delete d->_movie;
d->_movie = 0;
+ d->setImage(QImage());
+ if (d->progress != 0) {
+ d->progress = 0;
+ emit progressChanged(d->progress);
+ }
d->status = Error;
emit statusChanged(d->status);
+
+ if (sourceSize() != d->oldSourceSize) {
+ d->oldSourceSize = sourceSize();
+ emit sourceSizeChanged();
+ }
return;
}
+
connect(d->_movie, SIGNAL(stateChanged(QMovie::MovieState)),
this, SLOT(playingStatusChanged()));
connect(d->_movie, SIGNAL(frameChanged(int)),
this, SLOT(movieUpdate()));
d->_movie->setCacheMode(QMovie::CacheAll);
+
+ d->status = Ready;
+ emit statusChanged(d->status);
+
+ if (d->progress != 1.0) {
+ d->progress = 1.0;
+ emit progressChanged(d->progress);
+ }
if (d->playing)
d->_movie->start();
+
+ if (d->paused)
+ d->_movie->setPaused(true);
if (d->paused || !d->playing) {
d->_movie->jumpToFrame(d->preset_currentframe);
d->preset_currentframe = 0;
}
- if (d->paused)
- d->_movie->setPaused(true);
d->setImage(d->_movie->currentPixmap().toImage());
- d->status = Ready;
- emit statusChanged(d->status);
+
+ if (sourceSize() != d->oldSourceSize) {
+ d->oldSourceSize = sourceSize();
+ emit sourceSizeChanged();
+ }
}
void QQuickAnimatedImage::movieUpdate()
{
Q_D(QQuickAnimatedImage);
- d->setImage(d->_movie->currentPixmap().toImage());
- emit frameChanged();
+
+ if (d->_movie) {
+ d->setImage(d->_movie->currentPixmap().toImage());
+ emit frameChanged();
+ }
}
void QQuickAnimatedImage::playingStatusChanged()
{
Q_D(QQuickAnimatedImage);
+
if ((d->_movie->state() != QMovie::NotRunning) != d->playing) {
d->playing = (d->_movie->state() != QMovie::NotRunning);
emit playingChanged();
@@ -381,16 +391,19 @@ void QQuickAnimatedImage::playingStatusChanged()
}
}
+QSize QQuickAnimatedImage::sourceSize()
+{
+ Q_D(QQuickAnimatedImage);
+ if (!d->_movie)
+ return QSize(0, 0);
+ return QSize(d->_movie->currentPixmap().size());
+}
+
void QQuickAnimatedImage::componentComplete()
{
Q_D(QQuickAnimatedImage);
QQuickItem::componentComplete(); // NOT QQuickImage
- if (d->url.isValid())
- load();
- if (!d->reply) {
- setCurrentFrame(d->preset_currentframe);
- d->preset_currentframe = 0;
- }
+ load();
}
QT_END_NAMESPACE