mirror of
https://invent.kde.org/system/dolphin
synced 2024-10-28 03:21:56 +00:00
Add fade transition between file icon/preview changes in the sidebar.
svn path=/trunk/KDE/kdebase/apps/; revision=654581
This commit is contained in:
parent
1fb838af11
commit
4c47e1ac23
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue