X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Flegacysystemtray.cpp;h=8e7d2b726183f0fc66c823ab5e8dad1100726cb9;hp=56139e32201fe5d04b555be1e1a1e046566170a7;hb=39dffd095bb5dbca49199d2173438c7f90c4e6fa;hpb=99678e189313b168c410fa15cd10cb673b73c8a2 diff --git a/src/qtui/legacysystemtray.cpp b/src/qtui/legacysystemtray.cpp index 56139e32..8e7d2b72 100644 --- a/src/qtui/legacysystemtray.cpp +++ b/src/qtui/legacysystemtray.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2014 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This file is free software; you can redistribute it and/or modify * @@ -20,6 +20,8 @@ #ifndef QT_NO_SYSTEMTRAYICON +#include + #include "legacysystemtray.h" #include "mainwin.h" #include "qtui.h" @@ -29,7 +31,7 @@ LegacySystemTray::LegacySystemTray(QWidget *parent) _blinkState(false), _lastMessageId(0) { -#ifndef HAVE_KDE +#ifndef HAVE_KDE4 _trayIcon = new QSystemTrayIcon(associatedWidget()); #else _trayIcon = new KSystemTrayIcon(associatedWidget()); @@ -39,131 +41,112 @@ LegacySystemTray::LegacySystemTray(QWidget *parent) #endif #ifndef Q_OS_MAC connect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - SLOT(on_activated(QSystemTrayIcon::ActivationReason))); + SLOT(onActivated(QSystemTrayIcon::ActivationReason))); #endif connect(_trayIcon, SIGNAL(messageClicked()), - SLOT(on_messageClicked())); - - _blinkTimer.setInterval(500); - _blinkTimer.setSingleShot(false); - connect(&_blinkTimer, SIGNAL(timeout()), SLOT(on_blinkTimeout())); + SLOT(onMessageClicked())); - connect(this, SIGNAL(toolTipChanged(QString, QString)), SLOT(syncLegacyIcon())); -} + _trayIcon->setContextMenu(trayMenu()); + _trayIcon->setVisible(false); + setMode(Mode::Legacy); -void LegacySystemTray::init() -{ - if (mode() == Invalid) // derived class hasn't set a mode itself - setMode(Legacy); + connect(this, SIGNAL(visibilityChanged(bool)), this, SLOT(onVisibilityChanged(bool))); + connect(this, SIGNAL(modeChanged(Mode)), this, SLOT(onModeChanged(Mode))); + connect(this, SIGNAL(stateChanged(State)), this, SLOT(onStateChanged(State))); + connect(this, SIGNAL(toolTipChanged(QString, QString)), SLOT(updateToolTip())); - SystemTray::init(); + _blinkTimer.setInterval(750); + _blinkTimer.setSingleShot(false); + connect(&_blinkTimer, SIGNAL(timeout()), SLOT(onBlinkTimeout())); - _trayIcon->setContextMenu(trayMenu()); + updateIcon(); + updateToolTip(); } -void LegacySystemTray::syncLegacyIcon() +bool LegacySystemTray::isSystemTrayAvailable() const { - _trayIcon->setIcon(stateIcon()); - -#if defined Q_OS_MAC || defined Q_OS_WIN - QString tooltip = QString("%1").arg(toolTipTitle()); - if (!toolTipSubTitle().isEmpty()) - tooltip += QString("\n%1").arg(toolTipSubTitle()); -#else - QString tooltip = QString("%1").arg(toolTipTitle()); - if (!toolTipSubTitle().isEmpty()) - tooltip += QString("
%1").arg(toolTipSubTitle()); -#endif - - _trayIcon->setToolTip(tooltip); + return mode() == Mode::Legacy + ? QSystemTrayIcon::isSystemTrayAvailable() + : SystemTray::isSystemTrayAvailable(); } -void LegacySystemTray::setVisible(bool visible) +void LegacySystemTray::onVisibilityChanged(bool isVisible) { - SystemTray::setVisible(visible); if (mode() == Legacy) { - if (shouldBeVisible()) - _trayIcon->show(); - else - _trayIcon->hide(); + _trayIcon->setVisible(isVisible); } } -bool LegacySystemTray::isVisible() const +void LegacySystemTray::onModeChanged(Mode mode) { - if (mode() == Legacy) { - return _trayIcon->isVisible(); + if (mode == Mode::Legacy) { + _trayIcon->setVisible(isVisible()); + } + else { + _trayIcon->hide(); } - return SystemTray::isVisible(); } -void LegacySystemTray::setMode(Mode mode_) +void LegacySystemTray::onStateChanged(State state) { - if (mode_ == mode()) - return; - - SystemTray::setMode(mode_); - - if (mode() == Legacy) { - syncLegacyIcon(); - if (shouldBeVisible()) - _trayIcon->show(); - else - _trayIcon->hide(); - if (state() == NeedsAttention) - _blinkTimer.start(); - } + if (state == NeedsAttention && animationEnabled()) + _blinkTimer.start(); else { - _trayIcon->hide(); _blinkTimer.stop(); + _blinkState = false; } + updateIcon(); } -void LegacySystemTray::setState(State state_) +void LegacySystemTray::updateIcon() { - State oldstate = state(); - SystemTray::setState(state_); - if (oldstate != state()) { - if (state() == NeedsAttention && mode() == Legacy && animationEnabled()) - _blinkTimer.start(); - else { - _blinkTimer.stop(); - _blinkState = false; - } + QString icon; + if (state() == State::NeedsAttention && !_blinkState) { + icon = iconName(State::Active); } - if (mode() == Legacy) - _trayIcon->setIcon(stateIcon()); + else { + icon = iconName(state()); + } + _trayIcon->setIcon(QIcon::fromTheme(icon, QIcon{QString{":/icons/hicolor/24x24/status/%1.svg"}.arg(icon)})); } -Icon LegacySystemTray::stateIcon() const +void LegacySystemTray::updateToolTip() { - if (mode() == Legacy && state() == NeedsAttention && !_blinkState) - return SystemTray::stateIcon(Active); - return SystemTray::stateIcon(); +#if defined Q_OS_MAC || defined Q_OS_WIN + QString tooltip = QString("%1").arg(toolTipTitle()); + if (!toolTipSubTitle().isEmpty()) + tooltip += QString("\n%1").arg(toolTipSubTitle()); +#else + QString tooltip = QString("%1").arg(toolTipTitle()); + if (!toolTipSubTitle().isEmpty()) + tooltip += QString("
%1").arg(toolTipSubTitle()); +#endif + + _trayIcon->setToolTip(tooltip); } -void LegacySystemTray::on_blinkTimeout() +void LegacySystemTray::onBlinkTimeout() { _blinkState = !_blinkState; - _trayIcon->setIcon(stateIcon()); + updateIcon(); } -void LegacySystemTray::on_activated(QSystemTrayIcon::ActivationReason reason) +void LegacySystemTray::onActivated(QSystemTrayIcon::ActivationReason reason) { activate((SystemTray::ActivationReason)reason); } -void LegacySystemTray::on_messageClicked() +void LegacySystemTray::onMessageClicked() { emit messageClicked(_lastMessageId); }