X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/891ebf5758cd3569974c87f3c25f0546fe2613be..efd4a2acb681a0766d59d5cfb0bcbfb7fc389309:/src/panels/information/pixmapviewer.cpp diff --git a/src/panels/information/pixmapviewer.cpp b/src/panels/information/pixmapviewer.cpp index 1f072641e..b18c9e64e 100644 --- a/src/panels/information/pixmapviewer.cpp +++ b/src/panels/information/pixmapviewer.cpp @@ -13,13 +13,13 @@ #include #include -PixmapViewer::PixmapViewer(QWidget* parent, Transition transition) : - QWidget(parent), - m_animatedImage(nullptr), - m_transition(transition), - m_animationStep(0), - m_sizeHint(), - m_hasAnimatedImage(false) +PixmapViewer::PixmapViewer(QWidget *parent, Transition transition) + : QWidget(parent) + , m_animatedImage(nullptr) + , m_transition(transition) + , m_animationStep(0) + , m_sizeHint() + , m_hasAnimatedImage(false) { setMinimumWidth(KIconLoader::SizeEnormous); setMinimumHeight(KIconLoader::SizeEnormous); @@ -37,17 +37,12 @@ PixmapViewer::~PixmapViewer() { } -void PixmapViewer::setPixmap(const QPixmap& pixmap) +void PixmapViewer::setPixmap(const QPixmap &pixmap) { if (pixmap.isNull()) { 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,23 +54,27 @@ 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()); + const bool animateTransition = (m_transition != NoTransition) && (m_pixmap.size() != m_oldPixmap.size()); if (animateTransition) { m_animation.start(); } else if (m_hasAnimatedImage) { // 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(); } } } -void PixmapViewer::setSizeHint(const QSize& size) +void PixmapViewer::setSizeHint(const QSize &size) { if (m_animatedImage && size != m_sizeHint) { m_animatedImage->stop(); @@ -98,14 +97,12 @@ void PixmapViewer::setAnimatedImageFileName(const QString &fileName) } if (m_animatedImage->fileName() != fileName) { - m_animatedImage->stop(); m_animatedImage->setFileName(fileName); } m_hasAnimatedImage = m_animatedImage->isValid() && (m_animatedImage->frameCount() > 1); } - QString PixmapViewer::animatedImageFileName() const { if (!m_hasAnimatedImage) { @@ -114,7 +111,7 @@ QString PixmapViewer::animatedImageFileName() const return m_animatedImage->fileName(); } -void PixmapViewer::paintEvent(QPaintEvent* event) +void PixmapViewer::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); @@ -122,17 +119,14 @@ void PixmapViewer::paintEvent(QPaintEvent* event) if (m_transition != NoTransition || (m_hasAnimatedImage && m_animatedImage->state() != QMovie::Running)) { const float value = m_animation.currentValue(); - const int scaledWidth = static_cast((m_oldPixmap.width() * (1.0 - value)) + (m_pixmap.width() * value)); + const int scaledWidth = static_cast((m_oldPixmap.width() * (1.0 - value)) + (m_pixmap.width() * value)); const int scaledHeight = static_cast((m_oldPixmap.height() * (1.0 - value)) + (m_pixmap.height() * value)); - const bool useOldPixmap = (m_transition == SizeTransition) && - (m_oldPixmap.width() > m_pixmap.width()); - const QPixmap& largePixmap = useOldPixmap ? m_oldPixmap : m_pixmap; + 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); } @@ -159,9 +153,13 @@ void PixmapViewer::checkPendingPixmaps() void PixmapViewer::updateAnimatedImageFrame() { - Q_ASSERT (m_animatedImage); + 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(); } @@ -170,12 +168,17 @@ void PixmapViewer::stopAnimatedImage() if (m_hasAnimatedImage) { m_animatedImage->stop(); m_hasAnimatedImage = false; + delete m_animatedImage; + m_animatedImage = nullptr; } } bool PixmapViewer::isAnimatedMimeType(const QString &mimeType) { const QList imageFormats = QImageReader::imageFormatsForMimeType(mimeType.toUtf8()); - return std::any_of(imageFormats.begin(), imageFormats.end(), - [](const QByteArray &format){ return QMovie::supportedFormats().contains(format); }); + return std::any_of(imageFormats.begin(), imageFormats.end(), [](const QByteArray &format) { + return QMovie::supportedFormats().contains(format); + }); } + +#include "moc_pixmapviewer.cpp"