File indexing completed on 2024-04-28 05:26:47
0001 /* 0002 * SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "NotifierItem.h" 0008 #include "updatessettings.h" 0009 #include <KLocalizedString> 0010 #include <QDebug> 0011 #include <QMenu> 0012 0013 NotifierItem::NotifierItem() 0014 { 0015 connect(&m_notifier, &DiscoverNotifier::stateChanged, this, &NotifierItem::refreshStatusNotifierVisibility); 0016 } 0017 0018 void NotifierItem::setupNotifierItem() 0019 { 0020 Q_ASSERT(!m_item); 0021 m_item = new KStatusNotifierItem(QStringLiteral("org.kde.DiscoverNotifier"), this); 0022 m_item->setTitle(i18n("Updates")); 0023 m_item->setToolTipTitle(i18n("Updates")); 0024 0025 connect(m_item, &KStatusNotifierItem::activateRequested, &m_notifier, [this]() { 0026 if (m_notifier.needsReboot()) { 0027 m_notifier.reboot(); 0028 } else { 0029 m_notifier.showDiscoverUpdates(m_item->providedToken()); 0030 } 0031 }); 0032 0033 QMenu *menu = new QMenu; 0034 connect(m_item, &QObject::destroyed, menu, &QObject::deleteLater); 0035 auto discoverAction = menu->addAction(QIcon::fromTheme(QStringLiteral("plasmadiscover")), i18n("Open Discover…")); 0036 connect(discoverAction, &QAction::triggered, &m_notifier, [this] { 0037 m_notifier.showDiscover(m_item->providedToken()); 0038 }); 0039 0040 auto updatesAction = menu->addAction(QIcon::fromTheme(QStringLiteral("system-software-update")), i18n("See Updates…")); 0041 connect(updatesAction, &QAction::triggered, &m_notifier, [this] { 0042 m_notifier.showDiscoverUpdates(m_item->providedToken()); 0043 }); 0044 0045 auto refreshAction = menu->addAction(QIcon::fromTheme(QStringLiteral("view-refresh")), i18n("Refresh…")); 0046 connect(refreshAction, &QAction::triggered, &m_notifier, &DiscoverNotifier::recheckSystemUpdateNeeded); 0047 0048 auto f = [this]() { 0049 m_item->setTitle(i18n("Restart to apply installed updates")); 0050 m_item->setToolTipTitle(i18n("Click to restart the device")); 0051 m_item->setIconByName(QStringLiteral("view-refresh")); 0052 }; 0053 if (m_notifier.needsReboot()) 0054 f(); 0055 else 0056 connect(&m_notifier, &DiscoverNotifier::needsRebootChanged, menu, f); 0057 0058 connect(&m_notifier, &DiscoverNotifier::newUpgradeAction, menu, [menu](UpgradeAction *a) { 0059 QAction *action = new QAction(a->description(), menu); 0060 connect(action, &QAction::triggered, a, &UpgradeAction::trigger); 0061 menu->addAction(action); 0062 }); 0063 m_item->setContextMenu(menu); 0064 m_item->setStatus(KStatusNotifierItem::Active); 0065 refresh(); 0066 } 0067 0068 void NotifierItem::refreshStatusNotifierVisibility() 0069 { 0070 bool shouldShow = shouldShowStatusNotifier(); 0071 if (!m_item && shouldShow) { 0072 setStatusNotifierVisibility(true); 0073 } else if (m_item && !shouldShow) { 0074 setStatusNotifierVisibility(false); 0075 } 0076 refresh(); 0077 } 0078 0079 void NotifierItem::setStatusNotifierEnabled(bool enabled) 0080 { 0081 m_statusNotifierEnabled = enabled; 0082 refreshStatusNotifierVisibility(); 0083 } 0084 0085 void NotifierItem::refresh() 0086 { 0087 if (!m_item) { 0088 return; 0089 } 0090 m_item->setIconByName(m_notifier.iconName()); 0091 m_item->setToolTipSubTitle(m_notifier.message()); 0092 } 0093 0094 void NotifierItem::setStatusNotifierVisibility(bool visible) 0095 { 0096 if (visible) { 0097 Q_ASSERT(!m_item); 0098 setupNotifierItem(); 0099 } else { 0100 Q_ASSERT(m_item); 0101 delete m_item; 0102 } 0103 } 0104 0105 bool NotifierItem::shouldShowStatusNotifier() const 0106 { 0107 if (!isStatusNotifierEnabled()) { 0108 return false; 0109 } 0110 0111 // Only show the status notifier if there is something to notify about 0112 // BUG: 413053 0113 switch (m_notifier.state()) { 0114 case DiscoverNotifier::Busy: 0115 case DiscoverNotifier::RebootRequired: 0116 return true; 0117 case DiscoverNotifier::NormalUpdates: 0118 case DiscoverNotifier::SecurityUpdates: 0119 return m_notifier.settings()->requiredNotificationInterval() > 0; 0120 case DiscoverNotifier::Offline: 0121 case DiscoverNotifier::NoUpdates: 0122 default: 0123 return false; 0124 } 0125 }