File indexing completed on 2024-06-16 04:56:15

0001 /*  keycacheoverlay.cpp
0002 
0003     This file is part of Kleopatra, the KDE keymanager
0004     SPDX-FileCopyrightText: 2016 Bundesamt für Sicherheit in der Informationstechnik
0005     SPDX-FileContributor: Intevation GmbH
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "keycacheoverlay.h"
0011 
0012 #include <Libkleo/KeyCache>
0013 
0014 #include "kleopatra_debug.h"
0015 #include "waitwidget.h"
0016 
0017 #include <KLocalizedString>
0018 #include <QEvent>
0019 #include <QVBoxLayout>
0020 
0021 using namespace Kleo;
0022 
0023 KeyCacheOverlay::KeyCacheOverlay(QWidget *baseWidget, QWidget *parent)
0024     : QWidget(parent)
0025     , mBaseWidget(baseWidget)
0026 {
0027     const auto cache = KeyCache::instance();
0028 
0029     if (cache->initialized()) {
0030         // Cache initialized so we are not needed.
0031         deleteLater();
0032         return;
0033     }
0034 
0035     auto vLay = new QVBoxLayout(this);
0036 
0037     auto waitWidget = new WaitWidget(this);
0038 
0039     waitWidget->setText(i18n("Loading certificate cache..."));
0040 
0041     vLay->addWidget(waitWidget);
0042 
0043     mBaseWidget->installEventFilter(this);
0044     mBaseWidget->setEnabled(false);
0045     reposition();
0046 
0047     connect(&mTimer, &QTimer::timeout, this, [this]() {
0048         // To avoid an infinite show if we miss the keyListingDone signal
0049         // (Race potential) we use a watchdog timer, too to actively poll
0050         // the keycache every second. See bug #381910
0051         if (KeyCache::instance()->initialized()) {
0052             qCDebug(KLEOPATRA_LOG) << "Hiding overlay from watchdog";
0053             hideOverlay();
0054         }
0055     });
0056 
0057     mTimer.start(1000);
0058 
0059     connect(cache.get(), &KeyCache::keyListingDone, this, &KeyCacheOverlay::hideOverlay);
0060 }
0061 
0062 bool KeyCacheOverlay::eventFilter(QObject *object, QEvent *event)
0063 {
0064     if (object == mBaseWidget
0065         && (event->type() == QEvent::Move || event->type() == QEvent::Resize || event->type() == QEvent::Show || event->type() == QEvent::Hide)) {
0066         reposition();
0067     }
0068     return QWidget::eventFilter(object, event);
0069 }
0070 
0071 void KeyCacheOverlay::reposition()
0072 {
0073     if (parentWidget() != mBaseWidget->window()) {
0074         setParent(mBaseWidget->window());
0075     }
0076     if (!KeyCache::instance()->initialized()) {
0077         show();
0078     }
0079 
0080     const QPoint topLevelPos = mBaseWidget->mapTo(window(), QPoint(0, 0));
0081     const QPoint parentPos = parentWidget()->mapFrom(window(), topLevelPos);
0082     move(parentPos);
0083 
0084     resize(mBaseWidget->size());
0085 }
0086 
0087 void KeyCacheOverlay::hideOverlay()
0088 {
0089     mTimer.stop();
0090     mBaseWidget->setEnabled(true);
0091     hide();
0092     mBaseWidget->removeEventFilter(this);
0093     deleteLater();
0094 }
0095 
0096 #include "moc_keycacheoverlay.cpp"