Revert "Change application entry in indicator menu to behave like system tray icon"
[quassel.git] / src / qtui / indicatornotificationbackend.cpp
index 0637004..fabe20c 100644 (file)
 #include "indicatornotificationbackend.h"
 
 #include <qindicateserver.h>
-#include <qindicateindicatormessage.h>
+#include <qindicateindicator.h>
 
+#include "client.h"
 #include "clientsettings.h"
 #include "mainwin.h"
+#include "networkmodel.h"
 #include "qtui.h"
 
-class Indicator : public QIndicate::IndicatorMessage {
+#define STR(x) #x
+#define XSTR(x) STR(x)
+
+class Indicator : public QIndicate::Indicator {
 public:
   uint lastNotificationId;
 };
@@ -36,13 +41,15 @@ IndicatorNotificationBackend::IndicatorNotificationBackend(QObject *parent)
   : AbstractNotificationBackend(parent)
 {
   NotificationSettings notificationSettings;
-  _enabled = notificationSettings.value("Indicator/Enabled", true).toBool();
+  _enabled = notificationSettings.value("Indicator/Enabled", false).toBool();
 
   notificationSettings.notify("Indicator/Enabled", this, SLOT(enabledChanged(const QVariant &)));
 
   _server = QIndicate::Server::defaultInstance();
-  _server->setType("message.im");
-  _server->setDesktopFile(DESKTOP_FILE);
+  _server->setType("message.irc");
+  _server->setDesktopFile(XSTR(DESKTOP_FILE));
+  connect(_server, SIGNAL(serverDisplay()), QtUi::mainWindow(), SLOT(forceActivated()));
+
   if (_enabled) {
     _server->show();
   }
@@ -59,15 +66,37 @@ void IndicatorNotificationBackend::notify(const Notification &notification) {
   if (notification.type != Highlight && notification.type != PrivMsg) {
     return;
   }
-  Indicator *indicator = _indicatorHash.value(notification.bufferId);
+  BufferId bufferId = notification.bufferId;
+  Indicator *indicator = _indicatorHash.value(bufferId);
   if(!indicator) {
     indicator = new Indicator;
-    _indicatorHash.insert(notification.bufferId, indicator);
+    _indicatorHash.insert(bufferId, indicator);
+    connect(indicator, SIGNAL(display(QIndicate::Indicator*)),
+      SLOT(indicatorDisplayed(QIndicate::Indicator*)));
   }
   indicator->lastNotificationId = notification.notificationId;
-  indicator->setProperty("sender", notification.sender);
-  indicator->setProperty("time", QTime::currentTime());
-  qDebug() << "FIXME icon";
+
+  BufferInfo::Type type = Client::networkModel()->bufferType(bufferId);
+  QString name;
+  if (type == BufferInfo::QueryBuffer) {
+    name = notification.sender;
+  } else {
+    name = QString("%1 (%2)")
+      .arg(Client::networkModel()->bufferName(bufferId))
+      .arg(notification.sender);
+  }
+  indicator->setNameProperty(name);
+
+  indicator->setTimeProperty(QDateTime::currentDateTime());
+
+  QModelIndex index = Client::networkModel()->bufferIndex(bufferId);
+  QVariant icon = QtUi::style()->bufferViewItemData(index, Qt::DecorationRole);
+  if (icon.canConvert<QPixmap>()) {
+    QImage image = icon.value<QPixmap>().toImage();
+    indicator->setIconProperty(image);
+  }
+
+  indicator->setDrawAttentionProperty(true);
   indicator->show();
 }
 
@@ -103,6 +132,11 @@ void IndicatorNotificationBackend::enabledChanged(const QVariant &v) {
   }
 }
 
+void IndicatorNotificationBackend::indicatorDisplayed(QIndicate::Indicator *_indicator) {
+  Indicator *indicator = static_cast<Indicator *>(_indicator);
+  emit activated(indicator->lastNotificationId);
+}
+
 SettingsPage *IndicatorNotificationBackend::createConfigWidget() const {
   return new ConfigWidget();
 }