aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@qt.io>2020-05-27 10:14:18 +0200
committerAndy Shaw <andy.shaw@qt.io>2020-05-28 08:40:52 +0200
commit7f820ab2949dd6f0595b916192279745aafe4d71 (patch)
tree87e1cc7f59beb6c487558008826c70f5258834be
parentdc6b423a2f642052dbd38de0d8b76ed7435e77fa (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.pro2
-rw-r--r--src/imports/platform/qquickplatformmenuitem.cpp34
-rw-r--r--src/imports/platform/qquickplatformmenuitem_p.h2
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;