qt4-b-gone: Remove all code supporting Qt < 5.5 and KDE4
[quassel.git] / src / qtui / statusnotifieritem.cpp
index f3b462b..f3b362e 100644 (file)
 
 #ifdef HAVE_DBUS
 
+#include "statusnotifieritem.h"
+
 #include <QApplication>
 #include <QDir>
 #include <QFile>
+#include <QIcon>
 #include <QMenu>
 #include <QMouseEvent>
 #include <QTextDocument>
 
+#include "icon.h"
 #include "qtui.h"
 #include "quassel.h"
-#include "statusnotifieritem.h"
 #include "statusnotifieritemdbus.h"
 
 constexpr int kProtocolVersion {0};
@@ -69,9 +72,7 @@ protected:
 
 StatusNotifierItem::StatusNotifierItem(QWidget *parent)
     : StatusNotifierItemParent(parent)
-#if QT_VERSION >= 0x050000
     , _iconThemeDir{QDir::tempPath() + QLatin1String{"/quassel-sni-XXXXXX"}}
-#endif
 {
     static bool registered = []() -> bool {
         qDBusRegisterMetaType<DBusImageStruct>();
@@ -90,30 +91,28 @@ StatusNotifierItem::StatusNotifierItem(QWidget *parent)
     trayMenu()->installEventFilter(this);
 
     // Create a temporary directory that holds copies of the tray icons. That way, visualizers can find our icons.
-    // For Qt4 the relevant icons are installed in hicolor already, so nothing to be done.
-#if QT_VERSION >= 0x050000
     if (_iconThemeDir.isValid()) {
         _iconThemePath = _iconThemeDir.path();
     }
     else {
         qWarning() << "Could not create temporary directory for themed tray icons!";
     }
-#endif
 
-    connect(QtUi::instance(), SIGNAL(iconThemeRefreshed()), this, SLOT(refreshIcons()));
+    connect(this, SIGNAL(iconsChanged()), this, SLOT(refreshIcons()));
     refreshIcons();
 
     // Our own SNI service
     _statusNotifierItemDBus = new StatusNotifierItemDBus(this);
+    connect(this, SIGNAL(currentIconNameChanged()), _statusNotifierItemDBus, SIGNAL(NewIcon()));
+    connect(this, SIGNAL(currentIconNameChanged()), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon()));
     connect(this, SIGNAL(toolTipChanged(QString, QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip()));
-    connect(this, SIGNAL(animationEnabledChanged(bool)), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon()));
 
     // Service watcher to keep track of the StatusNotifierWatcher service
-    QDBusServiceWatcher *watcher = new QDBusServiceWatcher(kSniWatcherService,
-                                                           QDBusConnection::sessionBus(),
-                                                           QDBusServiceWatcher::WatchForOwnerChange,
-                                                           this);
-    connect(watcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), SLOT(serviceChange(QString, QString, QString)));
+    _serviceWatcher = new QDBusServiceWatcher(kSniWatcherService,
+                                              QDBusConnection::sessionBus(),
+                                              QDBusServiceWatcher::WatchForOwnerChange,
+                                              this);
+    connect(_serviceWatcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), SLOT(serviceChange(QString, QString, QString)));
 
     // Client instance for StatusNotifierWatcher
     _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(kSniWatcherService,
@@ -188,15 +187,15 @@ void StatusNotifierItem::onDBusError(const QDBusError &error)
     setMode(Mode::Legacy);
 }
 
