qtui: Make the debug log a proper dialog
[quassel.git] / src / qtui / statusnotifieritem.h
1 /***************************************************************************
2  *   Copyright (C) 2005-2018 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This contains code from KStatusNotifierItem, part of the KDE libs     *
6  *   Copyright (C) 2009 Marco Martin <notmart@gmail.com>                   *
7  *                                                                         *
8  *   This file is free software; you can redistribute it and/or modify     *
9  *   it under the terms of the GNU Library General Public License (LGPL)   *
10  *   as published by the Free Software Foundation; either version 2 of the *
11  *   License, or (at your option) any later version.                       *
12  *                                                                         *
13  *   This program is distributed in the hope that it will be useful,       *
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
16  *   GNU General Public License for more details.                          *
17  *                                                                         *
18  *   You should have received a copy of the GNU General Public License     *
19  *   along with this program; if not, write to the                         *
20  *   Free Software Foundation, Inc.,                                       *
21  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
22  ***************************************************************************/
23
24 #pragma once
25
26 #ifdef HAVE_DBUS
27
28 #include <QDBusError>
29 #include <QHash>
30 #include <QString>
31
32 #if QT_VERSION >= 0x050000
33 #  include <QTemporaryDir>
34 #endif
35
36 #include "notificationsclient.h"
37 #include "systemtray.h"
38 #include "statusnotifierwatcher.h"
39
40 #ifdef QT_NO_SYSTEMTRAYICON
41 #  define StatusNotifierItemParent SystemTray
42 #else
43 #  define StatusNotifierItemParent LegacySystemTray
44 #  include "legacysystemtray.h"
45 #endif
46
47 class QDBusServiceWatcher;
48
49 class StatusNotifierItemDBus;
50
51 class StatusNotifierItem : public StatusNotifierItemParent
52 {
53     Q_OBJECT
54
55 public:
56     explicit StatusNotifierItem(QWidget *parent);
57
58     bool isSystemTrayAvailable() const override;
59
60 public slots:
61     void showMessage(const QString &title, const QString &message, MessageIcon icon = Information, int msTimeout = 10000, uint notificationId = 0) override;
62     void closeMessage(uint notificationId) override;
63
64 protected:
65     QString title() const;
66     QString iconName() const;
67     QString attentionIconName() const;
68     QString toolTipIconName() const;
69     QString iconThemePath() const;
70     QString menuObjectPath() const;
71
72     bool eventFilter(QObject *watched, QEvent *event) override;
73
74 private slots:
75     void activated(const QPoint &pos);
76     void serviceChange(const QString &name, const QString &oldOwner, const QString &newOwner);
77     void checkForRegisteredHosts();
78     void onDBusError(const QDBusError &error);
79
80     void notificationClosed(uint id, uint reason);
81     void notificationInvoked(uint id, const QString &action);
82
83     void refreshIcons();
84
85     void onModeChanged(Mode mode);
86     void onStateChanged(State state);
87     void onVisibilityChanged(bool isVisible);
88
89 private:
90     void registerToWatcher();
91
92     QDBusServiceWatcher *_serviceWatcher{nullptr};
93     StatusNotifierItemDBus *_statusNotifierItemDBus{nullptr};
94     org::kde::StatusNotifierWatcher *_statusNotifierWatcher{nullptr};
95     org::freedesktop::Notifications *_notificationsClient{nullptr};
96     bool _notificationsClientSupportsMarkup{false};
97     bool _notificationsClientSupportsActions{false};
98     quint32 _lastNotificationsDBusId{0};
99     QHash<uint, uint> _notificationsIdMap; ///< Maps our own notification ID to the D-Bus one
100
101     QString _iconThemePath;
102     QString _menuObjectPath;
103
104 #if QT_VERSION >= 0x050000
105     QTemporaryDir _iconThemeDir;
106 #endif
107
108     friend class StatusNotifierItemDBus;
109 };
110
111 #endif /* HAVE_DBUS */