/***************************************************************************
-* Copyright (C) 2005-09 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 program is distributed in the hope that it will be useful, *
-* but WITHOUT ANY WARRANTY; without even the implied warranty of *
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
-* GNU General Public License for more details. *
-* *
-* 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. *
-***************************************************************************/
-
-#ifndef SYSTEMTRAY_H_
-#define SYSTEMTRAY_H_
-
-#include <QSystemTrayIcon>
-#include <QTimer>
-
-#include "icon.h"
-
-class SystemTray : public QObject {
- Q_OBJECT
+ * Copyright (C) 2005-2018 by the Quassel Project *
+ * devel@quassel-irc.org *
+ * *
+ * 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 *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#pragma once
+
+#include <QObject>
+#include <QString>
+
+class Action;
+class QMenu;
+
+class SystemTray : public QObject
+{
+ Q_OBJECT
+ Q_ENUMS(State Mode MessageIcon ActivationReason)
public:
- enum State {
- Inactive,
- Active
- };
-
- SystemTray(QObject *parent = 0);
- ~SystemTray();
-
- inline bool isSystemTrayAvailable() const;
- Icon icon() const;
- QString toolTip() const;
+ enum State {
+ Passive,
+ Active,
+ NeedsAttention
+ };
+
+ enum Mode {
+ Invalid,
+ Legacy,
+ StatusNotifier
+ };
+
+ // same as in QSystemTrayIcon
+ enum MessageIcon {
+ NoIcon,
+ Information,
+ Warning,
+ Critical
+ };
+
+ // same as in QSystemTrayIcon
+ enum ActivationReason {
+ Unknown,
+ Context,
+ DoubleClick,
+ Trigger,
+ MiddleClick
+ };
+
+ explicit SystemTray(QWidget *parent);
+ ~SystemTray() override;
+
+ Mode mode() const;
+ State state() const;
+ bool isVisible() const;
+ bool isAlerted() const;
+
+ virtual bool isSystemTrayAvailable() const;
+
+ QWidget *associatedWidget() const;
public slots:
- void setState(State);
- void setAlert(bool alert = true);
- void setIconVisible(bool visible = true);
- void setToolTip(const QString &tip);
- void showMessage(const QString &title, const QString &message,
- QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information, int millisecondsTimeoutHint = 10000);
+ void setVisible(bool visible = true);
+ void setState(State);
+ void setAlert(bool alerted);
+ void setToolTip(const QString &title, const QString &subtitle);
+ virtual void showMessage(const QString &title, const QString &message, MessageIcon icon = Information, int msTimeout = 10000, uint notificationId = 0);
+ virtual void closeMessage(uint notificationId);
signals:
- void activated(QSystemTrayIcon::ActivationReason);
- void iconChanged(const Icon &);
- void messageClicked();
+ void modeChanged(Mode mode);
+ void stateChanged(State state);
+ void visibilityChanged(bool isVisible);
+ void iconsChanged();
+ void animationEnabledChanged(bool);
+ void toolTipChanged(const QString &title, const QString &subtitle);
-private slots:
- void nextPhase();
+ void activated(SystemTray::ActivationReason);
+ void messageClicked(uint notificationId);
+ void messageClosed(uint notificationId);
-private:
- void loadAnimations();
+protected slots:
+ virtual void activate(SystemTray::ActivationReason = Trigger);
- QSystemTrayIcon *_trayIcon;
- QMenu *_trayMenu;
- State _state;
- bool _alert;
+protected:
+ void setMode(Mode mode);
+ bool animationEnabled() const;
- int _idxOffStart, _idxOffEnd, _idxOnStart, _idxOnEnd, _idxAlertStart;
- int _currentIdx;
- QTimer _animationTimer;
+ QString toolTipTitle() const;
+ QString toolTipSubTitle() const;
+ QMenu *trayMenu() const;
- QList<QPixmap> _phases;
-};
+ QString iconName(State state) const;
-// inlines
+private slots:
+ void minimizeRestore();
+ void trayMenuAboutToShow();
+ void enableAnimationChanged(const QVariant &);
+ void invertTrayIconChanged(const QVariant &);
+
+private:
+ bool _isVisible{false};
+ Mode _mode{Mode::Invalid};
+ State _state{State::Passive};
+ bool _animationEnabled{true};
+ bool _trayIconInverted{false};
-bool SystemTray::isSystemTrayAvailable() const { return QSystemTrayIcon::isSystemTrayAvailable(); }
+ QString _toolTipTitle, _toolTipSubTitle;
-#endif
+ QMenu *_trayMenu{nullptr};
+ QWidget *_associatedWidget{nullptr};
+ Action *_minimizeRestoreAction{nullptr};
+};