diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-05-25 22:53:27 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-06-16 06:50:40 +0000 |
commit | a3f27162103286bf4a3f0a74ee44b29077888da2 (patch) | |
tree | 5ebdd9666b024128533baa17c6a76f244a2d6d6b /src/imports/platform | |
parent | e9e68baf652eca70c6a4c080ed9e49c70c8c9984 (diff) |
Platform system tray icon
Change-Id: I25190e1ae485e86cfbed524a418884d47f21e83d
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/imports/platform')
-rw-r--r-- | src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-menu.png | bin | 0 -> 24016 bytes | |||
-rw-r--r-- | src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-message.png | bin | 0 -> 36932 bytes | |||
-rw-r--r-- | src/imports/platform/doc/images/qtlabsplatform-systemtrayicon.png | bin | 0 -> 19927 bytes | |||
-rw-r--r-- | src/imports/platform/platform.pri | 6 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmenu.cpp | 29 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmenu_p.h | 7 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformsystemtrayicon.cpp | 430 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformsystemtrayicon_p.h | 139 | ||||
-rw-r--r-- | src/imports/platform/qtlabsplatformplugin.cpp | 4 |
9 files changed, 613 insertions, 2 deletions
diff --git a/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-menu.png b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-menu.png Binary files differnew file mode 100644 index 00000000..0d0ecfab --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-menu.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-message.png b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-message.png Binary files differnew file mode 100644 index 00000000..d929ca97 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon-message.png diff --git a/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon.png b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon.png Binary files differnew file mode 100644 index 00000000..58c40d73 --- /dev/null +++ b/src/imports/platform/doc/images/qtlabsplatform-systemtrayicon.png diff --git a/src/imports/platform/platform.pri b/src/imports/platform/platform.pri index a0ba0450..6b7bb5d0 100644 --- a/src/imports/platform/platform.pri +++ b/src/imports/platform/platform.pri @@ -3,11 +3,13 @@ HEADERS += \ $$PWD/qquickplatformmenu_p.h \ $$PWD/qquickplatformmenubar_p.h \ $$PWD/qquickplatformmenuitem_p.h \ - $$PWD/qquickplatformmenuitemgroup_p.h + $$PWD/qquickplatformmenuitemgroup_p.h \ + $$PWD/qquickplatformsystemtrayicon_p.h SOURCES += \ $$PWD/qquickplatformiconloader.cpp \ $$PWD/qquickplatformmenu.cpp \ $$PWD/qquickplatformmenubar.cpp \ $$PWD/qquickplatformmenuitem.cpp \ - $$PWD/qquickplatformmenuitemgroup.cpp + $$PWD/qquickplatformmenuitemgroup.cpp \ + $$PWD/qquickplatformsystemtrayicon.cpp diff --git a/src/imports/platform/qquickplatformmenu.cpp b/src/imports/platform/qquickplatformmenu.cpp index 7849adf0..4409564d 100644 --- a/src/imports/platform/qquickplatformmenu.cpp +++ b/src/imports/platform/qquickplatformmenu.cpp @@ -38,6 +38,7 @@ #include "qquickplatformmenubar_p.h" #include "qquickplatformmenuitem_p.h" #include "qquickplatformiconloader_p.h" +#include "qquickplatformsystemtrayicon_p.h" #include <QtGui/qicon.h> #include <QtGui/qcursor.h> @@ -127,6 +128,7 @@ QQuickPlatformMenu::QQuickPlatformMenu(QObject *parent) m_type(QPlatformMenu::DefaultMenu), m_menuBar(nullptr), m_parentMenu(nullptr), + m_systemTrayIcon(nullptr), m_menuItem(nullptr), m_iconLoader(nullptr), m_handle(nullptr) @@ -162,10 +164,13 @@ QPlatformMenu * QQuickPlatformMenu::create() m_handle = m_menuBar->handle()->createMenu(); else if (m_parentMenu && m_parentMenu->handle()) m_handle = m_parentMenu->handle()->createSubMenu(); + else if (m_systemTrayIcon && m_systemTrayIcon->handle()) + m_handle = m_systemTrayIcon->handle()->createMenu(); // TODO: implement ^ // - QCocoaMenuBar::createMenu() // - QCocoaMenu::createSubMenu() + // - QCocoaSystemTrayIcon::createMenu() if (!m_handle) m_handle = QGuiApplicationPrivate::platformTheme()->createPlatformMenu(); @@ -208,6 +213,8 @@ void QQuickPlatformMenu::sync() if (m_menuBar && m_menuBar->handle()) m_menuBar->handle()->syncMenu(m_handle); + else if (m_systemTrayIcon && m_systemTrayIcon->handle()) + m_systemTrayIcon->handle()->updateMenu(m_handle); for (QQuickPlatformMenuItem *item : m_items) item->sync(); @@ -284,6 +291,28 @@ void QQuickPlatformMenu::setParentMenu(QQuickPlatformMenu *menu) /*! \readonly + \qmlproperty SystemTrayIcon Qt.labs.platform::Menu::systemTrayIcon + + This property holds the system tray icon that the menu belongs to, or \c null + if the menu is not in a system tray icon. +*/ +QQuickPlatformSystemTrayIcon *QQuickPlatformMenu::systemTrayIcon() const +{ + return m_systemTrayIcon; +} + +void QQuickPlatformMenu::setSystemTrayIcon(QQuickPlatformSystemTrayIcon *icon) +{ + if (m_systemTrayIcon == icon) + return; + + m_systemTrayIcon = icon; + destroy(); + emit systemTrayIconChanged(); +} + +/*! + \readonly \qmlproperty MenuItem Qt.labs.platform::Menu::menuItem This property holds the item that presents the menu (in a parent menu). diff --git a/src/imports/platform/qquickplatformmenu_p.h b/src/imports/platform/qquickplatformmenu_p.h index 2846c628..587fae99 100644 --- a/src/imports/platform/qquickplatformmenu_p.h +++ b/src/imports/platform/qquickplatformmenu_p.h @@ -66,6 +66,7 @@ class QQmlV4Function; class QQuickPlatformMenuBar; class QQuickPlatformMenuItem; class QQuickPlatformIconLoader; +class QQuickPlatformSystemTrayIcon; class QQuickPlatformMenu : public QObject, public QQmlParserStatus { @@ -75,6 +76,7 @@ class QQuickPlatformMenu : public QObject, public QQmlParserStatus Q_PROPERTY(QQmlListProperty<QQuickPlatformMenuItem> items READ items NOTIFY itemsChanged FINAL) Q_PROPERTY(QQuickPlatformMenuBar *menuBar READ menuBar NOTIFY menuBarChanged FINAL) Q_PROPERTY(QQuickPlatformMenu *parentMenu READ parentMenu NOTIFY parentMenuChanged FINAL) + Q_PROPERTY(QQuickPlatformSystemTrayIcon *systemTrayIcon READ systemTrayIcon NOTIFY systemTrayIconChanged FINAL) Q_PROPERTY(QQuickPlatformMenuItem *menuItem READ menuItem CONSTANT FINAL) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged FINAL) Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) @@ -105,6 +107,9 @@ public: QQuickPlatformMenu *parentMenu() const; void setParentMenu(QQuickPlatformMenu *menu); + QQuickPlatformSystemTrayIcon *systemTrayIcon() const; + void setSystemTrayIcon(QQuickPlatformSystemTrayIcon *icon); + QQuickPlatformMenuItem *menuItem() const; bool isEnabled() const; @@ -152,6 +157,7 @@ Q_SIGNALS: void itemsChanged(); void menuBarChanged(); void parentMenuChanged(); + void systemTrayIconChanged(); void titleChanged(); void iconSourceChanged(); void iconNameChanged(); @@ -194,6 +200,7 @@ private: QList<QQuickPlatformMenuItem *> m_items; QQuickPlatformMenuBar *m_menuBar; QQuickPlatformMenu *m_parentMenu; + QQuickPlatformSystemTrayIcon *m_systemTrayIcon; mutable QQuickPlatformMenuItem *m_menuItem; mutable QQuickPlatformIconLoader *m_iconLoader; QPlatformMenu *m_handle; diff --git a/src/imports/platform/qquickplatformsystemtrayicon.cpp b/src/imports/platform/qquickplatformsystemtrayicon.cpp new file mode 100644 index 00000000..704a1054 --- /dev/null +++ b/src/imports/platform/qquickplatformsystemtrayicon.cpp @@ -0,0 +1,430 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickplatformsystemtrayicon_p.h" +#include "qquickplatformmenu_p.h" +#include "qquickplatformiconloader_p.h" + +#include <QtGui/qpa/qplatformtheme.h> +#include <QtGui/private/qguiapplication_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype SystemTrayIcon + \inherits QtObject + \instantiates QQuickPlatformSystemTrayIcon + \inqmlmodule Qt.labs.platform + \since 5.8 + \brief A system tray icon. + + The SystemTrayIcon type provides an icon for an application in the system tray. + + Many desktop platforms provide a special system tray or notification area, + where applications can display icons and notification messages. + + \image qtlabsplatform-systemtrayicon.png + + The following example shows how to create a system tray icon, and how to make + use of the \l activated() signal: + + \code + SystemTrayIcon { + visible: true + iconSource: "qrc:/images/tray-icon.png" + + onActivated: { + window.show() + window.raise() + window.requestActivate() + } + } + \endcode + + \section2 Tray menu + + SystemTrayIcon can have a menu that opens when the icon is activated. + + \image qtlabsplatform-systemtrayicon-menu.png + + The following example illustrates how to assign a \l Menu to a system tray icon: + + \code + SystemTrayIcon { + visible: true + iconSource: "qrc:/images/tray-icon.png" + + menu: Menu { + MenuItem { + text: qsTr("Quit") + onActivated: Qt.quit() + } + } + } + \endcode + + \section2 Notification messages + + SystemTrayIcon can display notification messages. + + \image qtlabsplatform-systemtrayicon-message.png + + The following example presents how to show a notification message using + \l showMessage(), and how to make use of the \l messageClicked() signal: + + \code + SystemTrayIcon { + visible: true + iconSource: "qrc:/images/tray-icon.png" + + onMessageClicked: console.log("Message clicked") + Component.onCompleted: showMessage("Message title", "Something important came up. Click this to know more.") + } + \endcode + + \section2 Availability + + SystemTrayIcon is currently \l available on the following platforms: + + \list + \li All window managers and independent tray implementations for X11 that implement the + \l{http://standards.freedesktop.org/systemtray-spec/systemtray-spec-0.2.html} + {freedesktop.org XEmbed system tray specification}. + \li All desktop environments that implement the + \l{http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem} + {freedesktop.org D-Bus StatusNotifierItem specification}, including recent versions of KDE and Unity. + \li All supported versions of OS X. Note that the Growl notification system must be installed + for showMessage() to display messages on OS X prior to 10.8 (Mountain Lion). + \endlist + + \labs + + \sa Menu +*/ + +/*! + \qmlsignal Qt.labs.platform::SystemTrayIcon::activated(ActivationReason reason) + + This signal is emitted when the system tray icon is activated by the user. The + \a reason argument specifies how the system tray icon was activated. + + Available reasons: + + \value SystemTrayIcon.Unknown Unknown reason + \value SystemTrayIcon.Context The context menu for the system tray icon was requested + \value SystemTrayIcon.DoubleClick The system tray icon was double clicked + \value SystemTrayIcon.Trigger The system tray icon was clicked + \value SystemTrayIcon.MiddleClick The system tray icon was clicked with the middle mouse button +*/ + +/*! + \qmlsignal Qt.labs.platform::SystemTrayIcon::messageClicked() + + This signal is emitted when a notification message is clicked by the user. + + \sa showMessage() +*/ + +QQuickPlatformSystemTrayIcon::QQuickPlatformSystemTrayIcon(QObject *parent) + : QObject(parent), + m_complete(false), + m_visible(false), + m_menu(nullptr), + m_iconLoader(nullptr), + m_handle(nullptr) +{ + m_handle = QGuiApplicationPrivate::platformTheme()->createPlatformSystemTrayIcon(); + if (m_handle) { + connect(m_handle, &QPlatformSystemTrayIcon::activated, this, &QQuickPlatformSystemTrayIcon::activated); + connect(m_handle, &QPlatformSystemTrayIcon::messageClicked, this, &QQuickPlatformSystemTrayIcon::messageClicked); + } +} + +QQuickPlatformSystemTrayIcon::~QQuickPlatformSystemTrayIcon() +{ + if (m_menu) + m_menu->setSystemTrayIcon(nullptr); + cleanup(); + delete m_iconLoader; + m_iconLoader = nullptr; + delete m_handle; + m_handle = nullptr; +} + +QPlatformSystemTrayIcon *QQuickPlatformSystemTrayIcon::handle() const +{ + return m_handle; +} + +/*! + \readonly + \qmlproperty bool Qt.labs.platform::SystemTrayIcon::available + + This property holds whether the system tray is available. +*/ +bool QQuickPlatformSystemTrayIcon::isAvailable() const +{ + return m_handle && m_handle->isSystemTrayAvailable(); +} + +/*! + \readonly + \qmlproperty bool Qt.labs.platform::SystemTrayIcon::supportsMessages + + This property holds whether the system tray icon supports notification messages. + + \sa showMessage() +*/ +bool QQuickPlatformSystemTrayIcon::supportsMessages() const +{ + return m_handle && m_handle->supportsMessages(); +} + +/*! + \qmlproperty bool Qt.labs.platform::SystemTrayIcon::visible + + This property holds whether the system tray icon is visible. + + The default value is \c false. +*/ +bool QQuickPlatformSystemTrayIcon::isVisible() const +{ + return m_visible; +} + +void QQuickPlatformSystemTrayIcon::setVisible(bool visible) +{ + if (m_visible == visible) + return; + + if (m_handle && m_complete) { + if (visible) + init(); + else + cleanup(); + } + + m_visible = visible; + emit visibleChanged(); +} + +/*! + \qmlproperty url Qt.labs.platform::SystemTrayIcon::iconSource + + This property holds the url of the system tray icon. + + \sa iconName +*/ +QUrl QQuickPlatformSystemTrayIcon::iconSource() const +{ + if (!m_iconLoader) + return QUrl(); + + return m_iconLoader->iconSource(); +} + +void QQuickPlatformSystemTrayIcon::setIconSource(const QUrl& source) +{ + if (source == iconSource()) + return; + + iconLoader()->setIconSource(source); + emit iconSourceChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::SystemTrayIcon::iconName + + This property holds the theme name of the system tray icon. + + \sa iconSource, QIcon::fromTheme() +*/ +QString QQuickPlatformSystemTrayIcon::iconName() const +{ + if (!m_iconLoader) + return QString(); + + return m_iconLoader->iconName(); +} + +void QQuickPlatformSystemTrayIcon::setIconName(const QString& name) +{ + if (name == iconName()) + return; + + iconLoader()->setIconName(name); + emit iconNameChanged(); +} + +/*! + \qmlproperty string Qt.labs.platform::SystemTrayIcon::tooltip + + This property holds the tooltip of the system tray icon. +*/ +QString QQuickPlatformSystemTrayIcon::tooltip() const +{ + return m_tooltip; +} + +void QQuickPlatformSystemTrayIcon::setTooltip(const QString &tooltip) +{ + if (m_tooltip == tooltip) + return; + + if (m_handle && m_complete) + m_handle->updateToolTip(tooltip); + + m_tooltip = tooltip; + emit tooltipChanged(); +} + +/*! + \qmlproperty Menu Qt.labs.platform::SystemTrayIcon::menu + + This property holds a menu for the system tray icon. +*/ +QQuickPlatformMenu *QQuickPlatformSystemTrayIcon::menu() const +{ + return m_menu; +} + +void QQuickPlatformSystemTrayIcon::setMenu(QQuickPlatformMenu *menu) +{ + if (m_menu == menu) + return; + + if (m_menu) + m_menu->setSystemTrayIcon(nullptr); + if (menu) { + menu->setSystemTrayIcon(this); + if (m_handle && m_complete && menu->create()) + m_handle->updateMenu(menu->handle()); + } + + m_menu = menu; + emit menuChanged(); +} + +/*! + \qmlmethod void Qt.labs.platform::SystemTrayIcon::show() + + Shows the system tray icon. +*/ +void QQuickPlatformSystemTrayIcon::show() +{ + setVisible(true); +} + +/*! + \qmlmethod void Qt.labs.platform::SystemTrayIcon::hide() + + Hides the system tray icon. +*/ +void QQuickPlatformSystemTrayIcon::hide() +{ + setVisible(false); +} + +/*! + \qmlmethod void Qt.labs.platform::SystemTrayIcon::showMessage(string title, string message, MessageIcon icon, int msecs) + + Shows a system tray message with the given \a title, \a message and \a icon + for the time specified in \a msecs. + + \note System tray messages are dependent on the system configuration and user preferences, + and may not appear at all. Therefore, it should not be relied upon as the sole means for providing + critical information. + + \sa supportsMessages, messageClicked() +*/ +void QQuickPlatformSystemTrayIcon::showMessage(const QString &title, const QString &msg, QPlatformSystemTrayIcon::MessageIcon icon, int msecs) +{ + if (m_handle) + m_handle->showMessage(title, msg, QIcon(), icon, msecs); +} + +void QQuickPlatformSystemTrayIcon::init() +{ + if (!m_handle) + return; + + m_handle->init(); + if (m_menu && m_menu->create()) + m_handle->updateMenu(m_menu->handle()); + m_handle->updateToolTip(m_tooltip); + if (m_iconLoader) + m_iconLoader->setEnabled(true); +} + +void QQuickPlatformSystemTrayIcon::cleanup() +{ + if (m_handle) + m_handle->cleanup(); + if (m_iconLoader) + m_iconLoader->setEnabled(false); +} + +void QQuickPlatformSystemTrayIcon::classBegin() +{ +} + +void QQuickPlatformSystemTrayIcon::componentComplete() +{ + m_complete = true; + if (m_visible) + init(); +} + +QQuickPlatformIconLoader *QQuickPlatformSystemTrayIcon::iconLoader() const +{ + if (!m_iconLoader) { + QQuickPlatformSystemTrayIcon *that = const_cast<QQuickPlatformSystemTrayIcon *>(this); + static int slot = staticMetaObject.indexOfSlot("updateIcon()"); + m_iconLoader = new QQuickPlatformIconLoader(slot, that); + m_iconLoader->setEnabled(m_complete); + } + return m_iconLoader; +} + +void QQuickPlatformSystemTrayIcon::updateIcon() +{ + if (!m_handle || !m_iconLoader) + return; + + m_handle->updateIcon(m_iconLoader->icon()); +} + +QT_END_NAMESPACE diff --git a/src/imports/platform/qquickplatformsystemtrayicon_p.h b/src/imports/platform/qquickplatformsystemtrayicon_p.h new file mode 100644 index 00000000..12597c72 --- /dev/null +++ b/src/imports/platform/qquickplatformsystemtrayicon_p.h @@ -0,0 +1,139 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs Platform module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKPLATFORMSYSTEMTRAYICON_P_H +#define QQUICKPLATFORMSYSTEMTRAYICON_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qurl.h> +#include <QtGui/qpa/qplatformsystemtrayicon.h> +#include <QtQml/qqmlparserstatus.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickPlatformMenu; +class QQuickPlatformIconLoader; + +class QQuickPlatformSystemTrayIcon : public QObject, public QQmlParserStatus +{ + Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + Q_PROPERTY(bool available READ isAvailable CONSTANT FINAL) + Q_PROPERTY(bool supportsMessages READ supportsMessages CONSTANT FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(QUrl iconSource READ iconSource WRITE setIconSource NOTIFY iconSourceChanged FINAL) + Q_PROPERTY(QString iconName READ iconName WRITE setIconName NOTIFY iconNameChanged FINAL) + Q_PROPERTY(QString tooltip READ tooltip WRITE setTooltip NOTIFY tooltipChanged FINAL) + Q_PROPERTY(QQuickPlatformMenu *menu READ menu WRITE setMenu NOTIFY menuChanged FINAL) + Q_ENUMS(QPlatformSystemTrayIcon::ActivationReason QPlatformSystemTrayIcon::MessageIcon) + +public: + explicit QQuickPlatformSystemTrayIcon(QObject *parent = nullptr); + ~QQuickPlatformSystemTrayIcon(); + + QPlatformSystemTrayIcon *handle() const; + + bool isAvailable() const; + bool supportsMessages() const; + + bool isVisible() const; + void setVisible(bool visible); + + QUrl iconSource() const; + void setIconSource(const QUrl &source); + + QString iconName() const; + void setIconName(const QString &name); + + QString tooltip() const; + void setTooltip(const QString &tooltip); + + QQuickPlatformMenu *menu() const; + void setMenu(QQuickPlatformMenu *menu); + +public Q_SLOTS: + void show(); + void hide(); + + void showMessage(const QString &title, const QString &message, + QPlatformSystemTrayIcon::MessageIcon iconType = QPlatformSystemTrayIcon::Information, int msecs = 10000); + +Q_SIGNALS: + void activated(QPlatformSystemTrayIcon::ActivationReason reason); + void messageClicked(); + void visibleChanged(); + void iconSourceChanged(); + void iconNameChanged(); + void tooltipChanged(); + void menuChanged(); + +protected: + void init(); + void cleanup(); + + void classBegin() override; + void componentComplete() override; + + QQuickPlatformIconLoader *iconLoader() const; + +private Q_SLOTS: + void updateIcon(); + +private: + bool m_complete; + bool m_visible; + QString m_tooltip; + QQuickPlatformMenu *m_menu; + mutable QQuickPlatformIconLoader *m_iconLoader; + QPlatformSystemTrayIcon *m_handle; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickPlatformSystemTrayIcon) + +#endif // QQUICKPLATFORMSYSTEMTRAYICON_P_H diff --git a/src/imports/platform/qtlabsplatformplugin.cpp b/src/imports/platform/qtlabsplatformplugin.cpp index 05199971..545e2c6e 100644 --- a/src/imports/platform/qtlabsplatformplugin.cpp +++ b/src/imports/platform/qtlabsplatformplugin.cpp @@ -42,6 +42,8 @@ #include "qquickplatformmenuitem_p.h" #include "qquickplatformmenuitemgroup_p.h" +#include "qquickplatformsystemtrayicon_p.h" + static inline void initResources() { #ifdef QT_STATIC @@ -72,6 +74,8 @@ void QtLabsPlatformPlugin::registerTypes(const char *uri) qmlRegisterType<QQuickPlatformMenuBar>(uri, 1, 0, "MenuBar"); qmlRegisterType<QQuickPlatformMenuItem>(uri, 1, 0, "MenuItem"); qmlRegisterType<QQuickPlatformMenuItemGroup>(uri, 1, 0, "MenuItemGroup"); + + qmlRegisterType<QQuickPlatformSystemTrayIcon>(uri, 1, 0, "SystemTrayIcon"); } QT_END_NAMESPACE |