SVN commit 862833 by aseigo: * make flash not reset the flash every time the text/pixmap is set if it already in the process of showing. * clean up a lot of the code * don't use single shots, as they may need to be interupted M +113 -59 flash.cpp M +0 -3 flash.h --- trunk/KDE/kdebase/workspace/libs/plasma/widgets/flash.cpp #862832:862833 @@ -40,16 +40,32 @@ enum FlashType { Text, Pixmap }; enum State { Visible, Invisible }; - FlashPrivate() { } + FlashPrivate() + : defaultDuration(3000), + type(FlashPrivate::Text), + color(Qt::black), + animId(0), + state(FlashPrivate::Invisible) + { + //TODO: put this on a diet by using timerEvent instead? + fadeOutTimer.setInterval(defaultDuration); + fadeOutTimer.setSingleShot(true); + fadeInTimer.setInterval(0); + fadeInTimer.setSingleShot(true); + } ~FlashPrivate() { } + void renderPixmap(const QSize &size); + void setupFlash(Flash *flash, int duration); + + int defaultDuration; + FlashType type; + QTimer fadeInTimer; + QTimer fadeOutTimer; QString text; QColor color; QFont font; QPixmap pixmap; - int duration; - int defaultDuration; - FlashType type; int animId; QPixmap renderedPixmap; @@ -65,15 +81,10 @@ : QGraphicsWidget(parent), d(new FlashPrivate) { - d->defaultDuration = 3000; - d->type = FlashPrivate::Text; - d->color = Qt::black; - d->animId = 0; - d->state = FlashPrivate::Invisible; - - setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ); - + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); setCacheMode(NoCache); + connect(&d->fadeOutTimer, SIGNAL(timeout()), this, SLOT(fadeOut())); + connect(&d->fadeInTimer, SIGNAL(timeout()), this, SLOT(fadeIn())); } Flash::~Flash() @@ -81,106 +92,149 @@ delete d; } -void Flash::setDuration( int duration ) +void Flash::setDuration(int duration) { + if (duration < 1) { + return; + } + d->defaultDuration = duration; } -void Flash::setColor( const QColor &color ) +void Flash::setColor(const QColor &color) { d->color = color; } -void Flash::setFont( const QFont &font ) +void Flash::setFont(const QFont &font) { d->font = font; } -void Flash::flash( const QString &text, int duration, const QTextOption &option) +void Flash::flash(const QString &text, int duration, const QTextOption &option) { - kDebug() << duration; + if (text.isEmpty()) { + return; + } + + //kDebug() << duration << text; d->type = FlashPrivate::Text; - d->duration = (duration == 0) ? d->defaultDuration : duration; d->text = text; d->textOption = option; - QTimer::singleShot( 0, this, SLOT(fadeIn()) ); + d->setupFlash(this, duration); } -void Flash::flash( const QPixmap &pixmap, int duration, Qt::Alignment align ) +void Flash::flash(const QPixmap &pixmap, int duration, Qt::Alignment align) { + if (pixmap.isNull()) { + return; + } + d->type = FlashPrivate::Pixmap; - d->duration = (duration == 0) ? d->defaultDuration : duration; d->pixmap = pixmap; d->alignment = align; - QTimer::singleShot( 0, this, SLOT(fadeIn()) ); + d->setupFlash(this, duration); } void Flash::kill() { - if( d->state == FlashPrivate::Visible ) + d->fadeInTimer.stop(); + if (d->state == FlashPrivate::Visible) { fadeOut(); + } } void Flash::fadeIn() { + //kDebug(); d->state = FlashPrivate::Visible; - d->renderedPixmap = renderPixmap(); d->animId = Plasma::Animator::self()->animateElement(this, Plasma::Animator::AppearAnimation); - Plasma::Animator::self()->setInitialPixmap( d->animId, d->renderedPixmap ); - if( d->duration > 0 ) - QTimer::singleShot( d->duration, this, SLOT(fadeOut()) ); + Plasma::Animator::self()->setInitialPixmap(d->animId, d->renderedPixmap); } void Flash::fadeOut() { - if( d->state == FlashPrivate::Invisible ) + if (d->state == FlashPrivate::Invisible) { return; // Flash was already killed - do not animate again + } d->state = FlashPrivate::Invisible; d->animId = Plasma::Animator::self()->animateElement(this, Plasma::Animator::DisappearAnimation); - Plasma::Animator::self()->setInitialPixmap( d->animId, d->renderedPixmap ); + Plasma::Animator::self()->setInitialPixmap(d->animId, d->renderedPixmap); } -QPixmap Flash::renderPixmap() +void Flash::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { - QPixmap pm( size().toSize() ); - pm.fill(Qt::transparent); + Q_UNUSED(option) + Q_UNUSED(widget) - QPainter painter( &pm ); - if( d->type == FlashPrivate::Text ) { - painter.setPen( d->color ); - painter.setFont( d->font ); - painter.drawText( QRect( QPoint(0, 0), size().toSize() ), d->text, d->textOption); - } else if( d->type == FlashPrivate::Pixmap ) { + if (d->animId && !Plasma::Animator::self()->currentPixmap(d->animId).isNull()) { + painter->drawPixmap(0, 0, Plasma::Animator::self()->currentPixmap(d->animId)); + } else { + d->animId = 0; + + if (d->state == FlashPrivate::Visible) { + painter->drawPixmap(0, 0, d->renderedPixmap); + } + } +} + +void FlashPrivate::renderPixmap(const QSize &size) +{ + if (renderedPixmap.size() != size) { + renderedPixmap = QPixmap(size); + } + renderedPixmap.fill(Qt::transparent); + + QPainter painter(&renderedPixmap); + if (type == FlashPrivate::Text) { + painter.setPen(color); + painter.setFont(font); + painter.drawText(QRect(QPoint(0, 0), size), text, textOption); + } else if (type == FlashPrivate::Pixmap) { QPoint p; - if( d->alignment & Qt::AlignLeft ) - p.setX( 0 ); - else if( d->alignment & Qt::AlignRight ) - p.setX( pm.width() - d->pixmap.width() ); - else - p.setX( (pm.width() - d->pixmap.width())/2 ); - if( d->alignment & Qt::AlignTop ) - p.setY( 0 ); - else if( d->alignment & Qt::AlignRight ) - p.setY( pm.height() - d->pixmap.height() ); - else - p.setY( (pm.height() - d->pixmap.height())/2 ); + if(alignment & Qt::AlignLeft) { + p.setX(0); + } else if (alignment & Qt::AlignRight) { + p.setX(size.width() - pixmap.width()); + } else { + p.setX((size.width() - pixmap.width())/2); + } - painter.drawPixmap( p, d->pixmap ); + if (alignment & Qt::AlignTop) { + p.setY(0); + } else if (alignment & Qt::AlignRight) { + p.setY(size.height() - pixmap.height()); + } else { + p.setY((size.height() - pixmap.height())/2); + } + + painter.drawPixmap(p, pixmap); } - return pm; + painter.end(); + + if (animId) { + Plasma::Animator::self()->setInitialPixmap(animId, renderedPixmap); + } } -void Flash::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) + +void FlashPrivate::setupFlash(Flash *flash, int duration) { - Q_UNUSED(option) - Q_UNUSED(widget) + fadeOutTimer.stop(); + fadeOutTimer.setInterval(duration > 0 ? duration : defaultDuration); - if( d->animId && !Plasma::Animator::self()->currentPixmap(d->animId).isNull() ) { - painter->drawPixmap( 0, 0, Plasma::Animator::self()->currentPixmap(d->animId) ); - } else if( d->state == FlashPrivate::Visible ) { - painter->drawPixmap( 0, 0, d->renderedPixmap ); + renderPixmap(flash->size().toSize()); + if (state != FlashPrivate::Visible) { + fadeInTimer.start(); + } else { + flash->update(); } + + if (fadeOutTimer.interval() > 0) { + fadeOutTimer.start(); + } } + #include "flash.moc" --- trunk/KDE/kdebase/workspace/libs/plasma/widgets/flash.h #862832:862833 @@ -59,9 +59,6 @@ void fadeIn(); void fadeOut(); - protected: - QPixmap renderPixmap(); - private: FlashPrivate * const d; };