Qt Utilities  5.12.0
Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models
dbusnotification.h
Go to the documentation of this file.
1 #ifndef MISC_UTILS_NOTIFICATION_H
2 #define MISC_UTILS_NOTIFICATION_H
3 
4 #include "../global.h"
5 
6 #include <QObject>
7 #include <QSet>
8 #include <QVariantMap>
9 
10 #include <functional>
11 
12 QT_FORWARD_DECLARE_CLASS(QDBusPendingCallWatcher)
13 
14 class OrgFreedesktopNotificationsInterface;
15 
16 namespace MiscUtils {
17 
19 
21 
22 class QT_UTILITIES_EXPORT DBusNotification : public QObject {
23  Q_OBJECT
24  Q_PROPERTY(QString title READ title WRITE setTitle)
25  Q_PROPERTY(QString message READ message WRITE setMessage)
26  Q_PROPERTY(QString icon READ icon WRITE setIcon)
27  Q_PROPERTY(int timeout READ timeout WRITE setTimeout)
28  Q_PROPERTY(QStringList actions READ actions WRITE setActions)
29  Q_PROPERTY(bool visible READ isVisible)
30 
31 public:
32  class QT_UTILITIES_EXPORT Capabilities : public QSet<QString> {
33  public:
34  explicit Capabilities();
35  explicit Capabilities(const QStringList &capabilities);
36  bool isValid() const;
37  bool supportsBody() const;
38  bool supportsLinks() const;
39  bool supportsMarkup() const;
40  bool supportsImages() const;
41  bool supportsIcon() const;
42  bool supportsActions() const;
43  bool supportsAnimatedIcon() const;
44  bool supportsActionIcons() const;
45  bool supportsSound() const;
46  bool supportsPercistence() const;
47 
48  private:
49  bool m_valid;
50  };
51 
52  explicit DBusNotification(
53  const QString &title, NotificationIcon icon = NotificationIcon::Information, int timeout = 10000, QObject *parent = nullptr);
54  explicit DBusNotification(const QString &title, const QString &icon, int timeout = 10000, QObject *parent = nullptr);
56 
57  static bool isAvailable();
58  const QString &title() const;
59  void setTitle(const QString &title);
60  const QString &message() const;
61  void setMessage(const QString &message);
62  const QString &icon() const;
63  void setIcon(const QString &icon);
64  void setIcon(NotificationIcon icon);
65  const QImage image() const;
66  void setImage(const QImage &image);
67  const QString imagePath() const;
68  void setImagePath(const QString &imagePath);
69  int timeout() const;
70  void setTimeout(int timeout);
71  const QStringList &actions() const;
72  void setActions(const QStringList &actions);
73  const QVariantMap &hints() const;
74  QVariantMap &hints();
75  QVariant hint(const QString &name) const;
76  QVariant hint(const QString &name, const QString &fallbackNames...) const;
77  bool isVisible() const;
78  void deleteOnCloseOrError();
79  static bool queryCapabilities(const std::function<void(Capabilities &&capabilities)> &callback);
80 
81 public Q_SLOTS:
82  bool show();
83  bool show(const QString &message);
84  bool update(const QString &line);
85  void hide();
86 
87 Q_SIGNALS:
89  void shown();
91  void error();
93  void closed(NotificationCloseReason reason);
95  void actionInvoked(const QString &action);
96 
97 private Q_SLOTS:
98  void handleNotifyResult(QDBusPendingCallWatcher *);
99  static void handleNotificationClosed(uint id, uint reason);
100  static void handleActionInvoked(uint id, const QString &action);
101 
102 private:
103  static void initInterface();
104 
105  uint m_id;
106  QDBusPendingCallWatcher *m_watcher;
107  QString m_title;
108  QString m_msg;
109  QString m_icon;
110  int m_timeout;
111  QStringList m_actions;
112  QVariantMap m_hints;
113  static OrgFreedesktopNotificationsInterface *s_dbusInterface;
114 };
115 
117  : m_valid(false)
118 {
119 }
120 
121 inline DBusNotification::Capabilities::Capabilities(const QStringList &capabilities)
122  : QSet<QString>(capabilities.toSet())
123  , m_valid(true)
124 {
125 }
126 
128 {
129  return m_valid;
130 }
131 
133 {
134  return contains(QStringLiteral("body"));
135 }
136 
138 {
139  return contains(QStringLiteral("body-hyperlinks"));
140 }
141 
143 {
144  return contains(QStringLiteral("body-markup"));
145 }
146 
148 {
149  return contains(QStringLiteral("body-images"));
150 }
151 
153 {
154  return contains(QStringLiteral("icon-static")) || supportsAnimatedIcon();
155 }
156 
158 {
159  return contains(QStringLiteral("actions"));
160 }
161 
163 {
164  return contains(QStringLiteral("icon-multi"));
165 }
166 
168 {
169  return contains(QStringLiteral("action-icons"));
170 }
171 
173 {
174  return contains(QStringLiteral("sound"));
175 }
176 
178 {
179  return contains(QStringLiteral("persistence"));
180 }
181 
182 inline const QString &DBusNotification::title() const
183 {
184  return m_title;
185 }
186 
187 inline void DBusNotification::setTitle(const QString &title)
188 {
189  m_title = title;
190 }
191 
192 inline const QString &DBusNotification::message() const
193 {
194  return m_msg;
195 }
196 
197 inline void DBusNotification::setMessage(const QString &message)
198 {
199  m_msg = message;
200 }
201 
206 inline const QString &DBusNotification::icon() const
207 {
208  return m_icon;
209 }
210 
217 inline void DBusNotification::setIcon(const QString &icon)
218 {
219  m_icon = icon;
220 }
221 
225 inline QVariant DBusNotification::hint(const QString &name) const
226 {
227  return m_hints[name];
228 }
229 
233 inline QVariant DBusNotification::hint(const QString &name, const QString &fallbackNames...) const
234 {
235  const auto variant(m_hints[name]);
236  return variant.isNull() ? this->hint(fallbackNames) : variant;
237 }
238 
243 inline const QString DBusNotification::imagePath() const
244 {
245  return hint(QStringLiteral("image-data"), QStringLiteral("image_path")).toString();
246 }
247 
253 inline void DBusNotification::setImagePath(const QString &imagePath)
254 {
255  m_hints[QStringLiteral("image-path")] = imagePath;
256 }
257 
258 inline int DBusNotification::timeout() const
259 {
260  return m_timeout;
261 }
262 
264 {
265  m_timeout = timeout;
266 }
267 
278 inline const QStringList &DBusNotification::actions() const
279 {
280  return m_actions;
281 }
282 
287 inline void DBusNotification::setActions(const QStringList &actions)
288 {
289  m_actions = actions;
290 }
291 
292 inline const QVariantMap &DBusNotification::hints() const
293 {
294  return m_hints;
295 }
296 
297 inline QVariantMap &DBusNotification::hints()
298 {
299  return m_hints;
300 }
301 
302 inline bool DBusNotification::isVisible() const
303 {
304  return m_id != 0;
305 }
306 } // namespace MiscUtils
307 
308 #endif // MISC_UTILS_NOTIFICATION_H
void setIcon(const QString &icon)
Sets the icon name.
void setActions(const QStringList &actions)
Sets the actions for the notification.
const QString & title() const
const QString imagePath() const
Returns the image path.
void setMessage(const QString &message)
Sets the message to be shown.
QVariant hint(const QString &name) const
Returns the hint with the specified name.
#define QT_UTILITIES_EXPORT
Marks the symbol to be exported by the qtutilities library.
bool isVisible() const
Returns whether the notification is (still) visible.
void setTitle(const QString &title)
void setTimeout(int timeout)
Sets the number of milliseconds the notification will be visible after calling show().
const QStringList & actions() const
const QVariantMap & hints() const
The DBusNotification class emits D-Bus notifications.
void setImagePath(const QString &imagePath)
Sets the image path.
const QString & icon() const
const QString & message() const