diff --git a/src/pixmapviewer.cpp b/src/pixmapviewer.cpp index 351f6463fa..36d583c1d0 100644 --- a/src/pixmapviewer.cpp +++ b/src/pixmapviewer.cpp @@ -24,7 +24,6 @@ #include #include #include -#include PixmapViewer::PixmapViewer(QWidget* parent) : QWidget(parent), @@ -33,10 +32,8 @@ PixmapViewer::PixmapViewer(QWidget* parent) : setMinimumWidth(K3Icon::SizeEnormous); setMinimumWidth(K3Icon::SizeEnormous); - m_animation.setDuration(750); - + m_animation.setDuration(300); connect(&m_animation, SIGNAL(valueChanged(qreal)), this, SLOT(update())); - connect(&m_animation, SIGNAL(finished()), this, SLOT(finishTransition())); } PixmapViewer::~PixmapViewer() @@ -49,55 +46,30 @@ void PixmapViewer::setPixmap(const QPixmap& pixmap) return; } - m_pendingPixmap = pixmap; + m_oldPixmap = m_pixmap.isNull() ? pixmap : m_pixmap; + m_pixmap = pixmap; - if (m_animation.state() == QTimeLine::NotRunning) { - beginTransition(); - } -} - -void PixmapViewer::beginTransition() -{ - Q_ASSERT(!m_pendingPixmap.isNull()); - Q_ASSERT(m_nextPixmap.isNull()); - - m_nextPixmap = m_pendingPixmap; - m_pendingPixmap = QPixmap(); m_animation.start(); } -void PixmapViewer::finishTransition() -{ - m_pixmap = m_nextPixmap; - m_nextPixmap = QPixmap(); - - if (!m_pendingPixmap.isNull()) { - beginTransition(); - } -} - void PixmapViewer::paintEvent(QPaintEvent* event) { QWidget::paintEvent(event); - QPainter painter; - painter.begin(this); - const int x = (width() - m_pixmap.width()) / 2; - const int y = (height() - m_pixmap.height()) / 2; + QPainter painter(this); - if (!m_nextPixmap.isNull()) { - const int nextPixmapX = (width() - m_nextPixmap.width()) / 2; - const int nextPixmapY = (height() - m_nextPixmap.height()) / 2; + const float value = m_animation.currentValue(); - painter.setOpacity( 1 - m_animation.currentValue() ); - painter.drawPixmap(x, y, m_pixmap); - painter.setOpacity( m_animation.currentValue() ); - painter.drawPixmap(nextPixmapX,nextPixmapY,m_nextPixmap); + 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 int x = (width() - scaledWidth ) / 2; + const int y = (height() - scaledHeight) / 2; + + if (m_oldPixmap.width() > m_pixmap.width()) { + painter.drawPixmap(x, y, m_oldPixmap.scaled(scaledWidth, scaledHeight)); } else { - painter.drawPixmap(x, y, m_pixmap); + painter.drawPixmap(x, y, m_pixmap.scaled(scaledWidth, scaledHeight)); } - - painter.end(); } #include "pixmapviewer.moc" diff --git a/src/pixmapviewer.h b/src/pixmapviewer.h index a5293c88d6..54ed5232c8 100644 --- a/src/pixmapviewer.h +++ b/src/pixmapviewer.h @@ -48,14 +48,9 @@ public: protected: virtual void paintEvent(QPaintEvent* event); -private slots: - void beginTransition(); - void finishTransition(); - private: QPixmap m_pixmap; - QPixmap m_nextPixmap; - QPixmap m_pendingPixmap; + QPixmap m_oldPixmap; QTimeLine m_animation; int m_animationStep; };