X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Flegacysystemtray.cpp;h=8e7d2b726183f0fc66c823ab5e8dad1100726cb9;hp=9176dbd769f2951c309b91f908f7778e69e5619e;hb=39dffd095bb5dbca49199d2173438c7f90c4e6fa;hpb=f266d6afd50d03b21b136b6a34454c49d55878cf diff --git a/src/qtui/legacysystemtray.cpp b/src/qtui/legacysystemtray.cpp index 9176dbd7..8e7d2b72 100644 --- a/src/qtui/legacysystemtray.cpp +++ b/src/qtui/legacysystemtray.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2005-2010 by the Quassel Project * + * Copyright (C) 2005-2018 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 file is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License (LGPL) * + * as published by the Free Software Foundation; either version 2 of the * + * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -15,148 +15,161 @@ * 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. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef QT_NO_SYSTEMTRAYICON +#include + #include "legacysystemtray.h" #include "mainwin.h" #include "qtui.h" LegacySystemTray::LegacySystemTray(QWidget *parent) - : SystemTray(parent), - _blinkState(false), - _isVisible(true), - _lastMessageId(0) + : SystemTray(parent), + _blinkState(false), + _lastMessageId(0) { -#ifndef HAVE_KDE - _trayIcon = new QSystemTrayIcon(associatedWidget()); +#ifndef HAVE_KDE4 + _trayIcon = new QSystemTrayIcon(associatedWidget()); #else - _trayIcon = new KSystemTrayIcon(associatedWidget()); - // We don't want to trigger a minimize if a highlight is pending, so we brutally remove the internal connection for that - disconnect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - _trayIcon, SLOT(activateOrHide(QSystemTrayIcon::ActivationReason))); + _trayIcon = new KSystemTrayIcon(associatedWidget()); + // We don't want to trigger a minimize if a highlight is pending, so we brutally remove the internal connection for that + disconnect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + _trayIcon, SLOT(activateOrHide(QSystemTrayIcon::ActivationReason))); #endif -#ifndef Q_WS_MAC - connect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - SLOT(on_activated(QSystemTrayIcon::ActivationReason))); +#ifndef Q_OS_MAC + connect(_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + SLOT(onActivated(QSystemTrayIcon::ActivationReason))); #endif - connect(_trayIcon, SIGNAL(messageClicked()), - SLOT(on_messageClicked())); + connect(_trayIcon, SIGNAL(messageClicked()), + SLOT(onMessageClicked())); - _blinkTimer.setInterval(500); - _blinkTimer.setSingleShot(false); - connect(&_blinkTimer, SIGNAL(timeout()), SLOT(on_blinkTimeout())); + _trayIcon->setContextMenu(trayMenu()); + _trayIcon->setVisible(false); - connect(this, SIGNAL(toolTipChanged(QString,QString)), SLOT(syncLegacyIcon())); -} + 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() { - _trayIcon->setIcon(stateIcon()); - -#if defined Q_WS_MAC || defined Q_WS_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); +bool LegacySystemTray::isSystemTrayAvailable() const +{ + return mode() == Mode::Legacy + ? QSystemTrayIcon::isSystemTrayAvailable() + : SystemTray::isSystemTrayAvailable(); } -void LegacySystemTray::setVisible(bool visible) { - _isVisible = visible; - if(mode() == Legacy) { - if(visible) - _trayIcon->show(); - else - _trayIcon->hide(); - } + +void LegacySystemTray::onVisibilityChanged(bool isVisible) +{ + if (mode() == Legacy) { + _trayIcon->setVisible(isVisible); + } } -bool LegacySystemTray::isVisible() const { - if(mode() == Legacy) { - return _trayIcon->isVisible(); - } - return false; + +void LegacySystemTray::onModeChanged(Mode mode) +{ + if (mode == Mode::Legacy) { + _trayIcon->setVisible(isVisible()); + } + else { + _trayIcon->hide(); + } } -void LegacySystemTray::setMode(Mode mode_) { - SystemTray::setMode(mode_); - - if(mode() == Legacy) { - syncLegacyIcon(); - if(_isVisible) - _trayIcon->show(); - if(state() == NeedsAttention) - _blinkTimer.start(); - } else { - _trayIcon->hide(); - _blinkTimer.stop(); - } + +void LegacySystemTray::onStateChanged(State state) +{ + if (state == NeedsAttention && animationEnabled()) + _blinkTimer.start(); + else { + _blinkTimer.stop(); + _blinkState = false; + } + updateIcon(); } -void LegacySystemTray::setState(State state_) { - State oldstate = state(); - SystemTray::setState(state_); - if(oldstate != state()) { - if(state() == NeedsAttention && mode() == Legacy && animationEnabled()) - _blinkTimer.start(); + +void LegacySystemTray::updateIcon() +{ + QString icon; + if (state() == State::NeedsAttention && !_blinkState) { + icon = iconName(State::Active); + } else { - _blinkTimer.stop(); - _blinkState = false; + icon = iconName(state()); } - } - if(mode() == Legacy) - _trayIcon->setIcon(stateIcon()); + _trayIcon->setIcon(QIcon::fromTheme(icon, QIcon{QString{":/icons/hicolor/24x24/status/%1.svg"}.arg(icon)})); } -Icon LegacySystemTray::stateIcon() const { - if(mode() == Legacy && state() == NeedsAttention && !_blinkState) - return SystemTray::stateIcon(Active); - return SystemTray::stateIcon(); + +void LegacySystemTray::updateToolTip() +{ +#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() { - _blinkState = !_blinkState; - _trayIcon->setIcon(stateIcon()); + +void LegacySystemTray::onBlinkTimeout() +{ + _blinkState = !_blinkState; + updateIcon(); } -void LegacySystemTray::on_activated(QSystemTrayIcon::ActivationReason reason) { - activate((SystemTray::ActivationReason)reason); + +void LegacySystemTray::onActivated(QSystemTrayIcon::ActivationReason reason) +{ + activate((SystemTray::ActivationReason)reason); } -void LegacySystemTray::on_messageClicked() { - emit messageClicked(_lastMessageId); + +void LegacySystemTray::onMessageClicked() +{ + emit messageClicked(_lastMessageId); } -void LegacySystemTray::showMessage(const QString &title, const QString &message, SystemTray::MessageIcon icon, int msTimeout, uint id) { - // fancy stuff later: show messages in order - // for now, we just show the last message - _lastMessageId = id; - _trayIcon->showMessage(title, message, (QSystemTrayIcon::MessageIcon)icon, msTimeout); + +void LegacySystemTray::showMessage(const QString &title, const QString &message, SystemTray::MessageIcon icon, int msTimeout, uint id) +{ + // fancy stuff later: show messages in order + // for now, we just show the last message + _lastMessageId = id; + _trayIcon->showMessage(title, message, (QSystemTrayIcon::MessageIcon)icon, msTimeout); } -void LegacySystemTray::closeMessage(uint notificationId) { - Q_UNUSED(notificationId) - // there really seems to be no sane way to close the bubble... :( +void LegacySystemTray::closeMessage(uint notificationId) +{ + Q_UNUSED(notificationId) + + // there really seems to be no sane way to close the bubble... :( #ifdef Q_WS_X11 - showMessage("", "", NoIcon, 1); + showMessage("", "", NoIcon, 1); #endif } + #endif /* QT_NO_SYSTEMTRAYICON */