/*************************************************************************** * Copyright (C) 2005 by Max Howell * * 2005 by Seb Ruiz * * * * Dissolve Mask (c) Kicker Authors kickertip.cpp, 2005/08/17 * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "popupMessage.h" #include "debug.h" #include #include #include #include #include #include #include #include #include #include namespace KDE { PopupMessage::PopupMessage( TQWidget *tqparent, TQWidget *anchor, int timeout, const char *name ) : OverlayWidget( tqparent, anchor, name ) , m_anchor( anchor ) , m_tqparent( tqparent ) , m_maskEffect( Slide ) , m_dissolveSize( 0 ) , m_dissolveDelta( -1 ) , m_offset( 0 ) , m_counter( 0 ) , m_stage( 1 ) , m_timeout( timeout ) , m_showCounter( true ) { setFrameStyle( TQFrame::Panel | TQFrame::Raised ); setFrameShape( TQFrame::StyledPanel ); setWFlags( TQt::WX11BypassWM ); TQPalette p = TQToolTip::palette(); setPalette( p ); TQHBoxLayout *hbox; TQLabel *label; KActiveLabel *alabel; m_tqlayout = new TQVBoxLayout( this, 9 /*margin*/, 6 /*spacing*/ ); hbox = new TQHBoxLayout( m_tqlayout, 12 ); hbox->addWidget( m_countdownFrame = new TQFrame( this, "counterVisual" ) ); m_countdownFrame->setFixedWidth( fontMetrics().width( "X" ) ); m_countdownFrame->setFrameStyle( TQFrame::Plain | TQFrame::Box ); m_countdownFrame->setPaletteForegroundColor( paletteBackgroundColor().dark() ); label = new TQLabel( this, "image" ); hbox->add( label ); alabel = new KActiveLabel( this, "label" ); alabel->setTextFormat( TQt::RichText ); alabel->tqsetSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::Preferred ); alabel->setPalette( p ); hbox->add( alabel ); hbox = new TQHBoxLayout( m_tqlayout ); hbox->addItem( new TQSpacerItem( 4, 4, TQSizePolicy::Expanding, TQSizePolicy::Preferred ) ); hbox->add( new KPushButton( KStdGuiItem::close(), this, "closeButton" ) ); connect( child( "closeButton" ), TQT_SIGNAL(clicked()), TQT_SLOT(close()) ); } void PopupMessage::addWidget( TQWidget *widget ) { m_tqlayout->add( widget ); adjustSize(); } void PopupMessage::setShowCloseButton( const bool show ) { static_cast(TQT_TQWIDGET(child( "closeButton" )))->setShown( show ); adjustSize(); } void PopupMessage::setShowCounter( const bool show ) { m_showCounter = show; static_cast(TQT_TQWIDGET(child( "counterVisual" )))->setShown( show ); adjustSize(); } void PopupMessage::setText( const TQString &text ) { static_cast(TQT_TQWIDGET(child( "label" )))->setText( text ); adjustSize(); } void PopupMessage::setImage( const TQString &location ) { static_cast(TQT_TQWIDGET(child( "image" )))->setPixmap( TQPixmap( location ) ); adjustSize(); } void PopupMessage::setImage( const TQPixmap &pix ) { static_cast(TQT_TQWIDGET(child( "image" )))->setPixmap( pix ); adjustSize(); } //////////////////////////////////////////////////////////////////////// // Public Slots //////////////////////////////////////////////////////////////////////// void PopupMessage::close() //SLOT { m_stage = 3; killTimer( m_timerId ); m_timerId = startTimer( 6 ); } void PopupMessage::display() //SLOT { m_dissolveSize = 24; m_dissolveDelta = -1; if( m_maskEffect == Dissolve ) { // necessary to create the tqmask m_tqmask.resize( width(), height() ); // make the tqmask empty and hence will not show widget with show() called below dissolveMask(); m_timerId = startTimer( 1000 / 30 ); } else { m_timerId = startTimer( 6 ); } show(); } //////////////////////////////////////////////////////////////////////// // Protected //////////////////////////////////////////////////////////////////////// void PopupMessage::timerEvent( TQTimerEvent* ) { switch( m_maskEffect ) { case Plain: plainMask(); break; case Slide: slideMask(); break; case Dissolve: dissolveMask(); break; } } void PopupMessage::countDown() { if( !m_timeout ) { killTimer( m_timerId ); return; } TQFrame *&h = m_countdownFrame; if( m_counter < h->height() - 3 ) TQPainter( h ).fillRect( 2, 2, h->width() - 4, m_counter, tqpalette().active().highlight() ); if( !hasMouse() ) m_counter++; if( m_counter > h->height() ) { m_stage = 3; killTimer( m_timerId ); m_timerId = startTimer( 6 ); } else { killTimer( m_timerId ); m_timerId = startTimer( m_timeout / h->height() ); } } void PopupMessage::dissolveMask() { if( m_stage == 1 ) { tqrepaint( false ); TQPainter maskPainter(&m_tqmask); m_tqmask.fill(TQt::black); maskPainter.setBrush(TQt::white); maskPainter.setPen(TQt::white); maskPainter.drawRect( m_tqmask.rect() ); m_dissolveSize += m_dissolveDelta; if( m_dissolveSize > 0 ) { maskPainter.setRasterOp( TQt::EraseROP ); int x, y, s; const int size = 16; for (y = 0; y < height() + size; y += size) { x = width(); s = m_dissolveSize * x / 128; for ( ; x > size; x -= size, s -= 2 ) { if (s < 0) break; maskPainter.drawEllipse(x - s / 2, y - s / 2, s, s); } } } else if( m_dissolveSize < 0 ) { m_dissolveDelta = 1; killTimer( m_timerId ); if( m_timeout ) { m_timerId = startTimer( 40 ); m_stage = 2; } } setMask(m_tqmask); } else if ( m_stage == 2 ) { countDown(); } else { deleteLater(); } } void PopupMessage::plainMask() { switch( m_stage ) { case 1: // Raise killTimer( m_timerId ); if( m_timeout ) { m_timerId = startTimer( 40 ); m_stage = 2; } break; case 2: // Counter countDown(); break; case 3: // Lower/Remove deleteLater(); } } void PopupMessage::slideMask() { switch( m_stage ) { case 1: //raise move( 0, m_tqparent->y() - m_offset ); m_offset++; if( m_offset > height() ) { killTimer( m_timerId ); if( m_timeout ) { m_timerId = startTimer( 40 ); m_stage = 2; } } break; case 2: //fill in pause timer bar countDown(); break; case 3: //lower m_offset--; move( 0, m_tqparent->y() - m_offset ); if( m_offset < 0 ) deleteLater(); } } } #include "popupMessage.moc"