kdeui Library API Documentation

kpassivepopup.cpp

00001 /*
00002  *   copyright            : (C) 2001-2002 by Richard Moore
00003  *   License              : This file is released under the terms of the LGPL, version 2.
00004  *   email                : rich@kde.org
00005  */
00006 
00007 #include <qapplication.h>
00008 #include <qlabel.h>
00009 #include <qlayout.h>
00010 #include <qtimer.h>
00011 #include <qvbox.h>
00012 
00013 #include <kdebug.h>
00014 #include <kdialog.h>
00015 #include <kpixmap.h>
00016 #include <kpixmapeffect.h>
00017 #include <kglobalsettings.h>
00018 #include <netwm.h>
00019 
00020 #include "kpassivepopup.h"
00021 #include "kpassivepopup.moc"
00022 
00023 static const int DEFAULT_POPUP_TIME = 6*1000;
00024 static const int POPUP_FLAGS = Qt::WStyle_Customize | Qt::WDestructiveClose | Qt::WX11BypassWM
00025                              | Qt::WStyle_StaysOnTop | Qt::WStyle_Tool | Qt::WStyle_NoBorder;
00026 
00027 
00028 KPassivePopup::KPassivePopup( QWidget *parent, const char *name, WFlags f )
00029     : QFrame( 0, name, f ? f : POPUP_FLAGS ),
00030       window( parent ? parent->winId() : 0L ), msgView( 0 ), layout( 0 ),
00031       hideDelay( DEFAULT_POPUP_TIME ), hideTimer( new QTimer( this, "hide_timer" ) ), m_autoDelete( false ), d( 0 )
00032 {
00033     init();
00034 }
00035 
00036 KPassivePopup::KPassivePopup( WId win, const char *name, WFlags f )
00037     : QFrame( 0, name, f ? f : POPUP_FLAGS ),
00038       window( win ), msgView( 0 ), layout( 0 ),
00039       hideDelay( DEFAULT_POPUP_TIME ), hideTimer( new QTimer( this, "hide_timer" ) ), m_autoDelete( false ), d( 0 )
00040 {
00041     init();
00042 }
00043 
00044 void KPassivePopup::init()
00045 {
00046     setFrameStyle( QFrame::Box| QFrame::Plain );
00047     setLineWidth( 2 );
00048     connect( hideTimer, SIGNAL( timeout() ), SLOT( hide() ) );
00049     connect( this, SIGNAL( clicked() ), SLOT( hide() ) );
00050 }
00051 
00052 KPassivePopup::~KPassivePopup()
00053 {
00054 }
00055 
00056 void KPassivePopup::setView( QWidget *child )
00057 {
00058     delete msgView;
00059     msgView = child;
00060 
00061     delete layout;
00062     layout = new QVBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
00063     layout->addWidget( msgView );
00064     layout->activate();
00065 }
00066 
00067 void KPassivePopup::setView( const QString &caption, const QString &text,
00068                              const QPixmap &icon )
00069 {
00070     // kdDebug() << "KPassivePopup::setView " << caption << ", " << text << endl;
00071     setView( standardView( caption, text, icon, this ) );
00072 }
00073 
00074 QVBox * KPassivePopup::standardView( const QString& caption,
00075                                      const QString& text,
00076                                      const QPixmap& icon,
00077                                      QWidget *parent )
00078 {
00079     QVBox *vb = new QVBox( parent ? parent : this );
00080     vb->setSpacing( KDialog::spacingHint() );
00081 
00082     QHBox *hb=0;
00083     if ( !icon.isNull() ) {
00084     hb = new QHBox( vb );
00085     hb->setMargin( 0 );
00086     hb->setSpacing( KDialog::spacingHint() );
00087     ttlIcon = new QLabel( hb, "title_icon" );
00088     ttlIcon->setPixmap( icon );
00089         ttlIcon->setAlignment( AlignLeft );
00090     }
00091 
00092     if ( !caption.isEmpty() ) {
00093     ttl = new QLabel( caption, hb ? hb : vb, "title_label" );
00094     QFont fnt = ttl->font();
00095     fnt.setBold( true );
00096     ttl->setFont( fnt );
00097     ttl->setAlignment( Qt::AlignHCenter );
00098         if ( hb )
00099             hb->setStretchFactor( ttl, 10 ); // enforce centering
00100     }
00101 
00102     if ( !text.isEmpty() ) {
00103         msg = new QLabel( text, vb, "msg_label" );
00104         msg->setAlignment( AlignLeft );
00105     }
00106 
00107     return vb;
00108 }
00109 
00110 void KPassivePopup::setView( const QString &caption, const QString &text )
00111 {
00112     setView( caption, text, QPixmap() );
00113 }
00114 
00115 void KPassivePopup::setTimeout( int delay )
00116 {
00117     hideDelay = delay;
00118     if( hideTimer->isActive() )
00119         hideTimer->changeInterval( delay );
00120 }
00121 
00122 void KPassivePopup::setAutoDelete( bool autoDelete )
00123 {
00124     m_autoDelete = autoDelete;
00125 }
00126 
00127 void KPassivePopup::mouseReleaseEvent( QMouseEvent *e )
00128 {
00129     emit clicked();
00130     emit clicked( e->pos() );
00131 }
00132 
00133 //
00134 // Main Implementation
00135 //
00136 
00137 void KPassivePopup::show()
00138 {
00139     if ( size() != sizeHint() )
00140     resize( sizeHint() );
00141 
00142     positionSelf();
00143     QFrame::show();
00144 
00145     int delay = hideDelay;
00146     if ( delay < 0 )
00147     delay = DEFAULT_POPUP_TIME;
00148 
00149     if ( delay > 0 ) {
00150     hideTimer->start( delay );
00151     }
00152 }
00153 
00154 void KPassivePopup::hideEvent( QHideEvent * )
00155 {
00156     hideTimer->stop();
00157     if ( m_autoDelete )
00158         deleteLater();
00159 }
00160 
00161 QRect KPassivePopup::defaultArea() const
00162 {
00163     NETRootInfo info( qt_xdisplay(),
00164                       NET::NumberOfDesktops |
00165                       NET::CurrentDesktop |
00166                       NET::WorkArea,
00167                       -1, false );
00168     info.activate();
00169     NETRect workArea = info.workArea( info.currentDesktop() );
00170     QRect r;
00171     r.setRect( workArea.pos.x, workArea.pos.y, 0, 0 ); // top left
00172     return r;
00173 }
00174 
00175 void KPassivePopup::positionSelf()
00176 {
00177     QRect target;
00178 
00179     if ( window == 0L ) {
00180         target = defaultArea();
00181     }
00182 
00183     else {
00184         NETWinInfo ni( qt_xdisplay(), window, qt_xrootwin(),
00185                        NET::WMIconGeometry | NET::WMKDESystemTrayWinFor );
00186 
00187         // Figure out where to put the popup. Note that we must handle
00188         // windows that skip the taskbar cleanly
00189         if ( ni.kdeSystemTrayWinFor() ) {
00190             NETRect frame, win;
00191             ni.kdeGeometry( frame, win );
00192             target.setRect( win.pos.x, win.pos.y,
00193                             win.size.width, win.size.height );
00194         }
00195         else if ( ni.state() & NET::SkipTaskbar ) {
00196             target = defaultArea();
00197         }
00198         else {
00199             NETRect r = ni.iconGeometry();
00200             target.setRect( r.pos.x, r.pos.y, r.size.width, r.size.height );
00201                 if ( target.isNull() ) { // bogus value, use the exact position
00202                     NETRect dummy;
00203                     ni.kdeGeometry( dummy, r );
00204                     target.setRect( r.pos.x, r.pos.y, 
00205                                     r.size.width, r.size.height);
00206                 }
00207         }
00208     }
00209 
00210     moveNear( target );
00211 }
00212 
00213 void KPassivePopup::moveNear( QRect target )
00214 {
00215     QPoint pos = target.topLeft();
00216     int x = pos.x();
00217     int y = pos.y();
00218     int w = width();
00219     int h = height();
00220 
00221     QRect r( qApp->desktop()->screenGeometry( QPoint(x+w/2,y+h/2) ) );
00222 
00223     if ( x < ( r.width() / 2 ) )
00224     x = x + target.width();
00225     else
00226     x = x - w;
00227 
00228     // It's apparently trying to go off screen, so display it ALL at the bottom.
00229     if ( (y + h) > r.height() )
00230     y = r.height() - h;
00231 
00232     if ( y < 0 )
00233         y = 0;
00234 
00235 #ifdef OLD_BITS
00236     if ( (x - w) >= 0  )
00237     x = x - w;
00238 #endif
00239 
00240     move( x, y );
00241 }
00242 
00243 //
00244 // Convenience Methods
00245 //
00246 
00247 KPassivePopup *KPassivePopup::message( const QString &caption, const QString &text,
00248                        const QPixmap &icon,
00249                        QWidget *parent, const char *name, int timeout )
00250 {
00251     KPassivePopup *pop = new KPassivePopup( parent, name );
00252     pop->setAutoDelete( true );
00253     pop->setView( caption, text, icon );
00254     pop->hideDelay = timeout;
00255     pop->show();
00256 
00257     return pop;
00258 }
00259 
00260 KPassivePopup *KPassivePopup::message( const QString &text, QWidget *parent, const char *name )
00261 {
00262     return message( QString::null, text, QPixmap(), parent, name );
00263 }
00264 
00265 KPassivePopup *KPassivePopup::message( const QString &caption, const QString &text,
00266                        QWidget *parent, const char *name )
00267 {
00268     return message( caption, text, QPixmap(), parent, name );
00269 }
00270 
00271 KPassivePopup *KPassivePopup::message( const QString &caption, const QString &text,
00272                        const QPixmap &icon, WId parent, const char *name, int timeout )
00273 {
00274     KPassivePopup *pop = new KPassivePopup( parent, name );
00275     pop->setAutoDelete( true );
00276     pop->setView( caption, text, icon );
00277     pop->hideDelay = timeout;
00278     pop->show();
00279 
00280     return pop;
00281 }
00282 
00283 // Local Variables:
00284 // c-basic-offset: 4
00285 // End:
00286 
00287 
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.4.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 27 22:15:04 2005 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001