From 6bfb167c3b99e24e727c5384e0132b0f27987f00 Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev Date: Thu, 10 May 2012 15:14:21 +0400 Subject: [PATCH] Show animated images in ImageView with QMovie. Change-Id: I108190595deb710a83249bfd017f5393b27850b6 Reviewed-by: Eike Ziller --- .../imageviewer/images/pause-small.png | Bin 0 -> 3097 bytes src/plugins/imageviewer/images/play-small.png | Bin 0 -> 3363 bytes src/plugins/imageviewer/imageview.cpp | 96 ++++++++++++++++-- src/plugins/imageviewer/imageview.h | 10 +- src/plugins/imageviewer/imageviewer.cpp | 42 +++++++- src/plugins/imageviewer/imageviewer.h | 6 ++ src/plugins/imageviewer/imageviewer.qrc | 2 + src/plugins/imageviewer/imageviewertoolbar.ui | 8 ++ 8 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 src/plugins/imageviewer/images/pause-small.png create mode 100644 src/plugins/imageviewer/images/play-small.png diff --git a/src/plugins/imageviewer/images/pause-small.png b/src/plugins/imageviewer/images/pause-small.png new file mode 100644 index 0000000000000000000000000000000000000000..114d89b12bdca29a40dd90d6004b53d00d323257 GIT binary patch literal 3097 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 literal 0 HcmV?d00001 diff --git a/src/plugins/imageviewer/images/play-small.png b/src/plugins/imageviewer/images/play-small.png new file mode 100644 index 0000000000000000000000000000000000000000..011598a746fda2fb68de10ee4233429e474b7908 GIT binary patch literal 3363 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 #include #include +#include #include #include #ifndef QT_NO_SVG @@ -53,7 +54,6 @@ #include #include - 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 diff --git a/src/plugins/imageviewer/imageview.h b/src/plugins/imageviewer/imageview.h index a15aa356699..b6ba61ff9ce 100644 --- a/src/plugins/imageviewer/imageview.h +++ b/src/plugins/imageviewer/imageview.h @@ -44,7 +44,6 @@ #define IMAGEVIEW_H #include -#include namespace ImageViewer { namespace Internal { @@ -58,10 +57,13 @@ public: ~ImageView(); bool openFile(QString fileName); - QSize imageSize() const; + bool isAnimated() const; + bool isPaused() const; + void setPaused(bool paused); signals: void scaleFactorChanged(qreal factor); + void imageSizeChanged(const QSize &size); public slots: void setViewBackground(bool enable); @@ -74,9 +76,13 @@ public slots: private slots: void emitScaleFactor(); void doScale(qreal factor); + void updatePixmap(const QRect &rect); + void pixmapResized(const QSize &size); protected: void drawBackground(QPainter *p, const QRectF &rect); + void hideEvent(QHideEvent *event); + void showEvent(QShowEvent *event); void wheelEvent(QWheelEvent *event); private: diff --git a/src/plugins/imageviewer/imageviewer.cpp b/src/plugins/imageviewer/imageviewer.cpp index 53f728ce6d5..48d61dafc65 100644 --- a/src/plugins/imageviewer/imageviewer.cpp +++ b/src/plugins/imageviewer/imageviewer.cpp @@ -101,6 +101,10 @@ ImageViewer::ImageViewer(QWidget *parent) d->imageView, SLOT(setViewBackground(bool))); connect(d->ui_toolbar.toolButtonOutline, SIGNAL(toggled(bool)), d->imageView, SLOT(setViewOutline(bool))); + connect(d->ui_toolbar.toolButtonPlayPause, SIGNAL(clicked()), + this, SLOT(playToggled())); + connect(d->imageView, SIGNAL(imageSizeChanged(QSize)), + this, SLOT(imageSizeUpdated(QSize))); connect(d->imageView, SIGNAL(scaleFactorChanged(qreal)), this, SLOT(scaleFactorUpdate(qreal))); } @@ -126,11 +130,8 @@ bool ImageViewer::open(QString *errorString, const QString &fileName, const QStr } setDisplayName(QFileInfo(fileName).fileName()); d->file->setFileName(fileName); - const QSize imageSize = d->imageView->imageSize(); - QString imageSizeText; - if (imageSize.isValid()) - imageSizeText = QString::fromLatin1("%1x%2").arg(imageSize.width()).arg(imageSize.height()); - d->ui_toolbar.labelImageSize->setText(imageSizeText); + d->ui_toolbar.toolButtonPlayPause->setVisible(d->imageView->isAnimated()); + setPaused(!d->imageView->isAnimated()); // d_ptr->file->setMimeType emit changed(); return true; @@ -199,6 +200,14 @@ QWidget *ImageViewer::toolBar() return d->toolbar; } +void ImageViewer::imageSizeUpdated(const QSize &size) +{ + QString imageSizeText; + if (size.isValid()) + imageSizeText = QString::fromLatin1("%1x%2").arg(size.width()).arg(size.height()); + d->ui_toolbar.labelImageSize->setText(imageSizeText); +} + void ImageViewer::scaleFactorUpdate(qreal factor) { const QString info = QString::number(factor * 100, 'f', 2) + QLatin1Char('%'); @@ -248,5 +257,28 @@ void ImageViewer::fitToScreen() d->ui_toolbar.toolButtonFitToScreen->click(); } +void ImageViewer::togglePlay() +{ + d->ui_toolbar.toolButtonPlayPause->click(); +} + +void ImageViewer::playToggled() +{ + bool paused = d->imageView->isPaused(); + setPaused(!paused); +} + +void ImageViewer::setPaused(bool paused) +{ + d->imageView->setPaused(paused); + if (paused) { + d->ui_toolbar.toolButtonPlayPause->setToolTip(tr("Play Animation")); + d->ui_toolbar.toolButtonPlayPause->setIcon(QPixmap(QLatin1String(":/imageviewer/images/play-small.png"))); + } else { + d->ui_toolbar.toolButtonPlayPause->setToolTip(tr("Pause Animation")); + d->ui_toolbar.toolButtonPlayPause->setIcon(QPixmap(QLatin1String(":/imageviewer/images/pause-small.png"))); + } +} + } // namespace Internal } // namespace ImageViewer diff --git a/src/plugins/imageviewer/imageviewer.h b/src/plugins/imageviewer/imageviewer.h index ef9a23eda1c..e6cb3e43714 100644 --- a/src/plugins/imageviewer/imageviewer.h +++ b/src/plugins/imageviewer/imageviewer.h @@ -78,6 +78,7 @@ public: QWidget *toolBar(); public slots: + void imageSizeUpdated(const QSize &size); void scaleFactorUpdate(qreal factor); void switchViewBackground(); @@ -86,6 +87,10 @@ public slots: void zoomOut(); void resetToOriginalSize(); void fitToScreen(); + void togglePlay(); + +private slots: + void playToggled(); private: /*! @@ -95,6 +100,7 @@ private: \return true if icon is updated, false otherwise */ bool updateButtonIconByTheme(QAbstractButton *button, const QString &name); + void setPaused(bool paused); private: struct ImageViewerPrivate *d; diff --git a/src/plugins/imageviewer/imageviewer.qrc b/src/plugins/imageviewer/imageviewer.qrc index 396279668d8..d48561a89ef 100644 --- a/src/plugins/imageviewer/imageviewer.qrc +++ b/src/plugins/imageviewer/imageviewer.qrc @@ -7,5 +7,7 @@ images/fitinscreen.png images/originalsize.png images/background.png + images/pause-small.png + images/play-small.png diff --git a/src/plugins/imageviewer/imageviewertoolbar.ui b/src/plugins/imageviewer/imageviewertoolbar.ui index 9f6eeb25204..6b78452fae6 100644 --- a/src/plugins/imageviewer/imageviewertoolbar.ui +++ b/src/plugins/imageviewer/imageviewertoolbar.ui @@ -104,6 +104,13 @@ + + + + Pause Animation + + + @@ -144,6 +151,7 @@ +