00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "waitingoverlay_p.h"
00023
00024 #include <KDebug>
00025 #include <KIcon>
00026 #include <KJob>
00027 #include <KLocale>
00028
00029 #include <QtCore/QEvent>
00030 #include <QtGui/QBoxLayout>
00031 #include <QtGui/QLabel>
00032 #include <QtGui/QPalette>
00033 #include <QtGui/QProgressBar>
00034
00035
00036
00037 WaitingOverlay::WaitingOverlay( KJob *job, QWidget *baseWidget, QWidget * parent )
00038 : QWidget( parent ? parent : baseWidget->window() ),
00039 mBaseWidget( baseWidget )
00040 {
00041 Q_ASSERT( baseWidget );
00042 Q_ASSERT( parentWidget() != baseWidget );
00043
00044 connect( baseWidget, SIGNAL( destroyed() ), SLOT( deleteLater() ) );
00045 connect( job, SIGNAL( result( KJob* ) ), SLOT( deleteLater() ) );
00046 mPreviousState = mBaseWidget->isEnabled();
00047
00048 QBoxLayout *topLayout = new QVBoxLayout( this );
00049 topLayout->addStretch();
00050 mDescription = new QLabel( this );
00051 mDescription->setText( i18n( "<p style=\"color: white;\"><b>Waiting for operation</b><br/></p>" ) );
00052 mDescription->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
00053 topLayout->addWidget( mDescription );
00054 topLayout->addStretch();
00055
00056 QPalette p = palette();
00057 p.setColor( backgroundRole(), QColor( 0, 0, 0, 128 ) );
00058 setPalette( p );
00059 setAutoFillBackground( true );
00060
00061 mBaseWidget->installEventFilter( this );
00062
00063 reposition();
00064 }
00065
00066 WaitingOverlay::~ WaitingOverlay()
00067 {
00068 if ( mBaseWidget )
00069 mBaseWidget->setEnabled( mPreviousState );
00070 }
00071
00072 void WaitingOverlay::reposition()
00073 {
00074 if ( !mBaseWidget )
00075 return;
00076
00077
00078
00079 if ( parentWidget() != mBaseWidget->window() )
00080 setParent( mBaseWidget->window() );
00081
00082
00083
00084 if ( !mBaseWidget->isVisible() ) {
00085 hide();
00086 return;
00087 }
00088 show();
00089
00090
00091 const QPoint topLevelPos = mBaseWidget->mapTo( window(), QPoint( 0, 0 ) );
00092 const QPoint parentPos = parentWidget()->mapFrom( window(), topLevelPos );
00093 move( parentPos );
00094
00095
00096
00097 resize( mBaseWidget->size() );
00098 }
00099
00100 bool WaitingOverlay::eventFilter(QObject * object, QEvent * event)
00101 {
00102 if ( object == mBaseWidget &&
00103 ( event->type() == QEvent::Move || event->type() == QEvent::Resize ||
00104 event->type() == QEvent::Show || event->type() == QEvent::Hide ||
00105 event->type() == QEvent::ParentChange ) ) {
00106 reposition();
00107 }
00108 return QWidget::eventFilter( object, event );
00109 }
00110
00111