00001
00002
00003
00004
00005
00006
00007
#include <kconfig.h>
00008
00009
#include <qapplication.h>
00010
#include <qlabel.h>
00011
#include <qlayout.h>
00012
#include <qtimer.h>
00013
#include <qvbox.h>
00014
00015
#include <kdebug.h>
00016
#include <kdialog.h>
00017
#include <kpixmap.h>
00018
#include <kpixmapeffect.h>
00019
#include <kglobalsettings.h>
00020
00021
#include "config.h"
00022
#ifdef Q_WS_X11
00023
#include <netwm.h>
00024
#endif
00025
00026
#include "kpassivepopup.h"
00027
#include "kpassivepopup.moc"
00028
00029
static const int DEFAULT_POPUP_TIME = 6*1000;
00030
static const int POPUP_FLAGS = Qt::WStyle_Customize | Qt::WDestructiveClose | Qt::WX11BypassWM
00031 | Qt::WStyle_StaysOnTop | Qt::WStyle_Tool | Qt::WStyle_NoBorder;
00032
00033
00034 KPassivePopup::KPassivePopup(
QWidget *parent,
const char *name, WFlags f )
00035 :
QFrame( 0, name, f ? f : POPUP_FLAGS ),
00036 window( parent ? parent->winId() : 0L ), msgView( 0 ), topLayout( 0 ),
00037 hideDelay( DEFAULT_POPUP_TIME ), hideTimer( new
QTimer( this, "hide_timer" ) ), m_autoDelete( false ), d( 0 )
00038 {
00039 init();
00040 }
00041
00042 KPassivePopup::KPassivePopup( WId win,
const char *name, WFlags f )
00043 :
QFrame( 0, name, f ? f : POPUP_FLAGS ),
00044 window( win ), msgView( 0 ), topLayout( 0 ),
00045 hideDelay( DEFAULT_POPUP_TIME ), hideTimer( new
QTimer( this, "hide_timer" ) ), m_autoDelete( false ), d( 0 )
00046 {
00047 init();
00048 }
00049
00050
void KPassivePopup::init()
00051 {
00052 setFrameStyle( QFrame::Box| QFrame::Plain );
00053 setLineWidth( 2 );
00054 connect( hideTimer, SIGNAL(
timeout() ), SLOT( hide() ) );
00055 connect(
this, SIGNAL(
clicked() ), SLOT( hide() ) );
00056 }
00057
00058 KPassivePopup::~KPassivePopup()
00059 {
00060 }
00061
00062 void KPassivePopup::setView(
QWidget *child )
00063 {
00064
delete msgView;
00065 msgView = child;
00066
00067
delete topLayout;
00068 topLayout =
new QVBoxLayout(
this, KDialog::marginHint(), KDialog::spacingHint() );
00069 topLayout->
addWidget( msgView );
00070 topLayout->activate();
00071 }
00072
00073 void KPassivePopup::setView(
const QString &caption,
const QString &text,
00074
const QPixmap &icon )
00075 {
00076
00077
setView(
standardView( caption, text, icon,
this ) );
00078 }
00079
00080 QVBox *
KPassivePopup::standardView(
const QString& caption,
00081
const QString& text,
00082
const QPixmap& icon,
00083
QWidget *parent )
00084 {
00085
QVBox *vb =
new QVBox( parent ? parent :
this );
00086 vb->setSpacing( KDialog::spacingHint() );
00087
00088
QHBox *hb=0;
00089
if ( !icon.isNull() ) {
00090 hb =
new QHBox( vb );
00091 hb->setMargin( 0 );
00092 hb->setSpacing( KDialog::spacingHint() );
00093 ttlIcon =
new QLabel( hb,
"title_icon" );
00094 ttlIcon->setPixmap( icon );
00095 ttlIcon->setAlignment( AlignLeft );
00096 }
00097
00098
if ( !caption.isEmpty() ) {
00099 ttl =
new QLabel( caption, hb ? hb : vb,
"title_label" );
00100
QFont fnt = ttl->font();
00101 fnt.setBold(
true );
00102 ttl->setFont( fnt );
00103 ttl->setAlignment( Qt::AlignHCenter );
00104
if ( hb )
00105 hb->setStretchFactor( ttl, 10 );
00106 }
00107
00108
if ( !text.isEmpty() ) {
00109 msg =
new QLabel( text, vb,
"msg_label" );
00110 msg->setAlignment( AlignLeft );
00111 }
00112
00113
return vb;
00114 }
00115
00116 void KPassivePopup::setView(
const QString &caption,
const QString &text )
00117 {
00118
setView( caption, text,
QPixmap() );
00119 }
00120
00121 void KPassivePopup::setTimeout(
int delay )
00122 {
00123 hideDelay = delay;
00124
if( hideTimer->isActive() )
00125 hideTimer->changeInterval( delay );
00126 }
00127
00128 void KPassivePopup::setAutoDelete(
bool autoDelete )
00129 {
00130 m_autoDelete = autoDelete;
00131 }
00132
00133 void KPassivePopup::mouseReleaseEvent(
QMouseEvent *e )
00134 {
00135 emit
clicked();
00136 emit
clicked( e->pos() );
00137 }
00138
00139
00140
00141
00142
00143 void KPassivePopup::show()
00144 {
00145
if ( size() != sizeHint() )
00146 resize( sizeHint() );
00147
00148
positionSelf();
00149 QFrame::show();
00150
00151
int delay = hideDelay;
00152
if ( delay < 0 )
00153 delay = DEFAULT_POPUP_TIME;
00154
00155
if ( delay > 0 ) {
00156 hideTimer->start( delay );
00157 }
00158 }
00159
00160 void KPassivePopup::hideEvent(
QHideEvent * )
00161 {
00162 hideTimer->stop();
00163
if ( m_autoDelete )
00164 deleteLater();
00165 }
00166
00167 QRect KPassivePopup::defaultArea()
const
00168
{
00169
#ifdef Q_WS_X11
00170
NETRootInfo info( qt_xdisplay(),
00171 NET::NumberOfDesktops |
00172 NET::CurrentDesktop |
00173 NET::WorkArea,
00174 -1,
false );
00175 info.
activate();
00176
NETRect workArea = info.
workArea( info.
currentDesktop() );
00177
QRect r;
00178 r.setRect( workArea.
pos.
x, workArea.
pos.
y, 0, 0 );
00179
#else
00180
00181
QRect r;
00182 r.setRect( 100, 100, 200, 200 );
00183
#endif
00184
return r;
00185 }
00186
00187 void KPassivePopup::positionSelf()
00188 {
00189
QRect target;
00190
00191
#ifdef Q_WS_X11
00192
if ( !window ) {
00193 target =
defaultArea();
00194 }
00195
00196
else {
00197
NETWinInfo ni( qt_xdisplay(), window, qt_xrootwin(),
00198 NET::WMIconGeometry | NET::WMKDESystemTrayWinFor );
00199
00200
00201
00202
if ( ni.
kdeSystemTrayWinFor() ) {
00203
NETRect frame, win;
00204 ni.
kdeGeometry( frame, win );
00205 target.setRect( win.
pos.
x, win.
pos.
y,
00206 win.
size.
width, win.
size.
height );
00207 }
00208
else if ( ni.
state() & NET::SkipTaskbar ) {
00209 target =
defaultArea();
00210 }
00211
else {
00212
NETRect r = ni.
iconGeometry();
00213 target.setRect( r.
pos.
x, r.
pos.
y, r.
size.
width, r.
size.
height );
00214
if ( target.isNull() ) {
00215
NETRect dummy;
00216 ni.
kdeGeometry( dummy, r );
00217 target.setRect( r.
pos.
x, r.
pos.
y,
00218 r.
size.
width, r.
size.
height);
00219 }
00220 }
00221 }
00222
#else
00223
target =
defaultArea();
00224
#endif
00225
moveNear( target );
00226 }
00227
00228 void KPassivePopup::moveNear(
QRect target )
00229 {
00230
QPoint pos = target.topLeft();
00231
int x = pos.x();
00232
int y = pos.y();
00233
int w = width();
00234
int h = height();
00235
00236
QRect r = KGlobalSettings::desktopGeometry(
QPoint(x+w/2,y+h/2));
00237
00238
if ( x < ( r.width() / 2 ) )
00239 x = x + target.width();
00240
else
00241 x = x - w;
00242
00243
00244
if ( (y + h) > r.height() )
00245 y = r.height() - h;
00246
00247
if ( (x + w) > r.width() )
00248 x = r.width() - w;
00249
00250
if ( y < 0 )
00251 y = 0;
00252
00253
if ( x < 0 )
00254 x = 0;
00255
00256 move( x, y );
00257 }
00258
00259
00260
00261
00262
00263 KPassivePopup *
KPassivePopup::message(
const QString &caption,
const QString &text,
00264
const QPixmap &icon,
00265
QWidget *parent,
const char *name,
int timeout )
00266 {
00267
KPassivePopup *pop =
new KPassivePopup( parent, name );
00268 pop->
setAutoDelete(
true );
00269 pop->
setView( caption, text, icon );
00270 pop->
hideDelay = timeout;
00271 pop->
show();
00272
00273
return pop;
00274 }
00275
00276 KPassivePopup *
KPassivePopup::message(
const QString &text,
QWidget *parent,
const char *name )
00277 {
00278
return message( QString::null, text,
QPixmap(), parent, name );
00279 }
00280
00281 KPassivePopup *
KPassivePopup::message(
const QString &caption,
const QString &text,
00282
QWidget *parent,
const char *name )
00283 {
00284
return message( caption, text,
QPixmap(), parent, name );
00285 }
00286
00287 KPassivePopup *
KPassivePopup::message(
const QString &caption,
const QString &text,
00288
const QPixmap &icon, WId parent,
const char *name,
int timeout )
00289 {
00290
KPassivePopup *pop =
new KPassivePopup( parent, name );
00291 pop->
setAutoDelete(
true );
00292 pop->
setView( caption, text, icon );
00293 pop->
hideDelay = timeout;
00294 pop->
show();
00295
00296
return pop;
00297 }
00298
00299
00300
00301
00302
00303