diff options
author | Andy Shaw <andy.shaw@qt.io> | 2020-05-27 10:14:18 +0200 |
---|---|---|
committer | Andy Shaw <andy.shaw@qt.io> | 2020-05-28 08:40:52 +0200 |
commit | 7f820ab2949dd6f0595b916192279745aafe4d71 (patch) | |
tree | 87e1cc7f59beb6c487558008826c70f5258834be | |
parent | dc6b423a2f642052dbd38de0d8b76ed7435e77fa (diff) |
Account for single key shortcuts being used in the platform menus
When a single key shortcut is used then it does not go through the
usual channels for triggering. Therefore it needs to be registered as a
shortcut so it can be picked up when sent as a Shortcut event.
Change-Id: I93a48c633e1051f142b884d78bbca181c778f7b9
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
(cherry picked from commit cc3145b68cb0094caef30315205a0e62dcbb7ccf)
-rw-r--r-- | src/imports/platform/platform.pro | 2 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmenuitem.cpp | 34 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmenuitem_p.h | 2 |
3 files changed, 37 insertions, 1 deletions
diff --git a/src/imports/platform/platform.pro b/src/imports/platform/platform.pro index 06f34949..d9bcfcb8 100644 --- a/src/imports/platform/platform.pro +++ b/src/imports/platform/platform.pro @@ -3,7 +3,7 @@ TARGETPATH = Qt/labs/platform IMPORT_VERSION = 1.1 QT += qml quick -QT_PRIVATE += core-private gui-private qml-private quick-private +QT_PRIVATE += core-private gui-private qml-private quick-private quicktemplates2-private DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII diff --git a/src/imports/platform/qquickplatformmenuitem.cpp b/src/imports/platform/qquickplatformmenuitem.cpp index fa3fdafb..a1f17aa4 100644 --- a/src/imports/platform/qquickplatformmenuitem.cpp +++ b/src/imports/platform/qquickplatformmenuitem.cpp @@ -43,6 +43,7 @@ #include <QtGui/qkeysequence.h> #include <QtGui/qpa/qplatformtheme.h> #include <QtGui/private/qguiapplication_p.h> +#include <QtQuickTemplates2/private/qquickshortcutcontext_p_p.h> #include "widgets/qwidgetplatform_p.h" @@ -505,13 +506,46 @@ QVariant QQuickPlatformMenuItem::shortcut() const return m_shortcut; } +bool QQuickPlatformMenuItem::event(QEvent *e) +{ +#if QT_CONFIG(shortcut) + if (e->type() == QEvent::Shortcut) { + QShortcutEvent *se = static_cast<QShortcutEvent *>(e); + if (se->shortcutId() == m_shortcutId) { + activate(); + return true; + } + } +#endif + return QObject::event(e); +} + void QQuickPlatformMenuItem::setShortcut(const QVariant& shortcut) { if (m_shortcut == shortcut) return; +#if QT_CONFIG(shortcut) + if (m_shortcutId != -1) { + QKeySequence sequence; + if (m_shortcut.type() == QVariant::Int) + sequence = QKeySequence(static_cast<QKeySequence::StandardKey>(m_shortcut.toInt())); + else + sequence = QKeySequence::fromString(m_shortcut.toString()); + QGuiApplicationPrivate::instance()->shortcutMap.removeShortcut(m_shortcutId, this, sequence); + } +#endif m_shortcut = shortcut; sync(); +#if QT_CONFIG(shortcut) + QKeySequence sequence; + if (m_shortcut.type() == QVariant::Int) + sequence = QKeySequence(static_cast<QKeySequence::StandardKey>(m_shortcut.toInt())); + else + sequence = QKeySequence::fromString(m_shortcut.toString()); + m_shortcutId = QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(this, sequence, + Qt::WindowShortcut, QQuickShortcutContext::matcher); +#endif emit shortcutChanged(); } diff --git a/src/imports/platform/qquickplatformmenuitem_p.h b/src/imports/platform/qquickplatformmenuitem_p.h index f1143e64..e3d5258a 100644 --- a/src/imports/platform/qquickplatformmenuitem_p.h +++ b/src/imports/platform/qquickplatformmenuitem_p.h @@ -167,6 +167,7 @@ protected: QQuickPlatformIconLoader *iconLoader() const; + bool event(QEvent *e) override; private Q_SLOTS: void activate(); void updateIcon(); @@ -187,6 +188,7 @@ private: QQuickPlatformMenuItemGroup *m_group; mutable QQuickPlatformIconLoader *m_iconLoader; QPlatformMenuItem *m_handle; + int m_shortcutId = -1; friend class QQuickPlatformMenu; friend class QQuickPlatformMenuItemGroup; |