[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