20 #include "erroroverlay_p.h"
21 #include "ui_erroroverlay.h"
22 #include "selftestdialog_p.h"
26 #include <KLocalizedString>
28 #include <QtCore/QEvent>
31 using namespace Akonadi;
35 class ErrorOverlayStatic
38 QVector<QPair<QPointer<QWidget>, QPointer<QWidget> > > baseWidgets;
41 K_GLOBAL_STATIC(ErrorOverlayStatic, sInstanceOverlay)
43 static
bool isParentOf(QObject *o1, QObject *o2)
51 return isParentOf(o1, o2->parent());
55 : QWidget(parent ? parent : baseWidget->window())
56 , mBaseWidget(baseWidget)
57 , mOverlayActive(false)
58 , mBaseWidgetIsParent(false)
63 mBaseWidgetIsParent = isParentOf(mBaseWidget,
this);
66 for (QVector<QPair< QPointer<QWidget>, QPointer<QWidget> > >::Iterator it = sInstanceOverlay->baseWidgets.begin();
67 it != sInstanceOverlay->baseWidgets.end();) {
68 if ((*it).first == 0 || (*it).second == 0) {
70 it = sInstanceOverlay->baseWidgets.erase(it);
73 if (isParentOf((*it).first, baseWidget)) {
80 if (isParentOf(baseWidget, (*it).first)) {
83 it = sInstanceOverlay->baseWidgets.erase(it);
88 sInstanceOverlay->baseWidgets.append(qMakePair(mBaseWidget, QPointer<QWidget>(
this)));
90 connect(baseWidget, SIGNAL(destroyed()), SLOT(deleteLater()));
91 mPreviousState = mBaseWidget->isEnabled();
94 ui->notRunningIcon->setPixmap(KIcon(QLatin1String(
"akonadi")).pixmap(64));
95 ui->brokenIcon->setPixmap(KIcon(QString::fromLatin1(
"dialog-error")).pixmap(64));
96 ui->progressIcon->setPixmap(KIcon(QLatin1String(
"akonadi")).pixmap(32));
97 ui->quitButton->setText(KStandardGuiItem::quit().text());
98 ui->detailsQuitButton->setText(KStandardGuiItem::quit().text());
100 #ifndef KDEPIM_MOBILE_UI
101 ui->quitButton->hide();
102 ui->detailsQuitButton->hide();
105 connect(ui->startButton, SIGNAL(clicked()), SLOT(startClicked()));
106 connect(ui->quitButton, SIGNAL(clicked()), SLOT(quitClicked()));
107 connect(ui->detailsQuitButton, SIGNAL(clicked()), SLOT(quitClicked()));
108 connect(ui->selfTestButton, SIGNAL(clicked()), SLOT(selfTestClicked()));
112 serverStateChanged(state);
117 QPalette p = palette();
118 p.setColor(backgroundRole(), QColor(0, 0, 0, 128));
119 p.setColor(foregroundRole(), Qt::white);
121 setAutoFillBackground(
true);
123 mBaseWidget->installEventFilter(
this);
128 ErrorOverlay::~ ErrorOverlay()
130 if (mBaseWidget && !mBaseWidgetIsParent) {
131 mBaseWidget->setEnabled(mPreviousState);
135 void ErrorOverlay::reposition()
143 if (parentWidget() != mBaseWidget->window()) {
144 setParent(mBaseWidget->window());
149 if (!mBaseWidget->isVisible()) {
153 if (mOverlayActive) {
158 const QPoint topLevelPos = mBaseWidget->mapTo(window(), QPoint(0, 0));
159 const QPoint parentPos = parentWidget()->mapFrom(window(), topLevelPos);
164 resize(mBaseWidget->size());
167 bool ErrorOverlay::eventFilter(QObject *
object, QEvent *event)
169 if (
object == mBaseWidget && mOverlayActive &&
170 (event->type() == QEvent::Move ||
event->type() == QEvent::Resize ||
171 event->type() == QEvent::Show ||
event->type() == QEvent::Hide ||
172 event->type() == QEvent::ParentChange)) {
175 return QWidget::eventFilter(
object, event);
178 void ErrorOverlay::startClicked()
182 serverStateChanged(state);
188 void ErrorOverlay::quitClicked()
193 void ErrorOverlay::selfTestClicked()
206 mOverlayActive =
false;
208 if (!mBaseWidgetIsParent) {
209 mBaseWidget->setEnabled(mPreviousState);
211 }
else if (!mOverlayActive) {
212 mOverlayActive =
true;
213 if (mBaseWidget->isVisible()) {
217 if (!mBaseWidgetIsParent) {
218 mPreviousState = mBaseWidget->isEnabled();
219 mBaseWidget->setEnabled(
false);
225 if (mOverlayActive) {
228 ui->stackWidget->setCurrentWidget(ui->notRunningPage);
231 ui->stackWidget->setCurrentWidget(ui->brokenPage);
234 ui->progressPage->setToolTip(i18n(
"Personal information management service is starting..."));
235 ui->progressDescription->setText(i18n(
"Personal information management service is starting..."));
236 ui->stackWidget->setCurrentWidget(ui->progressPage);
239 ui->progressPage->setToolTip(i18n(
"Personal information management service is shutting down..."));
240 ui->progressDescription->setText(i18n(
"Personal information management service is shutting down..."));
241 ui->stackWidget->setCurrentWidget(ui->progressPage);
244 ui->progressPage->setToolTip(i18n(
"Personal information management service is performing a database upgrade."));
245 ui->progressDescription->setText(i18n(
"Personal information management service is performing a database upgrade.\n"
246 "This happens after a software update and is necessary to optimize performance.\n"
247 "Depending on the amount of personal information, this might take a few minutes."));
248 ui->stackWidget->setCurrentWidget(ui->progressPage);
258 #include "moc_erroroverlay_p.cpp"
static ServerManager * self()
Returns the singleton instance of this class, for connecting to its signals.
ErrorOverlay(QWidget *baseWidget, QWidget *parent=0)
Create an overlay widget for baseWidget.
static State state()
Returns the state of the server.
Server is performing a database upgrade as part of a new startup.
Server is not running, could be no one started it yet or it failed to start.
static bool start()
Starts the server.
Server was started but is not yet running.
Server is running and operational.
State
Enum for the various states the server can be in.
A dialog that checks the current status of the Akonadi system.
Server is not operational and an error has been detected.