X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/4c47e1ac23bef37a3083fbd32ca9d21bc766ec01..862ceee323ad3b474ce9de11eefbddd99c528fac:/src/pixmapviewer.cpp diff --git a/src/pixmapviewer.cpp b/src/pixmapviewer.cpp index 706042384..79e2487a7 100644 --- a/src/pixmapviewer.cpp +++ b/src/pixmapviewer.cpp @@ -1,6 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 by Peter Penz * - * peter.penz@gmx.at * + * Copyright (C) 2006 by Peter Penz * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -23,21 +22,18 @@ #include #include #include -#include -#include +#include -PixmapViewer::PixmapViewer(QWidget* parent) : - QWidget(parent) - ,m_animationStep(0) +PixmapViewer::PixmapViewer(QWidget* parent, Transition transition) : + QWidget(parent), + m_transition(transition), + 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()) ); + m_animation.setDuration(300); + connect(&m_animation, SIGNAL(valueChanged(qreal)), this, SLOT(update())); } PixmapViewer::~PixmapViewer() @@ -46,33 +42,18 @@ PixmapViewer::~PixmapViewer() void PixmapViewer::setPixmap(const QPixmap& pixmap) { - if ( pixmap.isNull() ) + 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(); + m_oldPixmap = m_pixmap.isNull() ? pixmap : m_pixmap; + m_pixmap = pixmap; + update(); - if ( !m_pendingPixmap.isNull() ) - { - beginTransition(); + const bool animate = (m_transition != NoTransition) && + (m_pixmap.size() != m_oldPixmap.size()); + if (animate) { + m_animation.start(); } } @@ -80,27 +61,23 @@ 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); - } - else - { - painter.drawPixmap(x, y, m_pixmap); - } + 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; - painter.end(); + const bool useOldPixmap = (m_transition == SizeTransition) && + (m_oldPixmap.width() > m_pixmap.width()); + const QPixmap& largePixmap = useOldPixmap ? m_oldPixmap : m_pixmap; + const QPixmap scaledPixmap = largePixmap.scaled(scaledWidth, + scaledHeight, + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation); + painter.drawPixmap(x, y, scaledPixmap); } #include "pixmapviewer.moc"