/ src / qt / notificator.h
notificator.h
 1  // Copyright (c) 2011-present The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #ifndef BITCOIN_QT_NOTIFICATOR_H
 6  #define BITCOIN_QT_NOTIFICATOR_H
 7  
 8  #include <bitcoin-build-config.h> // IWYU pragma: keep
 9  
10  #include <QIcon>
11  #include <QObject>
12  
13  QT_BEGIN_NAMESPACE
14  class QSystemTrayIcon;
15  
16  #ifdef USE_DBUS
17  class QDBusInterface;
18  #endif
19  QT_END_NAMESPACE
20  
21  /** Cross-platform desktop notification client. */
22  class Notificator: public QObject
23  {
24      Q_OBJECT
25  
26  public:
27      /** Create a new notificator.
28         @note Ownership of trayIcon is not transferred to this object.
29      */
30      Notificator(const QString &programName, QSystemTrayIcon *trayIcon, QWidget *parent);
31      ~Notificator();
32  
33      // Message class
34      enum Class
35      {
36          Information,    /**< Informational message */
37          Warning,        /**< Notify user of potential problem */
38          Critical        /**< An error occurred */
39      };
40  
41  public Q_SLOTS:
42      /** Show notification message.
43         @param[in] cls    general message class
44         @param[in] title  title shown with message
45         @param[in] text   message content
46         @param[in] icon   optional icon to show with message
47         @param[in] millisTimeout notification timeout in milliseconds (defaults to 10 seconds)
48         @note Platform implementations are free to ignore any of the provided fields except for \a text.
49       */
50      void notify(Class cls, const QString &title, const QString &text,
51                  const QIcon &icon = QIcon(), int millisTimeout = 10000);
52  
53  private:
54      QWidget *parent;
55      enum Mode {
56          None,                       /**< Ignore informational notifications, and show a modal pop-up dialog for Critical notifications. */
57          Freedesktop,                /**< Use DBus org.freedesktop.Notifications */
58          QSystemTray,                /**< Use QSystemTrayIcon::showMessage() */
59          UserNotificationCenter      /**< Use the 10.8+ User Notification Center (Mac only) */
60      };
61      QString programName;
62      Mode mode{None};
63      QSystemTrayIcon *trayIcon;
64  #ifdef USE_DBUS
65      QDBusInterface* interface{nullptr};
66  
67      void notifyDBus(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout);
68  #endif
69      void notifySystray(Class cls, const QString &title, const QString &text, int millisTimeout);
70  #ifdef Q_OS_MACOS
71      void notifyMacUserNotificationCenter(const QString &title, const QString &text);
72  #endif
73  };
74  
75  #endif // BITCOIN_QT_NOTIFICATOR_H