diff options
author | Konstantin Tokarev <[email protected]> | 2012-05-10 15:14:21 +0400 |
---|---|---|
committer | Eike Ziller <[email protected]> | 2012-05-10 13:24:36 +0200 |
commit | 6bfb167c3b99e24e727c5384e0132b0f27987f00 (patch) | |
tree | 0bae15a5851efe3a18350422b7659c831b09317d /src/plugins/imageviewer/imageview.cpp | |
parent | ce7113619fe148b6e175698ee0d224935711c4c2 (diff) |
Show animated images in ImageView with QMovie.
Change-Id: I108190595deb710a83249bfd017f5393b27850b6
Reviewed-by: Eike Ziller <[email protected]>
Diffstat (limited to 'src/plugins/imageviewer/imageview.cpp')
-rw-r--r-- | src/plugins/imageviewer/imageview.cpp | 96 |
1 files changed, 87 insertions, 9 deletions
diff --git a/src/plugins/imageviewer/imageview.cpp b/src/plugins/imageviewer/imageview.cpp index 61ebbed81ee..50b974d9255 100644 --- a/src/plugins/imageviewer/imageview.cpp +++ b/src/plugins/imageviewer/imageview.cpp @@ -45,6 +45,7 @@ #include <QFile> #include <QWheelEvent> #include <QMouseEvent> +#include <QMovie> #include <QGraphicsRectItem> #include <QPixmap> #ifndef QT_NO_SVG @@ -53,7 +54,6 @@ #include <QImageReader> #include <qmath.h> - namespace ImageViewer { namespace Constants { const qreal DEFAULT_SCALE_FACTOR = 1.2; @@ -61,13 +61,40 @@ namespace Constants { namespace Internal { +class MovieItem : public QGraphicsPixmapItem +{ +public: + MovieItem(QMovie *movie) + : m_movie(movie) + { + setPixmap(m_movie->currentPixmap()); + } + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) + { + painter->setRenderHint(QPainter::SmoothPixmapTransform, true); + painter->drawPixmap(offset(), m_movie->currentPixmap()); + } + +private: + QMovie *m_movie; +}; + struct ImageViewPrivate { - ImageViewPrivate() : imageItem(0), backgroundItem(0), outlineItem(0) {} + ImageViewPrivate() + : imageItem(0) + , backgroundItem(0) + , outlineItem(0) + , movie(0) + , moviePaused(true) + {} + QGraphicsItem *imageItem; QGraphicsRectItem *backgroundItem; QGraphicsRectItem *outlineItem; - QSize naturalSize; + QMovie *movie; + bool moviePaused; }; ImageView::ImageView(QWidget *parent) @@ -121,7 +148,6 @@ bool ImageView::openFile(QString fileName) if (format.startsWith("svg")) isSvg = true; #endif - QGraphicsScene *s = scene(); bool drawBackground = (d->backgroundItem ? d->backgroundItem->isVisible() : false); @@ -129,20 +155,31 @@ bool ImageView::openFile(QString fileName) s->clear(); resetTransform(); + delete d->movie; + d->movie = 0; // image #ifndef QT_NO_SVG if (isSvg) { d->imageItem = new QGraphicsSvgItem(fileName); - d->naturalSize = QSize(); + emit imageSizeChanged(QSize()); } else #endif - { + if (QMovie::supportedFormats().contains(format)) { + d->movie = new QMovie(fileName, QByteArray(), this); + d->movie->setCacheMode(QMovie::CacheAll); + connect(d->movie, SIGNAL(finished()), d->movie, SLOT(start())); + connect(d->movie, SIGNAL(updated(QRect)), this, SLOT(updatePixmap(QRect))); + connect(d->movie, SIGNAL(resized(QSize)), this, SLOT(pixmapResized(QSize))); + d->movie->start(); + d->moviePaused = false; + d->imageItem = new MovieItem(d->movie); + } else { QPixmap pixmap(fileName); QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(pixmap); pixmapItem->setTransformationMode(Qt::SmoothTransformation); d->imageItem = pixmapItem; - d->naturalSize = pixmap.size(); + emit imageSizeChanged(pixmap.size()); } d->imageItem->setCacheMode(QGraphicsItem::NoCache); d->imageItem->setZValue(0); @@ -175,9 +212,23 @@ bool ImageView::openFile(QString fileName) return true; } -QSize ImageView::imageSize() const +bool ImageView::isAnimated() const { - return d->naturalSize; + return d->movie; +} + +bool ImageView::isPaused() const +{ + return d->moviePaused; +} + +void ImageView::setPaused(bool paused) +{ + if (!d->movie) + return; + + d->movie->setPaused(paused); + d->moviePaused = paused; } void ImageView::setViewBackground(bool enable) @@ -211,6 +262,17 @@ void ImageView::doScale(qreal factor) emitScaleFactor(); } +void ImageView::updatePixmap(const QRect &rect) +{ + if (d->imageItem) + d->imageItem->update(rect); +} + +void ImageView::pixmapResized(const QSize &size) +{ + emit imageSizeChanged(size); +} + void ImageView::wheelEvent(QWheelEvent *event) { qreal factor = qPow(Constants::DEFAULT_SCALE_FACTOR, event->delta() / 240.0); @@ -247,5 +309,21 @@ void ImageView::emitScaleFactor() emit scaleFactorChanged(factor); } +void ImageView::showEvent(QShowEvent *) +{ + if (!d->movie) + return; + + d->movie->setPaused(d->moviePaused); +} + +void ImageView::hideEvent(QHideEvent *) +{ + if (!d->movie) + return; + + d->movie->setPaused(true); +} + } // namespace Internal } // namespace ImageView |