diff options
Diffstat (limited to 'src/imports/platform/qquickplatformmenuitem.cpp')
-rw-r--r-- | src/imports/platform/qquickplatformmenuitem.cpp | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/src/imports/platform/qquickplatformmenuitem.cpp b/src/imports/platform/qquickplatformmenuitem.cpp index fa3fdafb..5a8b3798 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" @@ -120,6 +121,16 @@ QQuickPlatformMenuItem::~QQuickPlatformMenuItem() m_menu->removeItem(this); if (m_group) m_group->removeItem(this); +#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 delete m_iconLoader; m_iconLoader = nullptr; delete m_handle; @@ -165,8 +176,13 @@ void QQuickPlatformMenuItem::sync() m_handle->setText(m_text); m_handle->setFont(m_font); m_handle->setHasExclusiveGroup(m_group && m_group->isExclusive()); - if (m_subMenu && m_subMenu->handle()) - m_handle->setMenu(m_subMenu->handle()); + if (m_subMenu) { + // Sync first as dynamically created menus may need to get the + // handle recreated + m_subMenu->sync(); + if (m_subMenu->handle()) + m_handle->setMenu(m_subMenu->handle()); + } #if QT_CONFIG(shortcut) QKeySequence sequence; @@ -505,13 +521,50 @@ 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()); + if (!sequence.isEmpty()) { + m_shortcutId = QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(this, sequence, + Qt::WindowShortcut, QQuickShortcutContext::matcher); + } else { + m_shortcutId = -1; + } +#endif emit shortcutChanged(); } @@ -539,7 +592,6 @@ void QQuickPlatformMenuItem::setFont(const QFont& font) /*! \since Qt.labs.platform 1.1 (Qt 5.12) - \qmlpropertygroup Qt.labs.platform::MenuItem::icon \qmlproperty url Qt.labs.platform::MenuItem::icon.source \qmlproperty string Qt.labs.platform::MenuItem::icon.name \qmlproperty bool Qt.labs.platform::MenuItem::icon.mask |