Argument error in desktop notification message.
[quassel.git] / src / qtui / mainwin.cpp
index c1af8b0..7d22ac6 100644 (file)
@@ -50,6 +50,7 @@
 #include "selectionmodelsynchronizer.h"
 #include "mappedselectionmodel.h"
 
+#include "settingspages/aliasessettingspage.h"
 #include "settingspages/appearancesettingspage.h"
 #include "settingspages/bufferviewsettingspage.h"
 #include "settingspages/colorsettingspage.h"
 #include "global.h"
 #include "qtuistyle.h"
 
+#include "desktopnotifications.h"
+
 
 MainWin::MainWin(QtUi *_gui, QWidget *parent)
   : QMainWindow(parent),
     gui(_gui),
+    coreLagLabel(new QLabel()),
     sslLabel(new QLabel()),
     _titleSetter(this),
     systray(new QSystemTrayIcon(this)),
@@ -78,7 +82,12 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent)
     timer(new QTimer(this)),
     channelListDlg(new ChannelListDlg(this)),
     settingsDlg(new SettingsDlg(this)),
-    debugConsole(new DebugConsole(this))
+    debugConsole(new DebugConsole(this)),
+       desktopNotifications(new org::freedesktop::Notifications(
+               "org.freedesktop.Notifications",
+               "/org/freedesktop/Notifications",
+               QDBusConnection::sessionBus(), this)),
+       notificationId(0)
 {
   UiSettings uiSettings;
   loadTranslation(uiSettings.value("Locale", QLocale::system()).value<QLocale>());
@@ -99,6 +108,14 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent)
 
   installEventFilter(new JumpKeyHandler(this));
 
+  UiSettings uiSettings;
+  QString style = uiSettings.value("Style", QString("")).toString();
+  if(style != "") {
+    QApplication::setStyle(style);
+  }
+
+  connect(desktopNotifications, SIGNAL(NotificationClosed(uint, uint)), this, SLOT(desktopNotificationClosed(uint, uint)));
+  connect(desktopNotifications, SIGNAL(ActionInvoked(uint, const QString&)), this, SLOT(desktopNotificationInvoked(uint, const QString&)));
 }
 
 void MainWin::init() {
@@ -232,6 +249,7 @@ void MainWin::setupSettingsDlg() {
   //Category: Behaviour
   settingsDlg->registerSettingsPage(new GeneralSettingsPage(settingsDlg));
   settingsDlg->registerSettingsPage(new HighlightSettingsPage(settingsDlg));
+  settingsDlg->registerSettingsPage(new AliasesSettingsPage(settingsDlg));
   //Category: General
   settingsDlg->registerSettingsPage(new IdentitiesSettingsPage(settingsDlg));
   settingsDlg->registerSettingsPage(new NetworksSettingsPage(settingsDlg));
@@ -332,6 +350,12 @@ void MainWin::setupTopicWidget() {
 }
 
 void MainWin::setupStatusBar() {
+  // Core Lag:
+  updateLagIndicator(0);
+  statusBar()->addPermanentWidget(coreLagLabel);
+  connect(Client::signalProxy(), SIGNAL(lagUpdated(int)), this, SLOT(updateLagIndicator(int)));
+
+  // SSL indicator
   connect(Client::instance(), SIGNAL(securedConnection()), this, SLOT(securedConnection()));
   sslLabel->setPixmap(QPixmap());
   statusBar()->addPermanentWidget(sslLabel);
@@ -406,7 +430,7 @@ void MainWin::connectedToCore() {
   connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int)));
   connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int)));
   connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout()));
-  
+
   foreach(BufferInfo id, Client::allBufferInfos()) {
     Client::backlogManager()->requestBacklog(id.bufferId(), 500, -1);
   }
@@ -440,6 +464,11 @@ void MainWin::saveLayout() {
   if(accountId > 0) s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId));
 }
 
+void MainWin::updateLagIndicator(int lag) {
+  coreLagLabel->setText(QString("Core Lag: %1 msec").arg(lag));
+}
+
+
 void MainWin::securedConnection() {
   // todo: make status bar entry
   sslLabel->setPixmap(QPixmap::fromImage(QImage(":/16x16/status/ssl")));
@@ -580,10 +609,13 @@ void MainWin::receiveMessage(const Message &msg) {
     UiSettings uiSettings;
 
 #ifndef SPUTDEV
-    if(uiSettings.value("DisplayPopupMessages", QVariant(true)).toBool()) {
+       bool displayBubble = uiSettings.value("NotificationBubble", QVariant(true)).toBool();
+       bool displayDesktop = uiSettings.value("NotificationDesktop", QVariant(true)).toBool();
+    if(displayBubble || displayDesktop) {
       // FIXME don't invoke style engine for this!
       QString text = QtUi::style()->styleString(Message::mircToInternal(msg.contents())).plainText;
-      displayTrayIconMessage(title, text);
+         if (displayBubble) displayTrayIconMessage(title, text);
+         if (displayDesktop) sendDesktopNotification(title, text);
     }
 #endif
     if(uiSettings.value("AnimateTrayIcon", QVariant(true)).toBool()) {
@@ -599,6 +631,59 @@ bool MainWin::event(QEvent *event) {
   return QMainWindow::event(event);
 }
 
+
+/*
+Using the notification-daemon from Freedesktop's Galago project
+http://www.galago-project.org/specs/notification/0.9/x408.html#command-notify
+*/
+void MainWin::sendDesktopNotification(const QString &title, const QString &message)
+{
+       QStringList actions;
+       QMap<QString, QVariant> hints;
+    UiSettings uiSettings;
+
+       hints["x"] = uiSettings.value("NotificationDesktopHintX", QVariant(0)).toInt(); // Standard hint: x location for the popup to show up
+       hints["y"] = uiSettings.value("NotificationDesktopHintY", QVariant(0)).toInt(); // Standard hint: y location for the popup to show up
+
+       actions << "click" << "Click Me!";
+
+       QDBusReply<uint> reply = desktopNotifications->Notify(
+               "Quassel", // Application name
+               notificationId, // ID of previous notification to replace
+               "", // Icon to display
+               title, // Summary / Header of the message to display
+               QString("%1: %2:\n%3").arg(QTime::currentTime().toString()).arg(title).arg(message), // Body of the message to display
+               actions, // Actions from which the user may choose
+               hints, // Hints to the server displaying the message
+               uiSettings.value("NotificationDesktopTimeout", QVariant(5000)).toInt() // Timeout in milliseconds
+       );
+
+       if (!reply.isValid())
+       {
+               /* ERROR */
+               qDebug() << "Error on sending notification...";
+               return;
+       }
+
+       notificationId = reply.value();
+
+       qDebug() << "ID: " << notificationId << " Time: " << QTime::currentTime().toString();
+}
+
+
+void MainWin::desktopNotificationClosed(uint id, uint reason)
+{
+       qDebug() << "OID: " << notificationId << " ID: " << id << " Reason: " << reason << " Time: " << QTime::currentTime().toString();
+       notificationId = 0;
+}
+
+
+void MainWin::desktopNotificationInvoked(uint id, const QString & action)
+{
+       qDebug() << "OID: " << notificationId << " ID: " << id << " Action: " << action << " Time: " << QTime::currentTime().toString();
+}
+
+
 void MainWin::displayTrayIconMessage(const QString &title, const QString &message) {
   systray->showMessage(title, message);
 }