X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsystemtray.cpp;h=93cc16e1976cd17a7dd35052740058160d2ce924;hp=5bae0845f21c9a7d519ef45262be7383ccaa6fbf;hb=673ded0d543cbdc2cf6e746b6bee7c1d21af8f90;hpb=5b686746c880e5cda6d5de3e08180ea4332ff222 diff --git a/src/qtui/systemtray.cpp b/src/qtui/systemtray.cpp index 5bae0845..93cc16e1 100644 --- a/src/qtui/systemtray.cpp +++ b/src/qtui/systemtray.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2005-2012 by the Quassel Project * + * Copyright (C) 2005-2020 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 * @@ -18,68 +18,33 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include "systemtray.h" + #include #include -#include "systemtray.h" - #include "action.h" #include "actioncollection.h" #include "client.h" -#include "iconloader.h" +#include "icon.h" #include "qtui.h" -#ifdef HAVE_KDE -# include -# include -# include -#endif - -SystemTray::SystemTray(QWidget *parent) - : QObject(parent), - _mode(Invalid), - _state(Passive), - _shouldBeVisible(true), - _passiveIcon(DesktopIcon("quassel-inactive")), - _activeIcon(DesktopIcon("quassel")), - _needsAttentionIcon(DesktopIcon("quassel-message")), - _trayMenu(0), - _associatedWidget(parent) +SystemTray::SystemTray(QWidget* parent) + : QObject(parent) + , _associatedWidget(parent) { Q_ASSERT(parent); -} - - -SystemTray::~SystemTray() -{ - _trayMenu->deleteLater(); -} + NotificationSettings{}.initAndNotify("Systray/ChangeColor", this, &SystemTray::enableChangeColorChanged, true); + NotificationSettings{}.initAndNotify("Systray/Animate", this, &SystemTray::enableBlinkChanged, false); + UiStyleSettings{}.initAndNotify("Icons/InvertTray", this, &SystemTray::invertTrayIconChanged, false); -QWidget *SystemTray::associatedWidget() const -{ - return _associatedWidget; -} + ActionCollection* coll = QtUi::actionCollection("General"); + _minimizeRestoreAction = new Action(tr("&Minimize"), this, this, &SystemTray::minimizeRestore); - -void SystemTray::init() -{ - ActionCollection *coll = QtUi::actionCollection("General"); - _minimizeRestoreAction = new Action(tr("&Minimize"), this, this, SLOT(minimizeRestore())); - -#ifdef HAVE_KDE - KMenu *kmenu; - _trayMenu = kmenu = new KMenu(); - kmenu->addTitle(_activeIcon, "Quassel IRC"); -#else _trayMenu = new QMenu(associatedWidget()); -#endif - _trayMenu->setTitle("Quassel IRC"); - -#ifndef HAVE_KDE _trayMenu->setAttribute(Qt::WA_Hover); -#endif _trayMenu->addAction(coll->action("ConnectCore")); _trayMenu->addAction(coll->action("DisconnectCore")); @@ -87,93 +52,209 @@ void SystemTray::init() _trayMenu->addSeparator(); _trayMenu->addAction(_minimizeRestoreAction); _trayMenu->addAction(coll->action("Quit")); + connect(_trayMenu, &QMenu::aboutToShow, this, &SystemTray::trayMenuAboutToShow); - connect(_trayMenu, SIGNAL(aboutToShow()), SLOT(trayMenuAboutToShow())); + connect(QtUi::instance(), &QtUi::iconThemeRefreshed, this, &SystemTray::iconsChanged); - NotificationSettings notificationSettings; - notificationSettings.initAndNotify("Systray/Animate", this, SLOT(enableAnimationChanged(QVariant)), true); + _blinkTimer.setInterval(1000); + _blinkTimer.setSingleShot(false); + connect(&_blinkTimer, &QTimer::timeout, this, &SystemTray::onBlinkTimeout); } - -void SystemTray::trayMenuAboutToShow() +SystemTray::~SystemTray() { - if (GraphicalUi::isMainWidgetVisible()) - _minimizeRestoreAction->setText(tr("&Minimize")); - else - _minimizeRestoreAction->setText(tr("&Restore")); + _trayMenu->deleteLater(); } +QWidget* SystemTray::associatedWidget() const +{ + return _associatedWidget; +} -void SystemTray::setMode(Mode mode_) +bool SystemTray::isSystemTrayAvailable() const { - if (mode_ != _mode) { - _mode = mode_; -#ifdef HAVE_KDE - if (_trayMenu) { - if (_mode == Legacy) { - _trayMenu->setWindowFlags(Qt::Popup); - } - else { - _trayMenu->setWindowFlags(Qt::Window); - } - } -#endif - } + return false; } +bool SystemTray::isVisible() const +{ + return _isVisible; +} -Icon SystemTray::stateIcon() const +void SystemTray::setVisible(bool visible) { - return stateIcon(state()); + if (visible != _isVisible) { + _isVisible = visible; + emit visibilityChanged(visible); + } } +SystemTray::Mode SystemTray::mode() const +{ + return _mode; +} -Icon SystemTray::stateIcon(State state) const +void SystemTray::setMode(Mode mode) { - switch (state) { - case Passive: - return _passiveIcon; - case Active: - return _activeIcon; - case NeedsAttention: - return _needsAttentionIcon; + if (mode != _mode) { + _mode = mode; + emit modeChanged(mode); } - return Icon(); } +SystemTray::State SystemTray::state() const +{ + return _state; +} void SystemTray::setState(State state) { if (_state != state) { _state = state; + emit stateChanged(state); + + if (state == NeedsAttention && _attentionBehavior == AttentionBehavior::Blink) { + _blinkTimer.start(); + _blinkState = true; + } + else { + _blinkTimer.stop(); + _blinkState = false; + } + emit currentIconNameChanged(); } } +QString SystemTray::iconName(State state) const +{ + QString name; + switch (state) { + case State::Passive: + name = "inactive-quassel-tray"; + break; + case State::Active: + name = "active-quassel-tray"; + break; + case State::NeedsAttention: + name = "message-quassel-tray"; + break; + } + + if (_trayIconInverted) { + name += "-inverted"; + } + + return name; +} + +QString SystemTray::currentIconName() const +{ + if (state() == State::NeedsAttention) { + if (_attentionBehavior == AttentionBehavior::ChangeColor) { + return iconName(State::NeedsAttention); + } + if (_attentionBehavior == AttentionBehavior::Blink && _blinkState) { + return iconName(State::NeedsAttention); + } + return iconName(State::Active); + } + else { + return iconName(state()); + } +} + +QString SystemTray::currentAttentionIconName() const +{ + if (state() == State::NeedsAttention && _attentionBehavior == AttentionBehavior::Blink && !_blinkState) { + return iconName(State::Active); + } + return iconName(State::NeedsAttention); +} + +bool SystemTray::isAlerted() const +{ + return state() == State::NeedsAttention; +} void SystemTray::setAlert(bool alerted) { - if (alerted) + if (alerted) { setState(NeedsAttention); - else + } + else { setState(Client::isConnected() ? Active : Passive); + } } +void SystemTray::onBlinkTimeout() +{ + _blinkState = !_blinkState; + emit currentIconNameChanged(); +} -void SystemTray::setVisible(bool visible) +QMenu* SystemTray::trayMenu() const { - _shouldBeVisible = visible; + return _trayMenu; } +void SystemTray::trayMenuAboutToShow() +{ + if (GraphicalUi::isMainWidgetVisible()) + _minimizeRestoreAction->setText(tr("&Minimize")); + else + _minimizeRestoreAction->setText(tr("&Restore")); +} -void SystemTray::setToolTip(const QString &title, const QString &subtitle) +void SystemTray::enableChangeColorChanged(const QVariant& v) +{ + if (v.toBool()) { + _attentionBehavior = AttentionBehavior::ChangeColor; + } + else { + if (_attentionBehavior == AttentionBehavior::ChangeColor) { + _attentionBehavior = AttentionBehavior::DoNothing; + } + } + emit currentIconNameChanged(); +} + +void SystemTray::enableBlinkChanged(const QVariant& v) +{ + if (v.toBool()) { + _attentionBehavior = AttentionBehavior::Blink; + } + else { + if (_attentionBehavior == AttentionBehavior::Blink) { + _attentionBehavior = AttentionBehavior::DoNothing; + } + } + emit currentIconNameChanged(); +} + +void SystemTray::invertTrayIconChanged(const QVariant& v) +{ + _trayIconInverted = v.toBool(); + emit iconsChanged(); +} + +QString SystemTray::toolTipTitle() const +{ + return _toolTipTitle; +} + +QString SystemTray::toolTipSubTitle() const +{ + return _toolTipSubTitle; +} + +void SystemTray::setToolTip(const QString& title, const QString& subtitle) { _toolTipTitle = title; _toolTipSubTitle = subtitle; emit toolTipChanged(title, subtitle); } - -void SystemTray::showMessage(const QString &title, const QString &message, MessageIcon icon, int millisecondsTimeoutHint, uint id) +void SystemTray::showMessage(const QString& title, const QString& message, MessageIcon icon, int millisecondsTimeoutHint, uint id) { Q_UNUSED(title) Q_UNUSED(message) @@ -182,21 +263,17 @@ void SystemTray::showMessage(const QString &title, const QString &message, Messa Q_UNUSED(id) } +void SystemTray::closeMessage(uint notificationId) +{ + Q_UNUSED(notificationId) +} void SystemTray::activate(SystemTray::ActivationReason reason) { emit activated(reason); } - void SystemTray::minimizeRestore() { GraphicalUi::toggleMainWidget(); } - - -void SystemTray::enableAnimationChanged(const QVariant &v) -{ - _animationEnabled = v.toBool(); - emit animationEnabledChanged(v.toBool()); -}