aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/imageviewer/imageview.cpp
diff options
context:
space:
mode:
authorKonstantin Tokarev <[email protected]>2012-05-10 15:14:21 +0400
committerEike Ziller <[email protected]>2012-05-10 13:24:36 +0200
commit6bfb167c3b99e24e727c5384e0132b0f27987f00 (patch)
tree0bae15a5851efe3a18350422b7659c831b09317d /src/plugins/imageviewer/imageview.cpp
parentce7113619fe148b6e175698ee0d224935711c4c2 (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.cpp96
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