/*************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** ** Non-Open Source Usage ** ** Licensees may use this file in accordance with the Qt Beta Version ** License Agreement, Agreement version 2.2 provided with the Software or, ** alternatively, in accordance with the terms contained in a written ** agreement between you and Nokia. ** ** GNU General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the packaging ** of this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and ** http://www.gnu.org/copyleft/gpl.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt GPL Exception ** version 1.2, included in the file GPL_EXCEPTION.txt in this package. ** ***************************************************************************/ #include "styleanimator.h" #include Animation * StyleAnimator::widgetAnimation(const QWidget *widget) const { if (!widget) return 0; foreach (Animation *a, animations) { if (a->widget() == widget) return a; } return 0; } void Animation::paint(QPainter *painter, const QStyleOption *option) { Q_UNUSED(option); Q_UNUSED(painter); } void Animation::drawBlendedImage(QPainter *painter, QRect rect, float alpha) { if (_secondaryImage.isNull() || _primaryImage.isNull()) return; if (_tempImage.isNull()) _tempImage = _secondaryImage; const int a = qRound(alpha*256); const int ia = 256 - a; const int sw = _primaryImage.width(); const int sh = _primaryImage.height(); const int bpl = _primaryImage.bytesPerLine(); switch (_primaryImage.depth()) { case 32: { uchar *mixed_data = _tempImage.bits(); const uchar *back_data = _primaryImage.bits(); const uchar *front_data = _secondaryImage.bits(); for (int sy = 0; sy < sh; sy++) { quint32* mixed = (quint32*)mixed_data; const quint32* back = (const quint32*)back_data; const quint32* front = (const quint32*)front_data; for (int sx = 0; sx < sw; sx++) { quint32 bp = back[sx]; quint32 fp = front[sx]; mixed[sx] = qRgba ((qRed(bp)*ia + qRed(fp)*a)>>8, (qGreen(bp)*ia + qGreen(fp)*a)>>8, (qBlue(bp)*ia + qBlue(fp)*a)>>8, (qAlpha(bp)*ia + qAlpha(fp)*a)>>8); } mixed_data += bpl; back_data += bpl; front_data += bpl; } } default: break; } painter->drawImage(rect, _tempImage); } void Transition::paint(QPainter *painter, const QStyleOption *option) { float alpha = 1.0; if (_duration > 0) { QTime current = QTime::currentTime(); if (_startTime > current) _startTime = current; int timeDiff = _startTime.msecsTo(current); alpha = timeDiff/(float)_duration; if (timeDiff > _duration) { _running = false; alpha = 1.0; } } else { _running = false; } drawBlendedImage(painter, option->rect, alpha); } void StyleAnimator::timerEvent(QTimerEvent *) { for (int i = animations.size() - 1 ; i >= 0 ; --i) { if (animations[i]->widget()) animations[i]->widget()->update(); if (!animations[i]->widget() || !animations[i]->widget()->isEnabled() || !animations[i]->widget()->isVisible() || animations[i]->widget()->window()->isMinimized() || !animations[i]->running()) { Animation *a = animations.takeAt(i); delete a; } } if (animations.size() == 0 && animationTimer.isActive()) { animationTimer.stop(); } } void StyleAnimator::stopAnimation(const QWidget *w) { for (int i = animations.size() - 1 ; i >= 0 ; --i) { if (animations[i]->widget() == w) { Animation *a = animations.takeAt(i); delete a; break; } } } void StyleAnimator::startAnimation(Animation *t) { stopAnimation(t->widget()); animations.append(t); if (animations.size() > 0 && !animationTimer.isActive()) { animationTimer.start(35, this); } }