]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/information/pixmapviewer.cpp
panels/information: Fix preview size for animated images
[dolphin.git] / src / panels / information / pixmapviewer.cpp
index 7eca876c8b2cdcb9b510387bfad2e7150d095ca8..b18c9e64ef4c0522ccd062274c431ef97aacce9c 100644 (file)
@@ -43,11 +43,6 @@ void PixmapViewer::setPixmap(const QPixmap &pixmap)
         return;
     }
 
-    // Avoid flicker with static pixmap if an animated image is running
-    if (m_animatedImage && m_animatedImage->state() == QMovie::Running) {
-        return;
-    }
-
     if ((m_transition != NoTransition) && (m_animation.state() == QTimeLine::Running)) {
         m_pendingPixmaps.enqueue(pixmap);
         if (m_pendingPixmaps.count() > 5) {
@@ -59,6 +54,12 @@ void PixmapViewer::setPixmap(const QPixmap &pixmap)
 
     m_oldPixmap = m_pixmap.isNull() ? pixmap : m_pixmap;
     m_pixmap = pixmap;
+
+    // Avoid flicker with static pixmap if an animated image is running
+    if (m_animatedImage && m_animatedImage->state() == QMovie::Running) {
+        return;
+    }
+
     update();
 
     const bool animateTransition = (m_transition != NoTransition) && (m_pixmap.size() != m_oldPixmap.size());
@@ -68,7 +69,6 @@ void PixmapViewer::setPixmap(const QPixmap &pixmap)
         // If there is no transition animation but an animatedImage
         // and it is not already running, start animating now
         if (m_animatedImage->state() != QMovie::Running) {
-            m_animatedImage->setScaledSize(m_pixmap.size());
             m_animatedImage->start();
         }
     }
@@ -97,7 +97,6 @@ void PixmapViewer::setAnimatedImageFileName(const QString &fileName)
     }
 
     if (m_animatedImage->fileName() != fileName) {
-        m_animatedImage->stop();
         m_animatedImage->setFileName(fileName);
     }
 
@@ -126,7 +125,8 @@ void PixmapViewer::paintEvent(QPaintEvent *event)
         const bool useOldPixmap = (m_transition == SizeTransition) && (m_oldPixmap.width() > m_pixmap.width());
         const QPixmap &largePixmap = useOldPixmap ? m_oldPixmap : m_pixmap;
         if (!largePixmap.isNull()) {
-            const QPixmap scaledPixmap = largePixmap.scaled(scaledWidth, scaledHeight, Qt::IgnoreAspectRatio, Qt::FastTransformation);
+            QPixmap scaledPixmap = largePixmap.scaled(scaledWidth, scaledHeight, Qt::IgnoreAspectRatio, Qt::FastTransformation);
+            scaledPixmap.setDevicePixelRatio(devicePixelRatioF());
 
             style()->drawItemPixmap(&painter, rect(), Qt::AlignCenter, scaledPixmap);
         }
@@ -156,6 +156,10 @@ void PixmapViewer::updateAnimatedImageFrame()
     Q_ASSERT(m_animatedImage);
 
     m_pixmap = m_animatedImage->currentPixmap();
+    if (m_pixmap.width() > m_sizeHint.width() || m_pixmap.height() > m_sizeHint.height()) {
+        m_pixmap = m_pixmap.scaled(m_sizeHint, Qt::KeepAspectRatio);
+        m_animatedImage->setScaledSize(m_pixmap.size());
+    }
     update();
 }
 
@@ -164,6 +168,8 @@ void PixmapViewer::stopAnimatedImage()
     if (m_hasAnimatedImage) {
         m_animatedImage->stop();
         m_hasAnimatedImage = false;
+        delete m_animatedImage;
+        m_animatedImage = nullptr;
     }
 }
 
@@ -174,3 +180,5 @@ bool PixmapViewer::isAnimatedMimeType(const QString &mimeType)
         return QMovie::supportedFormats().contains(format);
     });
 }
+
+#include "moc_pixmapviewer.cpp"