+
 void StatusNotifierItem::refreshIcons()
 {
-#if QT_VERSION >= 0x050000
     if (!_iconThemePath.isEmpty()) {
         QDir baseDir{_iconThemePath + "/hicolor"};
         baseDir.removeRecursively();
         for (auto &&trayState : { State::Active, State::Passive, State::NeedsAttention }) {
             auto iconName = SystemTray::iconName(trayState);
-            QIcon icon = QIcon::fromTheme(iconName);
+            QIcon icon = icon::get(iconName);
             if (!icon.isNull()) {
                 for (auto &&size : icon.availableSizes()) {
                     auto pixDir = QString{"%1/%2x%3/status"}.arg(baseDir.absolutePath()).arg(size.width()).arg(size.height());
@@ -218,7 +217,7 @@ void StatusNotifierItem::refreshIcons()
             }
         }
     }
-#endif
+
     if (_statusNotifierItemDBus) {
         emit _statusNotifierItemDBus->NewIcon();
         emit _statusNotifierItemDBus->NewAttentionIcon();
@@ -239,11 +238,11 @@ bool StatusNotifierItem::isSystemTrayAvailable() const
 void StatusNotifierItem::onModeChanged(Mode mode)
 {
     if (mode == Mode::StatusNotifier) {
-        _statusNotifierItemDBus->registerService();
+        _statusNotifierItemDBus->registerTrayIcon();
         registerToWatcher();
     }
     else {
-        _statusNotifierItemDBus->unregisterService();
+        _statusNotifierItemDBus->unregisterTrayIcon();
     }
 }
 
@@ -251,7 +250,6 @@ void StatusNotifierItem::onModeChanged(Mode mode)
 void StatusNotifierItem::onStateChanged(State state)
 {
     if (mode() == Mode::StatusNotifier) {
-        emit _statusNotifierItemDBus->NewIcon();
         emit _statusNotifierItemDBus->NewStatus(metaObject()->enumerator(metaObject()->indexOfEnumerator("State")).valueToKey(state));
     }
 }
@@ -261,11 +259,11 @@ void StatusNotifierItem::onVisibilityChanged(bool isVisible)
 {
     if (mode() == Mode::StatusNotifier) {
         if (isVisible) {
-            _statusNotifierItemDBus->registerService();
+            _statusNotifierItemDBus->registerTrayIcon();
             registerToWatcher();
         }
         else {
-            _statusNotifierItemDBus->unregisterService();
+            _statusNotifierItemDBus->unregisterTrayIcon();
         }
     }
 }
@@ -279,23 +277,13 @@ QString StatusNotifierItem::title() const
 
 QString StatusNotifierItem::iconName() const
 {
-    if (state() == Passive) {
-        return SystemTray::iconName(State::Passive);
-    }
-    else {
-        return SystemTray::iconName(State::Active);
-    }
+    return currentIconName();
 }
 
 
 QString StatusNotifierItem::attentionIconName() const
 {
-    if (animationEnabled()) {
-        return SystemTray::iconName(State::NeedsAttention);
-    }
-    else {
-        return SystemTray::iconName(State::NeedsAttention);
-    }
+    return currentAttentionIconName();
 }
 
 
@@ -327,18 +315,9 @@ void StatusNotifierItem::activated(const QPoint &pos)
 bool StatusNotifierItem::eventFilter(QObject *watched, QEvent *event)
 {
     if (mode() == StatusNotifier) {
-        //FIXME: ugly ugly workaround to weird QMenu's focus problems
-#ifdef HAVE_KDE4
-        if (watched == trayMenu() &&
-            (event->type() == QEvent::WindowDeactivate || (event->type() == QEvent::MouseButtonRelease && static_cast<QMouseEvent *>(event)->button() == Qt::LeftButton))) {
-            // put at the back of event queue to let the action activate anyways
-            QTimer::singleShot(0, trayMenu(), SLOT(hide()));
-        }
-#else
         if (watched == trayMenu() && event->type() == QEvent::HoverLeave) {
             trayMenu()->hide();
         }
-#endif
     }
     return StatusNotifierItemParent::eventFilter(watched, event);
 }
@@ -348,12 +327,9 @@ void StatusNotifierItem::showMessage(const QString &title, const QString &messag
 {
     QString message = message_;
     if (_notificationsClient->isValid()) {
-        if (_notificationsClientSupportsMarkup)
-#if QT_VERSION < 0x050000
-            message = Qt::escape(message);
-#else
+        if (_notificationsClientSupportsMarkup) {
             message = message.toHtmlEscaped();
-#endif
+        }
 
         QStringList actions;
         if (_notificationsClientSupportsActions)