Add a tooltip to the tray icon
[quassel.git] / src / qtui / systraynotificationbackend.cpp
index 7a8f993..721ee07 100644 (file)
@@ -31,7 +31,8 @@
 #include "systemtray.h"
 
 SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent)
-  : AbstractNotificationBackend(parent)
+  : AbstractNotificationBackend(parent),
+  _blockActivation(false)
 {
   NotificationSettings notificationSettings;
   _showBubble = notificationSettings.value("Systray/ShowBubble", true).toBool();
@@ -43,6 +44,10 @@ SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent)
   connect(QtUi::mainWindow()->systemTray(), SIGNAL(messageClicked()), SLOT(notificationActivated()));
   connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(SystemTray::ActivationReason)),
                                             SLOT(notificationActivated(SystemTray::ActivationReason)));
+
+  QApplication::instance()->installEventFilter(this);
+
+  updateToolTip();
 }
 
 void SystrayNotificationBackend::notify(const Notification &notification) {
@@ -55,6 +60,8 @@ void SystrayNotificationBackend::notify(const Notification &notification) {
 
   if(_animate)
     QtUi::mainWindow()->systemTray()->setAlert(true);
+
+  updateToolTip();
 }
 
 void SystrayNotificationBackend::close(uint notificationId) {
@@ -70,6 +77,8 @@ void SystrayNotificationBackend::close(uint notificationId) {
 
   if(!_notifications.count())
     QtUi::mainWindow()->systemTray()->setAlert(false);
+
+  updateToolTip();
 }
 
 void SystrayNotificationBackend::showBubble() {
@@ -91,10 +100,13 @@ void SystrayNotificationBackend::closeBubble() {
 }
 
 void SystrayNotificationBackend::notificationActivated() {
-  if(QtUi::mainWindow()->systemTray()->isAlerted()) {
-    QtUi::mainWindow()->systemTray()->setInhibitActivation();
-    uint id = _notifications.count()? _notifications.last().notificationId : 0;
-    emit activated(id);
+  if(!_blockActivation) {
+    if(QtUi::mainWindow()->systemTray()->isAlerted()) {
+      _blockActivation = true; // prevent double activation because both tray icon and bubble might send a signal
+      uint id = _notifications.count()? _notifications.last().notificationId : 0;
+      emit activated(id);
+    } else
+      GraphicalUi::toggleMainWidget();
   }
 }
 
@@ -104,6 +116,14 @@ void SystrayNotificationBackend::notificationActivated(SystemTray::ActivationRea
   }
 }
 
+// moving the mouse or releasing the button means that we're not dealing with a double activation
+bool SystrayNotificationBackend::eventFilter(QObject *obj, QEvent *event) {
+  if(event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonRelease) {
+    _blockActivation = false;
+  }
+  return AbstractNotificationBackend::eventFilter(obj, event);
+}
+
 void SystrayNotificationBackend::showBubbleChanged(const QVariant &v) {
   _showBubble = v.toBool();
 }
@@ -112,6 +132,11 @@ void SystrayNotificationBackend::animateChanged(const QVariant &v) {
   _animate = v.toBool();
 }
 
+void SystrayNotificationBackend::updateToolTip() {
+  QtUi::mainWindow()->systemTray()->setToolTip("Quassel IRC",
+                                               _notifications.count()? tr("%n pending highlights", "", _notifications.count()) : QString());
+}
+
 SettingsPage *SystrayNotificationBackend::createConfigWidget() const {
   return new ConfigWidget();
 }