summaryrefslogtreecommitdiffstats
path: root/src/declarative/extra/qmlgraphicsanimatedimageitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/extra/qmlgraphicsanimatedimageitem.cpp')
-rw-r--r--src/declarative/extra/qmlgraphicsanimatedimageitem.cpp256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/declarative/extra/qmlgraphicsanimatedimageitem.cpp b/src/declarative/extra/qmlgraphicsanimatedimageitem.cpp
new file mode 100644
index 0000000..c22e56d
--- /dev/null
+++ b/src/declarative/extra/qmlgraphicsanimatedimageitem.cpp
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QMovie>
+#include <QtDeclarative/qmlcontext.h>
+#include <QtDeclarative/qmlengine.h>
+#include "qmlgraphicsanimatedimageitem.h"
+#include "qmlgraphicsanimatedimageitem_p.h"
+#include <QNetworkRequest>
+#include <QNetworkReply>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QmlGraphicsAnimatedImageItem
+ \internal
+*/
+
+/*!
+ \qmlclass AnimatedImage
+ \inherits Image
+
+ This item provides for playing animations stored as images containing a series of frames,
+ such as GIF files. The full list of supported formats can be determined with
+ QMovie::supportedFormats().
+
+ \table
+ \row
+ \o \image animatedimageitem.gif
+ \o
+ \qml
+Item {
+ width: anim.width; height: anim.height+8
+ AnimatedImage { id: anim; source: "pics/games-anim.gif" }
+ Rectangle { color: "red"; width: 4; height: 8; y: anim.height
+ x: (anim.width-width)*anim.currentFrame/(anim.frameCount-1)
+ }
+}
+ \endqml
+ \endtable
+*/
+QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,AnimatedImage,QmlGraphicsAnimatedImageItem)
+
+QmlGraphicsAnimatedImageItem::QmlGraphicsAnimatedImageItem(QmlGraphicsItem *parent)
+ : QmlGraphicsImage(*(new QmlGraphicsAnimatedImageItemPrivate), parent)
+{
+}
+
+QmlGraphicsAnimatedImageItem::QmlGraphicsAnimatedImageItem(QmlGraphicsAnimatedImageItemPrivate &dd, QmlGraphicsItem *parent)
+ : QmlGraphicsImage(dd, parent)
+{
+}
+
+QmlGraphicsAnimatedImageItem::~QmlGraphicsAnimatedImageItem()
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ delete d->_movie;
+}
+
+/*!
+ \qmlproperty bool AnimatedImage::paused
+ This property holds whether the animated image is paused or not
+
+ Defaults to false, and can be set to true when you want to pause.
+*/
+bool QmlGraphicsAnimatedImageItem::isPaused() const
+{
+ Q_D(const QmlGraphicsAnimatedImageItem);
+ if(!d->_movie)
+ return false;
+ return d->_movie->state()==QMovie::Paused;
+}
+
+void QmlGraphicsAnimatedImageItem::setPaused(bool pause)
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ if(pause == d->paused)
+ return;
+ d->paused = pause;
+ if(!d->_movie)
+ return;
+ d->_movie->setPaused(pause);
+}
+/*!
+ \qmlproperty bool AnimatedImage::playing
+ This property holds whether the animated image is playing or not
+
+ Defaults to true, so as to start playing immediately.
+*/
+bool QmlGraphicsAnimatedImageItem::isPlaying() const
+{
+ Q_D(const QmlGraphicsAnimatedImageItem);
+ if (!d->_movie)
+ return false;
+ return d->_movie->state()!=QMovie::NotRunning;
+}
+
+void QmlGraphicsAnimatedImageItem::setPlaying(bool play)
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ if(play == d->playing)
+ return;
+ d->playing = play;
+ if (!d->_movie)
+ return;
+ if (play)
+ d->_movie->start();
+ else
+ d->_movie->stop();
+}
+
+/*!
+ \qmlproperty int AnimatedImage::currentFrame
+ \qmlproperty int AnimatedImage::frameCount
+
+ currentFrame is the frame that is currently visible. Watching when this changes can
+ allow other things to animate at the same time as the image. frameCount is the number
+ of frames in the animation. For some animation formats, frameCount is unknown and set to zero.
+*/
+int QmlGraphicsAnimatedImageItem::currentFrame() const
+{
+ Q_D(const QmlGraphicsAnimatedImageItem);
+ if (!d->_movie)
+ return -1;
+ return d->_movie->currentFrameNumber();
+}
+
+void QmlGraphicsAnimatedImageItem::setCurrentFrame(int frame)
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ if (!d->_movie)
+ return;
+ d->_movie->jumpToFrame(frame);
+}
+
+int QmlGraphicsAnimatedImageItem::frameCount() const
+{
+ Q_D(const QmlGraphicsAnimatedImageItem);
+ if (!d->_movie)
+ return 0;
+ return d->_movie->frameCount();
+}
+
+void QmlGraphicsAnimatedImageItem::setSource(const QUrl &url)
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ if (url == d->url)
+ return;
+
+ delete d->_movie;
+ d->_movie = 0;
+
+ if (d->reply) {
+ d->reply->deleteLater();
+ d->reply = 0;
+ }
+
+ d->url = qmlContext(this)->resolvedUrl(url);
+
+ if (url.isEmpty()) {
+ delete d->_movie;
+ d->status = Null;
+ } else {
+ d->status = Loading;
+ QNetworkRequest req(d->url);
+ d->reply = qmlContext(this)->engine()->networkAccessManager()->get(req);
+ QObject::connect(d->reply, SIGNAL(finished()),
+ this, SLOT(movieRequestFinished()));
+ }
+
+ emit statusChanged(d->status);
+}
+
+void QmlGraphicsAnimatedImageItem::movieRequestFinished()
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ d->_movie = new QMovie(d->reply);
+ if (!d->_movie->isValid()){
+ qWarning() << "Error Reading Animated Image File " << d->url;
+ delete d->_movie;
+ d->_movie = 0;
+ 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);
+ setPixmap(d->_movie->currentPixmap());
+}
+
+void QmlGraphicsAnimatedImageItem::movieUpdate()
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ setPixmap(d->_movie->currentPixmap());
+ emit frameChanged();
+}
+
+void QmlGraphicsAnimatedImageItem::playingStatusChanged()
+{
+ Q_D(QmlGraphicsAnimatedImageItem);
+ if((d->_movie->state() != QMovie::NotRunning) != d->playing){
+ d->playing = (d->_movie->state() != QMovie::NotRunning);
+ emit playingChanged();
+ }
+ if((d->_movie->state() == QMovie::Paused) != d->paused){
+ d->playing = (d->_movie->state() == QMovie::Paused);
+ emit pausedChanged();
+ }
+}
+
+QT_END_NAMESPACE