X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fsystemtray.cpp;h=145d74c63e24e99f5e55f32e82bdbea7462a22f7;hb=b8db3c55a7f66a8d6ecabf9039aabceff9ae4837;hp=679a4b182770007553d425c752314ec2f0bcb605;hpb=b4b4d30567ea2d5c5bfaff8d019cf7ff5d023538;p=quassel.git diff --git a/src/qtui/systemtray.cpp b/src/qtui/systemtray.cpp index 679a4b18..145d74c6 100644 --- a/src/qtui/systemtray.cpp +++ b/src/qtui/systemtray.cpp @@ -18,57 +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 "icon.h" #include "qtui.h" -#ifdef HAVE_KDE4 -# include -# include -# include -#endif - -SystemTray::SystemTray(QWidget *parent) - : QObject(parent), - _associatedWidget(parent) +SystemTray::SystemTray(QWidget* parent) + : QObject(parent) + , _associatedWidget(parent) { Q_ASSERT(parent); - NotificationSettings{}.initAndNotify("Systray/Animate", this, SLOT(enableAnimationChanged(QVariant)), true); - UiStyleSettings{}.initAndNotify("Icons/InvertTray", this, SLOT(invertTrayIconChanged(QVariant)), false); -} - - -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); + 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_KDE4 - KMenu *kmenu; - _trayMenu = kmenu = new KMenu(); - kmenu->addTitle(_activeIcon, "Quassel IRC"); -#else _trayMenu = new QMenu(associatedWidget()); -#endif - _trayMenu->setTitle("Quassel IRC"); - -#ifndef HAVE_KDE4 _trayMenu->setAttribute(Qt::WA_Hover); -#endif _trayMenu->addAction(coll->action("ConnectCore")); _trayMenu->addAction(coll->action("DisconnectCore")); @@ -76,79 +52,79 @@ void SystemTray::init() _trayMenu->addSeparator(); _trayMenu->addAction(_minimizeRestoreAction); _trayMenu->addAction(coll->action("Quit")); + connect(_trayMenu, &QMenu::aboutToShow, this, &SystemTray::trayMenuAboutToShow); + + connect(QtUi::instance(), &QtUi::iconThemeRefreshed, this, &SystemTray::iconsChanged); - connect(_trayMenu, SIGNAL(aboutToShow()), SLOT(trayMenuAboutToShow())); + _blinkTimer.setInterval(1000); + _blinkTimer.setSingleShot(false); + connect(&_blinkTimer, &QTimer::timeout, this, &SystemTray::onBlinkTimeout); } +SystemTray::~SystemTray() +{ + _trayMenu->deleteLater(); +} -QWidget *SystemTray::associatedWidget() const +QWidget* SystemTray::associatedWidget() const { return _associatedWidget; } - bool SystemTray::isSystemTrayAvailable() const { return false; } - bool SystemTray::isVisible() const { - return false; -} - - -bool SystemTray::shouldBeVisible() const -{ - return _shouldBeVisible; + return _isVisible; } - void SystemTray::setVisible(bool visible) { - _shouldBeVisible = visible; + if (visible != _isVisible) { + _isVisible = visible; + emit visibilityChanged(visible); + } } - SystemTray::Mode SystemTray::mode() const { return _mode; } - -void SystemTray::setMode(Mode mode_) +void SystemTray::setMode(Mode mode) { - if (mode_ != _mode) { - _mode = mode_; -#ifdef HAVE_KDE4 - if (_trayMenu) { - if (_mode == Legacy) { - _trayMenu->setWindowFlags(Qt::Popup); - } - else { - _trayMenu->setWindowFlags(Qt::Window); - } - } -#endif + if (mode != _mode) { + _mode = mode; + emit modeChanged(mode); } } - 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; @@ -171,28 +147,56 @@ QString SystemTray::iconName(State state) const 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(); +} -QMenu *SystemTray::trayMenu() const +QMenu* SystemTray::trayMenu() const { return _trayMenu; } - void SystemTray::trayMenuAboutToShow() { if (GraphicalUi::isMainWidgetVisible()) @@ -201,47 +205,56 @@ void SystemTray::trayMenuAboutToShow() _minimizeRestoreAction->setText(tr("&Restore")); } - -bool SystemTray::animationEnabled() const +void SystemTray::enableChangeColorChanged(const QVariant& v) { - return _animationEnabled; + if (v.toBool()) { + _attentionBehavior = AttentionBehavior::ChangeColor; + } + else { + if (_attentionBehavior == AttentionBehavior::ChangeColor) { + _attentionBehavior = AttentionBehavior::DoNothing; + } + } + emit currentIconNameChanged(); } - -void SystemTray::enableAnimationChanged(const QVariant &v) +void SystemTray::enableBlinkChanged(const QVariant& v) { - _animationEnabled = v.toBool(); - emit animationEnabledChanged(v.toBool()); + if (v.toBool()) { + _attentionBehavior = AttentionBehavior::Blink; + } + else { + if (_attentionBehavior == AttentionBehavior::Blink) { + _attentionBehavior = AttentionBehavior::DoNothing; + } + } + emit currentIconNameChanged(); } - -void SystemTray::invertTrayIconChanged(const QVariant &v) +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) +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) @@ -250,19 +263,16 @@ 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();