SystemTray refactoring in preparation of supporting StatusNotifier
[quassel.git] / src / qtui / knotificationbackend.cpp
index d1db774..d3939df 100644 (file)
@@ -1,28 +1,27 @@
 /***************************************************************************
-*   Copyright (C) 2005-09 by the Quassel Project                          *
-*   devel@quassel-irc.org                                                 *
-*                                                                         *
-*   This program is free software; you can redistribute it and/or modify  *
-*   it under the terms of the GNU General Public License as published by  *
-*   the Free Software Foundation; either version 2 of the License, or     *
-*   (at your option) version 3.                                           *
-*                                                                         *
-*   This program is distributed in the hope that it will be useful,       *
-*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
-*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
-*   GNU General Public License for more details.                          *
-*                                                                         *
-*   You should have received a copy of the GNU General Public License     *
-*   along with this program; if not, write to the                         *
-*   Free Software Foundation, Inc.,                                       *
-*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
-***************************************************************************/
-
-#include <QVBoxLayout>
+ *   Copyright (C) 2005-2010 by the Quassel Project                        *
+ *   devel@quassel-irc.org                                                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) version 3.                                           *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
 
 #include <KNotification>
 #include <KNotifyConfigWidget>
 #include <QTextDocument>
+#include <QVBoxLayout>
 
 #include "knotificationbackend.h"
 
 #include "iconloader.h"
 #include "networkmodel.h"
 #include "qtui.h"
-#include "systemtray.h"
-
-KNotificationBackend::KNotificationBackend(QObject *parent) : AbstractNotificationBackend(parent) {
 
+KNotificationBackend::KNotificationBackend(QObject *parent)
+: AbstractNotificationBackend(parent)
+{
+  connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(SystemTray::ActivationReason)),
+                                            SLOT(notificationActivated(SystemTray::ActivationReason)));
 }
 
 void KNotificationBackend::notify(const Notification &n) {
@@ -56,31 +57,51 @@ void KNotificationBackend::notify(const Notification &n) {
                                |KNotification::CloseWhenWidgetActivated
                                |KNotification::CloseOnTimeout);
   connect(notification, SIGNAL(activated(uint)), SLOT(notificationActivated()));
-  connect(notification, SIGNAL(closed()), SLOT(notificationClosed()));
   notification->setActions(QStringList("View"));
-  _notificationIds[notification] = n.notificationId;
+  notification->setProperty("notificationId", n.notificationId);
+
+  _notifications.append(qMakePair(n.notificationId, QPointer<KNotification>(notification)));
 
   QtUi::mainWindow()->systemTray()->setAlert(true);
 }
 
+void KNotificationBackend::removeNotificationById(uint notificationId) {
+  QList<QPair<uint, QPointer<KNotification> > >::iterator i = _notifications.begin();
+  while(i != _notifications.end()) {
+    if(i->first == notificationId) {
+      if(i->second)
+        i->second->close();
+      i = _notifications.erase(i);
+    } else
+      ++i;
+  }
+}
+
 void KNotificationBackend::close(uint notificationId) {
-  Q_UNUSED(notificationId);
-  QtUi::mainWindow()->systemTray()->setAlert(false);
+  removeNotificationById(notificationId);
+  if(!_notifications.count())
+    QtUi::mainWindow()->systemTray()->setAlert(false);
 }
 
 void KNotificationBackend::notificationActivated() {
   uint id = 0;
   KNotification *n = qobject_cast<KNotification *>(sender());
-  if(n && _notificationIds.contains(n))
-    id = _notificationIds.value(n);
+  if(n)
+    id = n->property("notificationId").toUInt();
 
-  emit activated(id);
+  notificationActivated(id);
 }
 
-void KNotificationBackend::notificationClosed() {
-  KNotification *n = qobject_cast<KNotification *>(sender());
-  if(n && _notificationIds.contains(n))
-    _notificationIds.remove(n);
+void KNotificationBackend::notificationActivated(SystemTray::ActivationReason reason) {
+  if(reason == SystemTray::Trigger && _notifications.count()) {
+    notificationActivated(_notifications.first().first); // oldest one
+  }
+}
+
+void KNotificationBackend::notificationActivated(uint notificationId) {
+  QtUi::mainWindow()->systemTray()->setInhibitActivation();
+  emit activated(notificationId);
+
 }
 
 SettingsPage *KNotificationBackend::createConfigWidget() const {