X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsystemtray.cpp;h=c85e7bf22df7c4f1b8ed3a7e47da1b24ac441497;hp=4a68dd64114e5e1bffcb2b7915b766e2e36622c3;hb=f9efdde7f3a6004af8f834c409cfa6ae1d877692;hpb=39dffd095bb5dbca49199d2173438c7f90c4e6fa diff --git a/src/qtui/systemtray.cpp b/src/qtui/systemtray.cpp index 4a68dd64..c85e7bf2 100644 --- a/src/qtui/systemtray.cpp +++ b/src/qtui/systemtray.cpp @@ -18,47 +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) { Q_ASSERT(parent); - NotificationSettings{}.initAndNotify("Systray/Animate", this, SLOT(enableAnimationChanged(QVariant)), true); + NotificationSettings{}.initAndNotify("Systray/ChangeColor", this, SLOT(enableChangeColorChanged(QVariant)), true); + NotificationSettings{}.initAndNotify("Systray/Animate", this, SLOT(enableBlinkChanged(QVariant)), false); UiStyleSettings{}.initAndNotify("Icons/InvertTray", this, SLOT(invertTrayIconChanged(QVariant)), false); ActionCollection *coll = QtUi::actionCollection("General"); - _minimizeRestoreAction = new Action(tr("&Minimize"), this, this, SLOT(minimizeRestore())); + _minimizeRestoreAction = new Action(tr("&Minimize"), this, this, &SystemTray::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")); @@ -66,8 +52,13 @@ SystemTray::SystemTray(QWidget *parent) _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); } @@ -114,16 +105,6 @@ void SystemTray::setMode(Mode mode) { if (mode != _mode) { _mode = mode; -#ifdef HAVE_KDE4 - if (_trayMenu) { - if (mode == Mode::Legacy) { - _trayMenu->setWindowFlags(Qt::Popup); - } - else { - _trayMenu->setWindowFlags(Qt::Window); - } - } -#endif emit modeChanged(mode); } } @@ -140,6 +121,16 @@ 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(); } } @@ -167,6 +158,32 @@ QString SystemTray::iconName(State state) const } +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; @@ -175,10 +192,19 @@ bool SystemTray::isAlerted() const 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(); } @@ -197,22 +223,38 @@ void SystemTray::trayMenuAboutToShow() } -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) { _trayIconInverted = v.toBool(); + emit iconsChanged(); }