diff options
| author | Robert Knight <[email protected]> | 2007-04-16 15:38:03 +0000 |
|---|---|---|
| committer | Robert Knight <[email protected]> | 2007-04-16 15:38:03 +0000 |
| commit | 4c47e1ac23bef37a3083fbd32ca9d21bc766ec01 (patch) | |
| tree | 072c5158e7eb05bc8792009dbe99aa66f0ae3263 /src | |
| parent | 1fb838af11b19cb7b82aae49e0603c30f94704f0 (diff) | |
Add fade transition between file icon/preview changes in the sidebar.
svn path=/trunk/KDE/kdebase/apps/; revision=654581
Diffstat (limited to 'src')
| -rw-r--r-- | src/pixmapviewer.cpp | 55 | ||||
| -rw-r--r-- | src/pixmapviewer.h | 10 |
2 files changed, 62 insertions, 3 deletions
diff --git a/src/pixmapviewer.cpp b/src/pixmapviewer.cpp index 4fe451a8c..706042384 100644 --- a/src/pixmapviewer.cpp +++ b/src/pixmapviewer.cpp @@ -24,12 +24,20 @@ #include <QtGui/QPainter> #include <QtGui/QPixmap> #include <QtGui/QPaintEvent> +#include <QtDebug> PixmapViewer::PixmapViewer(QWidget* parent) : QWidget(parent) + ,m_animationStep(0) { setMinimumWidth(K3Icon::SizeEnormous); setMinimumWidth(K3Icon::SizeEnormous); + + static const int ANIMATION_DURATION = 750; + m_animation.setDuration(ANIMATION_DURATION); + + connect( &m_animation , SIGNAL(valueChanged(qreal)) , this , SLOT(update()) ); + connect( &m_animation , SIGNAL(finished()) , this , SLOT(finishTransition()) ); } PixmapViewer::~PixmapViewer() @@ -38,8 +46,34 @@ PixmapViewer::~PixmapViewer() void PixmapViewer::setPixmap(const QPixmap& pixmap) { - m_pixmap = pixmap; - update(); + if ( pixmap.isNull() ) + return; + + m_pendingPixmap = 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) @@ -50,7 +84,22 @@ void PixmapViewer::paintEvent(QPaintEvent* event) painter.begin(this); const int x = (width() - m_pixmap.width()) / 2; const int y = (height() - m_pixmap.height()) / 2; - painter.drawPixmap(x, y, m_pixmap); + + if ( !m_nextPixmap.isNull() ) + { + const int nextPixmapX = (width() - m_nextPixmap.width()) / 2; + const int nextPixmapY = (height() - m_nextPixmap.height()) / 2; + + painter.setOpacity( 1 - m_animation.currentValue() ); + painter.drawPixmap(x, y, m_pixmap); + painter.setOpacity( m_animation.currentValue() ); + painter.drawPixmap(nextPixmapX,nextPixmapY,m_nextPixmap); + } + else + { + painter.drawPixmap(x, y, m_pixmap); + } + painter.end(); } diff --git a/src/pixmapviewer.h b/src/pixmapviewer.h index a4c0dd7f5..daa4f269a 100644 --- a/src/pixmapviewer.h +++ b/src/pixmapviewer.h @@ -23,6 +23,7 @@ #include <QtGui/QWidget> #include <QtGui/QPixmap> +#include <QTimeLine> class QPaintEvent; @@ -47,8 +48,17 @@ public: protected: virtual void paintEvent(QPaintEvent* event); +private slots: + void beginTransition(); + void finishTransition(); + private: QPixmap m_pixmap; + QPixmap m_nextPixmap; + QPixmap m_pendingPixmap; + QTimeLine m_animation; + int m_animationStep; + }; |
