• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepimlibs API Reference
  • KDE Home
  • Contact Us
 

akonadi

  • sources
  • kde-4.12
  • kdepimlibs
  • akonadi
erroroverlay.cpp
1 /*
2  Copyright (c) 2008 Volker Krause <vkrause@kde.org>
3 
4  This library is free software; you can redistribute it and/or modify it
5  under the terms of the GNU Library General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or (at your
7  option) any later version.
8 
9  This library is distributed in the hope that it will be useful, but WITHOUT
10  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12  License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to the
16  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  02110-1301, USA.
18 */
19 
20 #include "erroroverlay_p.h"
21 #include "ui_erroroverlay.h"
22 #include "selftestdialog_p.h"
23 
24 #include <KDebug>
25 #include <KIcon>
26 #include <KLocalizedString>
27 
28 #include <QtCore/QEvent>
29 #include <QBoxLayout>
30 #include <QLabel>
31 #include <QPalette>
32 
33 using namespace Akonadi;
34 
35 //@cond PRIVATE
36 
37 class ErrorOverlayStatic
38 {
39  public:
40  QVector<QPair<QPointer<QWidget>, QPointer<QWidget> > > baseWidgets;
41 };
42 
43 K_GLOBAL_STATIC( ErrorOverlayStatic, sInstanceOverlay )
44 
45 static bool isParentOf( QObject* o1, QObject* o2 )
46 {
47  if ( !o1 || !o2 )
48  return false;
49  if ( o1 == o2 )
50  return true;
51  return isParentOf( o1, o2->parent() );
52 }
53 
54 ErrorOverlay::ErrorOverlay( QWidget *baseWidget, QWidget * parent ) :
55  QWidget( parent ? parent : baseWidget->window() ),
56  mBaseWidget( baseWidget ),
57  mBaseWidgetIsParent( false ),
58  ui( new Ui::ErrorOverlay )
59 {
60  Q_ASSERT( baseWidget );
61 
62  mBaseWidgetIsParent = isParentOf( mBaseWidget, this );
63 
64  // check existing overlays to detect cascading
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 ) {
68  // garbage collection
69  it = sInstanceOverlay->baseWidgets.erase( it );
70  continue;
71  }
72  if ( isParentOf( ( *it ).first, baseWidget ) ) {
73  // parent already has an overlay, kill ourselves
74  mBaseWidget = 0;
75  hide();
76  deleteLater();
77  return;
78  }
79  if ( isParentOf( baseWidget, ( *it ).first ) ) {
80  // child already has overlay, kill that one
81  delete ( *it ).second;
82  it = sInstanceOverlay->baseWidgets.erase( it );
83  continue;
84  }
85  ++it;
86  }
87  sInstanceOverlay->baseWidgets.append( qMakePair( mBaseWidget, QPointer<QWidget>( this ) ) );
88 
89  connect( baseWidget, SIGNAL(destroyed()), SLOT(deleteLater()) );
90  mPreviousState = mBaseWidget->isEnabled();
91 
92  ui->setupUi( this );
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() );
98 
99 #ifndef KDEPIM_MOBILE_UI
100  ui->quitButton->hide();
101  ui->detailsQuitButton->hide();
102 #endif
103 
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()) );
108 
109  const ServerManager::State state = ServerManager::state();
110  mOverlayActive = (state == ServerManager::Running);
111  serverStateChanged( state );
112 
113  connect( ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)),
114  SLOT(serverStateChanged(Akonadi::ServerManager::State)) );
115 
116  QPalette p = palette();
117  p.setColor( backgroundRole(), QColor( 0, 0, 0, 128 ) );
118  p.setColor( foregroundRole(), Qt::white );
119  setPalette( p );
120  setAutoFillBackground( true );
121 
122  mBaseWidget->installEventFilter( this );
123 
124  reposition();
125 }
126 
127 ErrorOverlay::~ ErrorOverlay()
128 {
129  if ( mBaseWidget && !mBaseWidgetIsParent )
130  mBaseWidget->setEnabled( mPreviousState );
131 }
132 
133 void ErrorOverlay::reposition()
134 {
135  if ( !mBaseWidget )
136  return;
137 
138  // reparent to the current top level widget of the base widget if needed
139  // needed eg. in dock widgets
140  if ( parentWidget() != mBaseWidget->window() )
141  setParent( mBaseWidget->window() );
142 
143  // follow base widget visibility
144  // needed eg. in tab widgets
145  if ( !mBaseWidget->isVisible() ) {
146  hide();
147  return;
148  }
149  if ( mOverlayActive )
150  show();
151 
152  // follow position changes
153  const QPoint topLevelPos = mBaseWidget->mapTo( window(), QPoint( 0, 0 ) );
154  const QPoint parentPos = parentWidget()->mapFrom( window(), topLevelPos );
155  move( parentPos );
156 
157  // follow size changes
158  // TODO: hide/scale icon if we don't have enough space
159  resize( mBaseWidget->size() );
160 }
161 
162 bool ErrorOverlay::eventFilter(QObject * object, QEvent * event)
163 {
164  if ( object == mBaseWidget && mOverlayActive &&
165  ( event->type() == QEvent::Move || event->type() == QEvent::Resize ||
166  event->type() == QEvent::Show || event->type() == QEvent::Hide ||
167  event->type() == QEvent::ParentChange ) ) {
168  reposition();
169  }
170  return QWidget::eventFilter( object, event );
171 }
172 
173 void ErrorOverlay::startClicked()
174 {
175  const ServerManager::State state = ServerManager::state();
176  if ( state == ServerManager::Running ) {
177  serverStateChanged( state );
178  } else {
179  ServerManager::start();
180  }
181 }
182 
183 void ErrorOverlay::quitClicked()
184 {
185  qApp->quit();
186 }
187 
188 void ErrorOverlay::selfTestClicked()
189 {
190  SelfTestDialog dlg;
191  dlg.exec();
192 }
193 
194 void ErrorOverlay::serverStateChanged( ServerManager::State state )
195 {
196  if ( !mBaseWidget )
197  return;
198 
199  if ( state == ServerManager::Running && mOverlayActive ) {
200  mOverlayActive = false;
201  hide();
202  if ( !mBaseWidgetIsParent )
203  mBaseWidget->setEnabled( mPreviousState );
204  } else if ( !mOverlayActive ) {
205  mOverlayActive = true;
206  if ( mBaseWidget->isVisible() )
207  show();
208 
209  if ( !mBaseWidgetIsParent ) {
210  mPreviousState = mBaseWidget->isEnabled();
211  mBaseWidget->setEnabled( false );
212  }
213 
214  reposition();
215  }
216 
217  if ( mOverlayActive ) {
218  switch ( state ) {
219  case ServerManager::NotRunning:
220  ui->stackWidget->setCurrentWidget( ui->notRunningPage );
221  break;
222  case ServerManager::Broken:
223  ui->stackWidget->setCurrentWidget( ui->brokenPage );
224  break;
225  case ServerManager::Starting:
226  ui->progressPage->setToolTip( i18n( "Personal information management service is starting..." ) );
227  ui->progressDescription->setText( i18n( "Personal information management service is starting..." ) );
228  ui->stackWidget->setCurrentWidget( ui->progressPage );
229  break;
230  case ServerManager::Stopping:
231  ui->progressPage->setToolTip( i18n( "Personal information management service is shutting down..." ) );
232  ui->progressDescription->setText( i18n( "Personal information management service is shutting down..." ) );
233  ui->stackWidget->setCurrentWidget( ui->progressPage );
234  break;
235  case ServerManager::Upgrading:
236  ui->progressPage->setToolTip( i18n( "Personal information management service is performing a database upgrade." ) );
237  ui->progressDescription->setText( i18n( "Personal information management service is performing a database upgrade. "
238  "This happens after a software update and is necessary to optimize performance. "
239  "Depending on the amount of personal information, this might take a few minutes.") );
240  ui->stackWidget->setCurrentWidget( ui->progressPage );
241  break;
242  case ServerManager::Running:
243  break;
244  }
245  }
246 }
247 
248 //@endcond
249 
250 #include "moc_erroroverlay_p.cpp"
Akonadi::ServerManager::self
static ServerManager * self()
Returns the singleton instance of this class, for connecting to its signals.
Definition: servermanager.cpp:152
Akonadi::ErrorOverlay::ErrorOverlay
ErrorOverlay(QWidget *baseWidget, QWidget *parent=0)
Create an overlay widget for baseWidget.
Akonadi::ServerManager::Stopping
Server is shutting down.
Definition: servermanager.h:54
Akonadi::ServerManager::state
static State state()
Returns the state of the server.
Definition: servermanager.cpp:218
Akonadi::ErrorOverlay
Definition: erroroverlay_p.h:43
Akonadi::ServerManager::Upgrading
Server is performing a database upgrade as part of a new startup.
Definition: servermanager.h:56
Akonadi::ServerManager::NotRunning
Server is not running, could be no one started it yet or it failed to start.
Definition: servermanager.h:51
Akonadi::ServerManager::start
static bool start()
Starts the server.
Definition: servermanager.cpp:157
Akonadi::ServerManager::Starting
Server was started but is not yet running.
Definition: servermanager.h:52
Akonadi::ServerManager::Running
Server is running and operational.
Definition: servermanager.h:53
Akonadi::ServerManager::State
State
Enum for the various states the server can be in.
Definition: servermanager.h:50
Akonadi::SelfTestDialog
A dialog that checks the current status of the Akonadi system.
Definition: selftestdialog_p.h:44
Akonadi::ServerManager::Broken
Server is not operational and an error has been detected.
Definition: servermanager.h:55
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:00:27 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi

Skip menu "akonadi"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Modules
  • Related Pages

kdepimlibs API Reference

Skip menu "kdepimlibs API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kldap
  • kmbox
  • kmime
  • kpimidentities
  • kpimtextedit
  • kresources
  • ktnef
  • kxmlrpcclient
  • microblog

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal