X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fqtui%2Fsystemtray.cpp;h=c84055084f54b83bcaf11e3a13573cec9b1925d3;hb=adb89541c8583c2e0aca8893287b081c801ae7be;hp=36b70479e73b3c10a41dd5fcf1a6292f0b2f6d09;hpb=3cc8b9030841cc3084ec6707a01f3b44ee58b8b9;p=quassel.git diff --git a/src/qtui/systemtray.cpp b/src/qtui/systemtray.cpp index 36b70479..c8405508 100644 --- a/src/qtui/systemtray.cpp +++ b/src/qtui/systemtray.cpp @@ -36,30 +36,21 @@ SystemTray::SystemTray(QWidget *parent) : QObject(parent), - _passiveIcon(QIcon::fromTheme("inactive-quassel", QIcon(":/icons/inactive-quassel.png"))), - _activeIcon(QIcon::fromTheme("quassel", QIcon(":/icons/quassel.png"))), - _needsAttentionIcon(QIcon::fromTheme("message-quassel", QIcon(":/icons/message-quassel.png"))), _associatedWidget(parent) { Q_ASSERT(parent); -} - - -SystemTray::~SystemTray() -{ - _trayMenu->deleteLater(); -} + 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); -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"); + kmenu->addTitle(QIcon::fromTheme(iconName(State::Active)), "Quassel IRC"); #else _trayMenu = new QMenu(associatedWidget()); #endif @@ -76,41 +67,46 @@ void SystemTray::init() _trayMenu->addSeparator(); _trayMenu->addAction(_minimizeRestoreAction); _trayMenu->addAction(coll->action("Quit")); - connect(_trayMenu, SIGNAL(aboutToShow()), SLOT(trayMenuAboutToShow())); - NotificationSettings notificationSettings; - notificationSettings.initAndNotify("Systray/Animate", this, SLOT(enableAnimationChanged(QVariant)), true); + connect(QtUi::instance(), SIGNAL(iconThemeRefreshed()), this, SIGNAL(iconsChanged())); + + _blinkTimer.setInterval(1000); + _blinkTimer.setSingleShot(false); + connect(&_blinkTimer, SIGNAL(timeout()), SLOT(onBlinkTimeout())); } -QWidget *SystemTray::associatedWidget() const +SystemTray::~SystemTray() { - return _associatedWidget; + _trayMenu->deleteLater(); } -bool SystemTray::isSystemTrayAvailable() const +QWidget *SystemTray::associatedWidget() const { - return false; + return _associatedWidget; } -bool SystemTray::isVisible() const +bool SystemTray::isSystemTrayAvailable() const { return false; } -bool SystemTray::shouldBeVisible() const +bool SystemTray::isVisible() const { - return _shouldBeVisible; + return _isVisible; } void SystemTray::setVisible(bool visible) { - _shouldBeVisible = visible; + if (visible != _isVisible) { + _isVisible = visible; + emit visibilityChanged(visible); + } } @@ -120,13 +116,13 @@ SystemTray::Mode SystemTray::mode() const } -void SystemTray::setMode(Mode mode_) +void SystemTray::setMode(Mode mode) { - if (mode_ != _mode) { - _mode = mode_; + if (mode != _mode) { + _mode = mode; #ifdef HAVE_KDE4 if (_trayMenu) { - if (_mode == Legacy) { + if (mode == Mode::Legacy) { _trayMenu->setWindowFlags(Qt::Popup); } else { @@ -134,6 +130,7 @@ void SystemTray::setMode(Mode mode_) } } #endif + emit modeChanged(mode); } } @@ -148,27 +145,67 @@ 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; } -QIcon SystemTray::stateIcon() const +QString SystemTray::currentIconName() const { - return stateIcon(state()); + 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()); + } } -QIcon SystemTray::stateIcon(State state) const +QString SystemTray::currentAttentionIconName() const { - switch (state) { - case Passive: - return _passiveIcon; - case Active: - return _activeIcon; - case NeedsAttention: - return _needsAttentionIcon; + if (state() == State::NeedsAttention && _attentionBehavior == AttentionBehavior::Blink && !_blinkState) { + return iconName(State::Active); } - return QIcon(); + return iconName(State::NeedsAttention); } @@ -180,10 +217,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(); } @@ -202,16 +248,38 @@ void SystemTray::trayMenuAboutToShow() } -bool SystemTray::animationEnabled() const +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) { - return _animationEnabled; + if (v.toBool()) { + _attentionBehavior = AttentionBehavior::Blink; + } + else { + if (_attentionBehavior == AttentionBehavior::Blink) { + _attentionBehavior = AttentionBehavior::DoNothing; + } + } + emit currentIconNameChanged(); } -void SystemTray::enableAnimationChanged(const QVariant &v) +void SystemTray::invertTrayIconChanged(const QVariant &v) { - _animationEnabled = v.toBool(); - emit animationEnabledChanged(v.toBool()); + _trayIconInverted = v.toBool(); + emit iconsChanged(); }