Line data Source code
1 : // SPDX-FileCopyrightText: 2016 Anne Jan Brouwer
2 : // SPDX-License-Identifier: GPL-3.0-or-later
3 : #include "trayicon.h"
4 : #include <QAction>
5 : #include <QApplication>
6 : #include <QMainWindow>
7 : #include <QMenu>
8 :
9 : #ifdef QT_DEBUG
10 : #include "debughelper.h"
11 : #endif
12 :
13 : /**
14 : * @brief TrayIcon::TrayIcon use a (system) tray icon with a nice QtPass logo on
15 : * it (currently) only Quits.
16 : * @param parent
17 : */
18 0 : TrayIcon::TrayIcon(QMainWindow *parent)
19 0 : : showAction(nullptr), hideAction(nullptr), minimizeAction(nullptr),
20 0 : maximizeAction(nullptr), restoreAction(nullptr), quitAction(nullptr),
21 0 : sysTrayIcon(nullptr), trayIconMenu(nullptr), isAllocated(false) {
22 0 : parentwin = parent;
23 :
24 0 : if (QSystemTrayIcon::isSystemTrayAvailable()) {
25 0 : createActions();
26 0 : createTrayIcon();
27 :
28 0 : sysTrayIcon->setIcon(
29 0 : QIcon::fromTheme("qtpass-tray", QIcon(":/artwork/icon.png")));
30 :
31 0 : sysTrayIcon->show();
32 :
33 0 : QObject::connect(sysTrayIcon, &QSystemTrayIcon::activated, this,
34 0 : &TrayIcon::iconActivated);
35 :
36 0 : isAllocated = true;
37 : }
38 : #ifdef QT_DEBUG
39 : // NOLINTNEXTLINE(readability/braces)
40 : else {
41 : dbg() << "No tray icon for this OS possibly also not show options?";
42 : }
43 : #endif
44 0 : }
45 :
46 : /**
47 : * @brief TrayIcon::setVisible show or hide the icon.
48 : * @param visible
49 : */
50 0 : void TrayIcon::setVisible(bool visible) {
51 0 : if (visible) {
52 0 : parentwin->show();
53 : } else {
54 0 : parentwin->hide();
55 : }
56 0 : }
57 :
58 : /**
59 : * @brief TrayIcon::getIsAllocated return if TrayIcon is allocated
60 : */
61 0 : auto TrayIcon::getIsAllocated() -> bool { return isAllocated; }
62 :
63 : /**
64 : * @brief TrayIcon::createActions setup the signals.
65 : */
66 0 : void TrayIcon::createActions() {
67 0 : showAction = new QAction(tr("&Show"), this);
68 0 : connect(showAction, &QAction::triggered, parentwin, &QWidget::show);
69 0 : hideAction = new QAction(tr("&Hide"), this);
70 0 : connect(hideAction, &QAction::triggered, parentwin, &QWidget::hide);
71 :
72 0 : minimizeAction = new QAction(tr("Mi&nimize"), this);
73 0 : connect(minimizeAction, &QAction::triggered, parentwin,
74 0 : &QWidget::showMinimized);
75 0 : maximizeAction = new QAction(tr("Ma&ximize"), this);
76 0 : connect(maximizeAction, &QAction::triggered, parentwin,
77 0 : &QWidget::showMaximized);
78 0 : restoreAction = new QAction(tr("&Restore"), this);
79 0 : connect(restoreAction, &QAction::triggered, parentwin, &QWidget::showNormal);
80 :
81 0 : quitAction = new QAction(tr("&Quit"), this);
82 : #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
83 : #pragma GCC diagnostic push
84 : #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
85 : #endif
86 0 : connect(quitAction, &QAction::triggered, qApp, &QApplication::quit);
87 : #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
88 : #pragma GCC diagnostic pop
89 : #endif
90 0 : }
91 :
92 : /**
93 : * @brief TrayIcon::createTrayIcon set up menu.
94 : */
95 0 : void TrayIcon::createTrayIcon() {
96 0 : trayIconMenu = new QMenu(this);
97 0 : trayIconMenu->addAction(showAction);
98 0 : trayIconMenu->addAction(hideAction);
99 0 : trayIconMenu->addAction(minimizeAction);
100 0 : trayIconMenu->addAction(maximizeAction);
101 0 : trayIconMenu->addAction(restoreAction);
102 0 : trayIconMenu->addSeparator();
103 0 : trayIconMenu->addAction(quitAction);
104 :
105 0 : sysTrayIcon = new QSystemTrayIcon(this);
106 0 : sysTrayIcon->setContextMenu(trayIconMenu);
107 0 : }
108 :
109 : /**
110 : * @brief TrayIcon::showHideParent toggle app visibility.
111 : */
112 0 : void TrayIcon::showHideParent() {
113 0 : if (parentwin->isVisible()) {
114 0 : parentwin->hide();
115 : } else {
116 0 : parentwin->show();
117 : }
118 0 : }
119 :
120 : /**
121 : * @brief TrayIcon::iconActivated you clicked on the trayicon.
122 : * @param reason
123 : */
124 0 : void TrayIcon::iconActivated(QSystemTrayIcon::ActivationReason reason) {
125 0 : switch (reason) {
126 0 : case QSystemTrayIcon::Trigger:
127 : case QSystemTrayIcon::DoubleClick:
128 0 : showHideParent();
129 0 : break;
130 0 : case QSystemTrayIcon::MiddleClick:
131 0 : showMessage("test", "test msg", 1000);
132 0 : break;
133 0 : default: {
134 : }
135 : }
136 0 : }
137 :
138 : /**
139 : * @brief TrayIcon::showMessage show a systray message for notification.
140 : * @param title
141 : * @param msg
142 : * @param time
143 : */
144 0 : void TrayIcon::showMessage(const QString &title, const QString &msg, int time) {
145 0 : sysTrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, time);
146 0 : }
|