1 /*
2 * SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5 */
6
7 #include "NotifierItem.h"
8 #include <KLocalizedString>
9 #include <QDebug>
10 #include <QMenu>
11
sniStatus(DiscoverNotifier::State state)12 KStatusNotifierItem::ItemStatus sniStatus(DiscoverNotifier::State state)
13 {
14 switch (state) {
15 case DiscoverNotifier::Offline:
16 case DiscoverNotifier::NoUpdates:
17 return KStatusNotifierItem::Passive;
18 case DiscoverNotifier::Busy:
19 case DiscoverNotifier::NormalUpdates:
20 case DiscoverNotifier::SecurityUpdates:
21 case DiscoverNotifier::RebootRequired:
22 return KStatusNotifierItem::Active;
23 }
24 return KStatusNotifierItem::Active;
25 }
26
NotifierItem()27 NotifierItem::NotifierItem()
28 {
29 }
30
setupNotifierItem()31 void NotifierItem::setupNotifierItem()
32 {
33 Q_ASSERT(!m_item);
34 m_item = new KStatusNotifierItem(QStringLiteral("org.kde.DiscoverNotifier"), this);
35 m_item->setTitle(i18n("Updates"));
36 m_item->setToolTipTitle(i18n("Updates"));
37
38 connect(&m_notifier, &DiscoverNotifier::stateChanged, this, &NotifierItem::refresh);
39
40 connect(m_item, &KStatusNotifierItem::activateRequested, &m_notifier, [this]() {
41 if (m_notifier.needsReboot()) {
42 m_notifier.reboot();
43 } else {
44 m_notifier.showDiscoverUpdates(m_item->providedToken());
45 }
46 });
47
48 QMenu *menu = new QMenu;
49 connect(m_item, &QObject::destroyed, menu, &QObject::deleteLater);
50 auto discoverAction = menu->addAction(QIcon::fromTheme(QStringLiteral("plasmadiscover")), i18n("Open Discover…"));
51 connect(discoverAction, &QAction::triggered, &m_notifier, [this] {
52 m_notifier.showDiscover(m_item->providedToken());
53 });
54
55 auto updatesAction = menu->addAction(QIcon::fromTheme(QStringLiteral("system-software-update")), i18n("See Updates…"));
56 connect(updatesAction, &QAction::triggered, &m_notifier, [this] {
57 m_notifier.showDiscoverUpdates(m_item->providedToken());
58 });
59
60 auto refreshAction = menu->addAction(QIcon::fromTheme(QStringLiteral("view-refresh")), i18n("Refresh…"));
61 connect(refreshAction, &QAction::triggered, &m_notifier, &DiscoverNotifier::recheckSystemUpdateNeeded);
62
63 auto f = [this]() {
64 m_item->setTitle(i18n("Restart to apply installed updates"));
65 m_item->setToolTipTitle(i18n("Click to restart the device"));
66 m_item->setIconByName(QStringLiteral("view-refresh"));
67 };
68 if (m_notifier.needsReboot())
69 f();
70 else
71 connect(&m_notifier, &DiscoverNotifier::needsRebootChanged, menu, f);
72
73 connect(&m_notifier, &DiscoverNotifier::newUpgradeAction, menu, [menu](UpgradeAction *a) {
74 QAction *action = new QAction(a->description(), menu);
75 connect(action, &QAction::triggered, a, &UpgradeAction::trigger);
76 menu->addAction(action);
77 });
78 m_item->setContextMenu(menu);
79 refresh();
80 }
81
refresh()82 void NotifierItem::refresh()
83 {
84 Q_ASSERT(m_item);
85 m_item->setStatus(sniStatus(m_notifier.state()));
86 m_item->setIconByName(m_notifier.iconName());
87 m_item->setToolTipSubTitle(m_notifier.message());
88 }
89
setVisible(bool visible)90 void NotifierItem::setVisible(bool visible)
91 {
92 if (visible == m_visible)
93 return;
94 m_visible = visible;
95
96 if (m_visible)
97 setupNotifierItem();
98 else
99 delete m_item;
100 }
101