From 324a41db458f2f662398a5895c28b1a18ef52b2d Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 23 Oct 2012 16:39:57 +0200 Subject: [PATCH] QWindowsVistaAnimation: inherit QBlendStyleAnimation Change-Id: I15b348eb842730513480ecbb90bca87174d7c771 Reviewed-by: Jens Bache-Wiig --- src/widgets/styles/qwindowsvistastyle.cpp | 111 ++---------------------------- src/widgets/styles/qwindowsvistastyle_p.h | 30 ++------ 2 files changed, 10 insertions(+), 131 deletions(-) diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp index b20e6f5..f6648be 100644 --- a/src/widgets/styles/qwindowsvistastyle.cpp +++ b/src/widgets/styles/qwindowsvistastyle.cpp @@ -235,119 +235,16 @@ static int buttonStateId(int flags, int partId) return stateId; } -void QWindowsVistaAnimation::paint(QPainter *painter, const QStyleOption *option) -{ - Q_UNUSED(option); - Q_UNUSED(painter); -} - bool QWindowsVistaAnimation::isUpdateNeeded() const { return QWindowsVistaStylePrivate::useVista(); } -/*! \internal - - Helperfunction to paint the current transition state between two - animation frames. - - The result is a blended image consisting of ((alpha)*_primaryImage) - + ((1-alpha)*_secondaryImage) - -*/ -void QWindowsVistaAnimation::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); -} - -/*! \internal - Paints a transition state. The result will be a mix between the - initial and final state of the transition, depending on the time - difference between startTime and current time. -*/ -void QWindowsVistaTransition::paint(QPainter *painter, const QStyleOption *option) -{ - float alpha = 1.0; - if (_duration > 0) { - QTime current = QTime::currentTime(); - - if (startTime() > current) - setStartTime(current); - - int timeDiff = startTime().msecsTo(current); - alpha = timeDiff/(float)_duration; - if (timeDiff > _duration) { - stop(); - alpha = 1.0; - } - } - else { - stop(); - } - drawBlendedImage(painter, option->rect, alpha); -} - -/*! \internal - Paints a pulse. The result will be a mix between the primary and - secondary pulse images depending on the time difference between - startTime and current time. -*/ -void QWindowsVistaPulse::paint(QPainter *painter, const QStyleOption *option) +void QWindowsVistaAnimation::paint(QPainter *painter, const QStyleOption *option) { - float alpha = 1.0; - if (_duration > 0) { - QTime current = QTime::currentTime(); - - if (startTime() > current) - setStartTime(current); - - int timeDiff = startTime().msecsTo(current) % _duration*2; - if (timeDiff > _duration) - timeDiff = _duration*2 - timeDiff; - alpha = timeDiff/(float)_duration; - } else { - stop(); - } - drawBlendedImage(painter, option->rect, alpha); + painter->drawImage(option->rect, currentImage()); } - /*! \internal @@ -1088,8 +985,8 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption theme.stateId = PBS_DEFAULTED_ANIMATING; theme.painter = &alternatePainter; d->drawBackground(theme); - pulse->setPrimaryImage(startImage); - pulse->setAlternateImage(alternateImage); + pulse->setStartImage(startImage); + pulse->setEndImage(alternateImage); pulse->setStartTime(QTime::currentTime()); pulse->setDuration(2000); d->startAnimation(pulse); diff --git a/src/widgets/styles/qwindowsvistastyle_p.h b/src/widgets/styles/qwindowsvistastyle_p.h index 1d427fe..caa1045 100644 --- a/src/widgets/styles/qwindowsvistastyle_p.h +++ b/src/widgets/styles/qwindowsvistastyle_p.h @@ -135,24 +135,14 @@ QT_BEGIN_NAMESPACE #define TDLG_SECONDARYPANEL 8 #endif -class QWindowsVistaAnimation : public QStyleAnimation +class QWindowsVistaAnimation : public QBlendStyleAnimation { Q_OBJECT public: - QWindowsVistaAnimation(QObject *target) : QStyleAnimation(target), _duration(-1) { } - virtual ~QWindowsVistaAnimation() { } - virtual void paint(QPainter *painter, const QStyleOption *option); + QWindowsVistaAnimation(Type type, QObject *target) : QBlendStyleAnimation(type, target) { } + virtual bool isUpdateNeeded() const; - virtual int duration() const { return _duration; } - //set time in ms to complete a state transition / pulse cycle - void setDuration(int duration) { _duration = duration; } - -protected: - void drawBlendedImage(QPainter *painter, QRect rect, float value); - QImage _primaryImage; - QImage _secondaryImage; - QImage _tempImage; - int _duration; + void paint(QPainter *painter, const QStyleOption *option); }; @@ -161,11 +151,7 @@ class QWindowsVistaTransition : public QWindowsVistaAnimation { Q_OBJECT public: - QWindowsVistaTransition(QObject *target) : QWindowsVistaAnimation(target) {} - virtual ~QWindowsVistaTransition() { } - void setStartImage(const QImage &image) { _primaryImage = image; } - void setEndImage(const QImage &image) { _secondaryImage = image; } - virtual void paint(QPainter *painter, const QStyleOption *option); + QWindowsVistaTransition(QObject *target) : QWindowsVistaAnimation(Transition, target) {} }; @@ -174,11 +160,7 @@ class QWindowsVistaPulse: public QWindowsVistaAnimation { Q_OBJECT public: - QWindowsVistaPulse(QObject *target) : QWindowsVistaAnimation(target) {} - virtual ~QWindowsVistaPulse() { } - void setPrimaryImage(const QImage &image) { _primaryImage = image; } - void setAlternateImage(const QImage &image) { _secondaryImage = image; } - virtual void paint(QPainter *painter, const QStyleOption *option); + QWindowsVistaPulse(QObject *target) : QWindowsVistaAnimation(Pulse, target) {} }; -- 2.7.4