Rework tray icon activation behavior yet again
[quassel.git] / src / qtui / knotificationbackend.cpp
index 4e13796..e261eac 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),
-  _lastNotificationId(0)
+: AbstractNotificationBackend(parent)
 {
-  connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
-                                            SLOT(notificationActivated(QSystemTrayIcon::ActivationReason)));
+  connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(SystemTray::ActivationReason)),
+                                            SLOT(notificationActivated(SystemTray::ActivationReason)));
 }
 
 void KNotificationBackend::notify(const Notification &n) {
@@ -60,61 +57,52 @@ 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] = _lastNotificationId = 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) {
-  QHash<KNotification *, uint>::iterator i = _notificationIds.begin();
-  while(i != _notificationIds.end()) {
-    if(i.value() == notificationId)
-      i = _notificationIds.erase(i);
-    else
+  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;
   }
-  if(_lastNotificationId == notificationId)
-    _lastNotificationId = 0;
 }
 
 void KNotificationBackend::close(uint notificationId) {
   removeNotificationById(notificationId);
-  if(!_notificationIds.count())
+  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();
 
   notificationActivated(id);
 }
 
-void KNotificationBackend::notificationActivated(QSystemTrayIcon::ActivationReason reason) {
-  if(reason == QSystemTrayIcon::Trigger && _lastNotificationId > 0) {
-    notificationActivated(_lastNotificationId); // most recent one
+void KNotificationBackend::notificationActivated(SystemTray::ActivationReason reason) {
+  if(reason == SystemTray::Trigger) {
+    if( _notifications.count())
+      notificationActivated(_notifications.first().first); // oldest one
+    else
+      GraphicalUi::toggleMainWidget();
   }
 }
 
 void KNotificationBackend::notificationActivated(uint notificationId) {
-  removeNotificationById(notificationId);
-
-  QtUi::mainWindow()->systemTray()->setInhibitActivation();
   emit activated(notificationId);
-
-  if(!_notificationIds.count())
-    QtUi::mainWindow()->systemTray()->setAlert(false);
-
-}
-
-void KNotificationBackend::notificationClosed() {
-  //KNotification *n = qobject_cast<KNotification *>(sender());
-  //if(n && _notificationIds.contains(n))
-  //  _notificationIds.remove(n);
 }
 
 SettingsPage *KNotificationBackend::createConfigWidget() const {