]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Add fade transition between file icon/preview changes in the sidebar.
authorRobert Knight <robertknight@gmail.com>
Mon, 16 Apr 2007 15:38:03 +0000 (15:38 +0000)
committerRobert Knight <robertknight@gmail.com>
Mon, 16 Apr 2007 15:38:03 +0000 (15:38 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=654581

src/pixmapviewer.cpp
src/pixmapviewer.h

index 4fe451a8c6416a869d4dff7c3314edc491f24fa9..7060423842eb64b8df58a4ebfdb0e48adaf1a7fd 100644 (file)
 #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();
 }
 
index a4c0dd7f5c342d938998d57d9f83fba95a6e7d31..daa4f269a9dde0025e656dd5ba1764a3b9cac782 100644 (file)
@@ -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;
+
 };