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"