X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/5c4c00e1591f1756b4b06fb04d47cc421fcd6399..b1c9b5126d:/src/pixmapviewer.cpp diff --git a/src/pixmapviewer.cpp b/src/pixmapviewer.cpp index 351f6463f..416e53f1f 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 * @@ -21,22 +20,28 @@ #include "pixmapviewer.h" #include -#include -#include -#include -#include -PixmapViewer::PixmapViewer(QWidget* parent) : +#include +#include +#include +#include + +PixmapViewer::PixmapViewer(QWidget* parent, Transition transition) : QWidget(parent), - m_animationStep(0) + m_transition(transition), + m_animationStep(0), + m_sizeHint() { - setMinimumWidth(K3Icon::SizeEnormous); - setMinimumWidth(K3Icon::SizeEnormous); + setMinimumWidth(KIconLoader::SizeEnormous); + setMinimumHeight(KIconLoader::SizeEnormous); - m_animation.setDuration(750); + m_animation.setDuration(150); + m_animation.setCurveShape(QTimeLine::LinearCurve); - connect(&m_animation, SIGNAL(valueChanged(qreal)), this, SLOT(update())); - connect(&m_animation, SIGNAL(finished()), this, SLOT(finishTransition())); + if (m_transition != NoTransition) { + connect(&m_animation, SIGNAL(valueChanged(qreal)), this, SLOT(update())); + connect(&m_animation, SIGNAL(finished()), this, SLOT(checkPendingPixmaps())); + } } PixmapViewer::~PixmapViewer() @@ -49,55 +54,77 @@ void PixmapViewer::setPixmap(const QPixmap& pixmap) return; } - m_pendingPixmap = pixmap; + if ((m_transition != NoTransition) && (m_animation.state() == QTimeLine::Running)) { + m_pendingPixmaps.enqueue(pixmap); + if (m_pendingPixmaps.count() > 5) { + // don't queue more than 5 pixmaps + m_pendingPixmaps.takeFirst(); + } + return; + } - if (m_animation.state() == QTimeLine::NotRunning) { - beginTransition(); + m_oldPixmap = m_pixmap.isNull() ? pixmap : m_pixmap; + m_pixmap = pixmap; + update(); + + const bool animate = (m_transition != NoTransition) && + (m_pixmap.size() != m_oldPixmap.size()); + if (animate) { + m_animation.start(); } } -void PixmapViewer::beginTransition() +void PixmapViewer::setSizeHint(const QSize& size) { - Q_ASSERT(!m_pendingPixmap.isNull()); - Q_ASSERT(m_nextPixmap.isNull()); - - m_nextPixmap = m_pendingPixmap; - m_pendingPixmap = QPixmap(); - m_animation.start(); + m_sizeHint = size; + updateGeometry(); } -void PixmapViewer::finishTransition() +QSize PixmapViewer::sizeHint() const { - m_pixmap = m_nextPixmap; - m_nextPixmap = QPixmap(); - - if (!m_pendingPixmap.isNull()) { - beginTransition(); - } + return m_sizeHint; } 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; + if (m_transition != NoTransition) { + const float value = m_animation.currentValue(); + 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)); - 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 x = (width() - scaledWidth ) / 2; + const int y = (height() - scaledHeight) / 2; + + 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::FastTransformation); + painter.drawPixmap(x, y, scaledPixmap); } else { + const int x = (width() - m_pixmap.width() ) / 2; + const int y = (height() - m_pixmap.height()) / 2; painter.drawPixmap(x, y, m_pixmap); } +} - painter.end(); +void PixmapViewer::checkPendingPixmaps() +{ + if (m_pendingPixmaps.count() > 0) { + QPixmap pixmap = m_pendingPixmaps.dequeue(); + m_oldPixmap = m_pixmap.isNull() ? pixmap : m_pixmap; + m_pixmap = pixmap; + update(); + m_animation.start(); + } else { + m_oldPixmap = m_pixmap; + } } #include "pixmapviewer.moc"