[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/workspace/libs/plasma/widgets
From: Aaron J. Seigo <aseigo () kde ! org>
Date: 2008-09-20 1:03:31
Message-ID: 1221872611.077232.6939.nullmailer () svn ! kde ! org
[Download RAW message or body]
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;
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic