20 #include "erroroverlay_p.h"
21 #include "ui_erroroverlay.h"
22 #include "selftestdialog_p.h"
28 #include <QtCore/QEvent>
29 #include <QtGui/QBoxLayout>
30 #include <QtGui/QLabel>
31 #include <QtGui/QPalette>
33 using namespace Akonadi;
37 class ErrorOverlayStatic
40 QVector<QPair<QPointer<QWidget>, QPointer<QWidget> > > baseWidgets;
43 K_GLOBAL_STATIC( ErrorOverlayStatic, sInstanceOverlay )
45 static
bool isParentOf( QObject* o1, QObject* o2 )
51 return isParentOf( o1, o2->parent() );
54 ErrorOverlay::ErrorOverlay( QWidget *baseWidget, QWidget * parent ) :
55 QWidget( parent ? parent : baseWidget->window() ),
56 mBaseWidget( baseWidget ),
57 mBaseWidgetIsParent( false ),
58 ui( new Ui::ErrorOverlay )
60 Q_ASSERT( baseWidget );
62 mBaseWidgetIsParent = isParentOf( mBaseWidget,
this );
65 for ( QVector<QPair< QPointer<QWidget>, QPointer<QWidget> > >::Iterator it = sInstanceOverlay->baseWidgets.begin();
66 it != sInstanceOverlay->baseWidgets.end(); ) {
67 if ( (*it).first == 0 || (*it).second == 0 ) {
69 it = sInstanceOverlay->baseWidgets.erase( it );
72 if ( isParentOf( (*it).first, baseWidget ) ) {
79 if ( isParentOf( baseWidget, (*it).first ) ) {
82 it = sInstanceOverlay->baseWidgets.erase( it );
87 sInstanceOverlay->baseWidgets.append( qMakePair( mBaseWidget, QPointer<QWidget>(
this ) ) );
89 connect( baseWidget, SIGNAL(destroyed()), SLOT(deleteLater()) );
90 mPreviousState = mBaseWidget->isEnabled();
93 ui->notRunningIcon->setPixmap( KIcon( QLatin1String(
"akonadi" ) ).pixmap( 64 ) );
94 ui->brokenIcon->setPixmap( KIcon( QString::fromLatin1(
"dialog-error" ) ).pixmap( 64 ) );
95 ui->progressIcon->setPixmap( KIcon( QLatin1String(
"akonadi" ) ).pixmap( 32 ) );
96 ui->quitButton->setText( KStandardGuiItem::quit().text() );
97 ui->detailsQuitButton->setText( KStandardGuiItem::quit().text() );
99 #ifndef KDEPIM_MOBILE_UI
100 ui->quitButton->hide();
101 ui->detailsQuitButton->hide();
104 connect( ui->startButton, SIGNAL(clicked()), SLOT(startClicked()) );
105 connect( ui->quitButton, SIGNAL(clicked()), SLOT(quitClicked()) );
106 connect( ui->detailsQuitButton, SIGNAL(clicked()), SLOT(quitClicked()) );
107 connect( ui->selfTestButton, SIGNAL(clicked()), SLOT(selfTestClicked()) );
109 const ServerManager::State state = ServerManager::state();
110 mOverlayActive = state == ServerManager::Running;
111 serverStateChanged( state );
112 connect( ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)),
113 SLOT(serverStateChanged(Akonadi::ServerManager::State)) );
115 QPalette p = palette();
116 p.setColor( backgroundRole(), QColor( 0, 0, 0, 128 ) );
117 p.setColor( foregroundRole(), Qt::white );
119 setAutoFillBackground(
true );
121 mBaseWidget->installEventFilter(
this );
126 ErrorOverlay::~ ErrorOverlay()
128 if ( mBaseWidget && !mBaseWidgetIsParent )
129 mBaseWidget->setEnabled( mPreviousState );
132 void ErrorOverlay::reposition()
139 if ( parentWidget() != mBaseWidget->window() )
140 setParent( mBaseWidget->window() );
144 if ( !mBaseWidget->isVisible() ) {
148 if ( mOverlayActive )
152 const QPoint topLevelPos = mBaseWidget->mapTo( window(), QPoint( 0, 0 ) );
153 const QPoint parentPos = parentWidget()->mapFrom( window(), topLevelPos );
158 resize( mBaseWidget->size() );
161 bool ErrorOverlay::eventFilter(QObject *
object, QEvent * event)
163 if (
object == mBaseWidget && mOverlayActive &&
164 ( event->type() == QEvent::Move ||
event->type() == QEvent::Resize ||
165 event->type() == QEvent::Show ||
event->type() == QEvent::Hide ||
166 event->type() == QEvent::ParentChange ) ) {
169 return QWidget::eventFilter(
object, event );
172 void ErrorOverlay::startClicked()
174 ServerManager::start();
177 void ErrorOverlay::quitClicked()
182 void ErrorOverlay::selfTestClicked()
188 void ErrorOverlay::serverStateChanged( ServerManager::State state )
193 if ( state == ServerManager::Running && mOverlayActive ) {
194 mOverlayActive =
false;
196 if ( !mBaseWidgetIsParent )
197 mBaseWidget->setEnabled( mPreviousState );
198 }
else if ( !mOverlayActive ) {
199 mOverlayActive =
true;
200 if ( mBaseWidget->isVisible() )
203 if ( !mBaseWidgetIsParent ) {
204 mPreviousState = mBaseWidget->isEnabled();
205 mBaseWidget->setEnabled(
false );
211 if ( mOverlayActive ) {
213 case ServerManager::NotRunning:
214 ui->stackWidget->setCurrentWidget( ui->notRunningPage );
216 case ServerManager::Broken:
217 ui->stackWidget->setCurrentWidget( ui->brokenPage );
219 case ServerManager::Starting:
220 ui->progressPage->setToolTip( i18n(
"Personal information management service is starting..." ) );
221 ui->progressDescription->setText( i18n(
"Personal information management service is starting..." ) );
222 ui->stackWidget->setCurrentWidget( ui->progressPage );
224 case ServerManager::Stopping:
225 ui->progressPage->setToolTip( i18n(
"Personal information management service is shutting down..." ) );
226 ui->progressDescription->setText( i18n(
"Personal information management service is shutting down..." ) );
227 ui->stackWidget->setCurrentWidget( ui->progressPage );
229 case ServerManager::Running:
237 #include "erroroverlay_p.moc"