d07edf104a409485506bdfc3ca98e8a533c6f32b
[quassel.git] / src / qtui / systemtray.h
1 /***************************************************************************
2  *   Copyright (C) 2005-2018 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This file is free software; you can redistribute it and/or modify     *
6  *   it under the terms of the GNU Library General Public License (LGPL)   *
7  *   as published by the Free Software Foundation; either version 2 of the *
8  *   License, or (at your option) any later version.                       *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
19  ***************************************************************************/
20
21 #pragma once
22
23 #include <QObject>
24 #include <QString>
25
26 class Action;
27 class QMenu;
28
29 class SystemTray : public QObject
30 {
31     Q_OBJECT
32     Q_ENUMS(State Mode MessageIcon ActivationReason)
33
34 public:
35     enum State {
36         Passive,
37         Active,
38         NeedsAttention
39     };
40
41     enum Mode {
42         Invalid,
43         Legacy,
44         StatusNotifier
45     };
46
47     // same as in QSystemTrayIcon
48     enum MessageIcon {
49         NoIcon,
50         Information,
51         Warning,
52         Critical
53     };
54
55     // same as in QSystemTrayIcon
56     enum ActivationReason {
57         Unknown,
58         Context,
59         DoubleClick,
60         Trigger,
61         MiddleClick
62     };
63
64     explicit SystemTray(QWidget *parent);
65     ~SystemTray() override;
66
67     Mode mode() const;
68     State state() const;
69     bool isVisible() const;
70     bool isAlerted() const;
71
72     virtual bool isSystemTrayAvailable() const;
73
74     QWidget *associatedWidget() const;
75
76 public slots:
77     void setVisible(bool visible = true);
78     void setState(State);
79     void setAlert(bool alerted);
80
81     void setToolTip(const QString &title, const QString &subtitle);
82     virtual void showMessage(const QString &title, const QString &message, MessageIcon icon = Information, int msTimeout = 10000, uint notificationId = 0);
83     virtual void closeMessage(uint notificationId);
84
85 signals:
86     void modeChanged(Mode mode);
87     void stateChanged(State state);
88     void visibilityChanged(bool isVisible);
89
90     void activated(SystemTray::ActivationReason);
91     void iconChanged(const QIcon &icon);
92     void animationEnabledChanged(bool);
93     void toolTipChanged(const QString &title, const QString &subtitle);
94     void messageClicked(uint notificationId);
95     void messageClosed(uint notificationId);
96
97 protected slots:
98     virtual void activate(SystemTray::ActivationReason = Trigger);
99
100 protected:
101     void setMode(Mode mode);
102     bool animationEnabled() const;
103
104     QString toolTipTitle() const;
105     QString toolTipSubTitle() const;
106     QMenu *trayMenu() const;
107
108     QString iconName(State state) const;
109
110 private slots:
111     void minimizeRestore();
112     void trayMenuAboutToShow();
113     void enableAnimationChanged(const QVariant &);
114     void invertTrayIconChanged(const QVariant &);
115
116 private:
117     bool _isVisible{false};
118     Mode _mode{Mode::Invalid};
119     State _state{State::Passive};
120     bool _animationEnabled{true};
121     bool _trayIconInverted{false};
122
123     QString _toolTipTitle, _toolTipSubTitle;
124
125     QMenu *_trayMenu{nullptr};
126     QWidget *_associatedWidget{nullptr};
127     Action *_minimizeRestoreAction{nullptr};
128 };