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