00001
00002
00003
00004
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
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 );
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
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 );
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
00188
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() ) {
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
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
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
00284
00285
00286
00287