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

akonadi

  • 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 <QPalette>
30 
31 using namespace Akonadi;
32 
33 //@cond PRIVATE
34 
35 class ErrorOverlayStatic
36 {
37  public:
38  QVector<QPair<QPointer<QWidget>, QPointer<QWidget> > > baseWidgets;
39 };
40 
41 K_GLOBAL_STATIC( ErrorOverlayStatic, sInstanceOverlay )
42 
43 static bool isParentOf( QObject* o1, QObject* o2 )
44 {
45  if ( !o1 || !o2 )
46  return false;
47  if ( o1 == o2 )
48  return true;
49  return isParentOf( o1, o2->parent() );
50 }
51 
52 ErrorOverlay::ErrorOverlay( QWidget *baseWidget, QWidget * parent ) :
53  QWidget( parent ? parent : baseWidget->window() ),
54  mBaseWidget( baseWidget ),
55  mOverlayActive( false ),
56  mBaseWidgetIsParent( false ),
57  ui( new Ui::ErrorOverlay )
58 {
59  Q_ASSERT( baseWidget );
60 
61  mBaseWidgetIsParent = isParentOf( mBaseWidget, this );
62 
63  // check existing overlays to detect cascading
64  for ( QVector<QPair< QPointer<QWidget>, QPointer<QWidget> > >::Iterator it = sInstanceOverlay->baseWidgets.begin();
65  it != sInstanceOverlay->baseWidgets.end(); ) {
66  if ( ( *it ).first == 0 || ( *it ).second == 0 ) {
67  // garbage collection
68  it = sInstanceOverlay->baseWidgets.erase( it );
69  continue;
70  }
71  if ( isParentOf( ( *it ).first, baseWidget ) ) {
72  // parent already has an overlay, kill ourselves
73  mBaseWidget = 0;
74  hide();
75  deleteLater();
76  return;
77  }
78  if ( isParentOf( baseWidget, ( *it ).first ) ) {
79  // child already has overlay, kill that one
80  delete ( *it ).second;
81  it = sInstanceOverlay->baseWidgets.erase( it );
82  continue;
83  }
84  ++it;
85  }
86  sInstanceOverlay->baseWidgets.append( qMakePair( mBaseWidget, QPointer<QWidget>( this ) ) );
87 
88  connect( baseWidget, SIGNAL(destroyed()), SLOT(deleteLater()) );
89  mPreviousState = mBaseWidget->isEnabled();
90 
91  ui->setupUi( this );
92  ui->notRunningIcon->setPixmap( KIcon( QLatin1String( "akonadi" ) ).pixmap( 64 ) );
93  ui->brokenIcon->setPixmap( KIcon( QString::fromLatin1( "dialog-error" ) ).pixmap( 64 ) );
94  ui->progressIcon->setPixmap( KIcon( QLatin1String( "akonadi" ) ).pixmap( 32 ) );
95  ui->quitButton->setText( KStandardGuiItem::quit().text() );
96  ui->detailsQuitButton->setText( KStandardGuiItem::quit().text() );
97 
98 #ifndef KDEPIM_MOBILE_UI
99  ui->quitButton->hide();
100  ui->detailsQuitButton->hide();
101 #endif
102 
103  connect( ui->startButton, SIGNAL(clicked()), SLOT(startClicked()) );
104  connect( ui->quitButton, SIGNAL(clicked()), SLOT(quitClicked()) );
105  connect( ui->detailsQuitButton, SIGNAL(clicked()), SLOT(quitClicked()) );
106  connect( ui->selfTestButton, SIGNAL(clicked()), SLOT(selfTestClicked()) );
107 
108  const ServerManager::State state = ServerManager::state();
109  mOverlayActive = (state == ServerManager::Running);
110  serverStateChanged( state );
111 
112  connect( ServerManager::self(), SIGNAL(stateChanged(Akonadi::ServerManager::State)),
113  SLOT(serverStateChanged(Akonadi::ServerManager::State)) );
114 
115  QPalette p = palette();
116  p.setColor( backgroundRole(), QColor( 0, 0, 0, 128 ) );
117  p.setColor( foregroundRole(), Qt::white );
118  setPalette( p );
119  setAutoFillBackground( true );
120 
121  mBaseWidget->installEventFilter( this );
122 
123  reposition();
124 }
125 
126 ErrorOverlay::~ ErrorOverlay()
127 {
128  if ( mBaseWidget && !mBaseWidgetIsParent )
129  mBaseWidget->setEnabled( mPreviousState );
130 }
131 
132 void ErrorOverlay::reposition()
133 {
134  if ( !mBaseWidget )
135  return;
136 
137  // reparent to the current top level widget of the base widget if needed
138  // needed eg. in dock widgets
139  if ( parentWidget() != mBaseWidget->window() )
140  setParent( mBaseWidget->window() );
141 
142  // follow base widget visibility
143  // needed eg. in tab widgets
144  if ( !mBaseWidget->isVisible() ) {
145  hide();
146  return;
147  }
148  if ( mOverlayActive )
149  show();
150 
151  // follow position changes
152  const QPoint topLevelPos = mBaseWidget->mapTo( window(), QPoint( 0, 0 ) );
153  const QPoint parentPos = parentWidget()->mapFrom( window(), topLevelPos );
154  move( parentPos );
155 
156  // follow size changes
157  // TODO: hide/scale icon if we don't have enough space
158  resize( mBaseWidget->size() );
159 }
160 
161 bool ErrorOverlay::eventFilter(QObject * object, QEvent * event)
162 {
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 ) ) {
167  reposition();
168  }
169  return QWidget::eventFilter( object, event );
170 }
171 
172 void ErrorOverlay::startClicked()
173 {
174  const ServerManager::State state = ServerManager::state();
175  if ( state == ServerManager::Running ) {
176  serverStateChanged( state );
177  } else {
178  ServerManager::start();
179  }
180 }
181 
182 void ErrorOverlay::quitClicked()
183 {
184  qApp->quit();
185 }
186 
187 void ErrorOverlay::selfTestClicked()
188 {
189  SelfTestDialog dlg;
190  dlg.exec();
191 }
192 
193 void ErrorOverlay::serverStateChanged( ServerManager::State state )
194 {
195  if ( !mBaseWidget )
196  return;
197 
198  if ( state == ServerManager::Running && mOverlayActive ) {
199  mOverlayActive = false;
200  hide();
201  if ( !mBaseWidgetIsParent )
202  mBaseWidget->setEnabled( mPreviousState );
203  } else if ( !mOverlayActive ) {
204  mOverlayActive = true;
205  if ( mBaseWidget->isVisible() )
206  show();
207 
208  if ( !mBaseWidgetIsParent ) {
209  mPreviousState = mBaseWidget->isEnabled();
210  mBaseWidget->setEnabled( false );
211  }
212 
213  reposition();
214  }
215 
216  if ( mOverlayActive ) {
217  switch ( state ) {
218  case ServerManager::NotRunning:
219  ui->stackWidget->setCurrentWidget( ui->notRunningPage );
220  break;
221  case ServerManager::Broken:
222  ui->stackWidget->setCurrentWidget( ui->brokenPage );
223  break;
224  case ServerManager::Starting:
225  ui->progressPage->setToolTip( i18n( "Personal information management service is starting..." ) );
226  ui->progressDescription->setText( i18n( "Personal information management service is starting..." ) );
227  ui->stackWidget->setCurrentWidget( ui->progressPage );
228  break;
229  case ServerManager::Stopping:
230  ui->progressPage->setToolTip( i18n( "Personal information management service is shutting down..." ) );
231  ui->progressDescription->setText( i18n( "Personal information management service is shutting down..." ) );
232  ui->stackWidget->setCurrentWidget( ui->progressPage );
233  break;
234  case ServerManager::Upgrading:
235  ui->progressPage->setToolTip( i18n( "Personal information management service is performing a database upgrade." ) );
236  ui->progressDescription->setText( i18n( "Personal information management service is performing a database upgrade.\n"
237  "This happens after a software update and is necessary to optimize performance.\n"
238  "Depending on the amount of personal information, this might take a few minutes.") );
239  ui->stackWidget->setCurrentWidget( ui->progressPage );
240  break;
241  case ServerManager::Running:
242  break;
243  }
244  }
245 }
246 
247 //@endcond
248 
249 #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:161
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:225
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:166
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 Mon Jul 21 2014 08:03:52 by doxygen 1.8.6 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-4.13.3 API Reference

Skip menu "kdepimlibs-4.13.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
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