summaryrefslogtreecommitdiffstats
path: root/src/controls/qquickaction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/controls/qquickaction.cpp')
-rw-r--r--src/controls/qquickaction.cpp37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/controls/qquickaction.cpp b/src/controls/qquickaction.cpp
index e240d1117..6a031404e 100644
--- a/src/controls/qquickaction.cpp
+++ b/src/controls/qquickaction.cpp
@@ -41,6 +41,7 @@
#include "qquickaction_p.h"
#include "qquickexclusivegroup_p.h"
+#include "qquickmenuitem_p.h"
#include <QtGui/qguiapplication.h>
#include <QtQuick/qquickitem.h>
@@ -203,6 +204,8 @@ void QQuickAction::setText(const QString &text)
emit textChanged();
}
+namespace {
+
bool qShortcutContextMatcher(QObject *o, Qt::ShortcutContext context)
{
switch (context) {
@@ -226,6 +229,38 @@ bool qShortcutContextMatcher(QObject *o, Qt::ShortcutContext context)
return false;
}
+bool qMnemonicContextMatcher(QObject *o, Qt::ShortcutContext context)
+{
+ switch (context) {
+ case Qt::ApplicationShortcut:
+ return true;
+ case Qt::WindowShortcut: {
+ QObject *w = o;
+ while (w && !w->isWindowType()) {
+ w = w->parent();
+ if (QQuickItem * item = qobject_cast<QQuickItem*>(w))
+ w = item->window();
+ else if (QQuickMenuBase *mb = qobject_cast<QQuickMenuBase *>(w)) {
+ QQuickItem *vi = mb->visualItem();
+ if (vi && vi->isVisible())
+ w = vi->window();
+ else
+ break; // Non visible menu objects don't get mnemonic match
+ }
+ }
+ if (w && w == QGuiApplication::focusWindow())
+ return true;
+ }
+ case Qt::WidgetShortcut:
+ case Qt::WidgetWithChildrenShortcut:
+ break;
+ }
+
+ return false;
+}
+
+} // namespace
+
QString QQuickAction::shortcut() const
{
return m_shortcut.toString(QKeySequence::NativeText);
@@ -262,7 +297,7 @@ void QQuickAction::setMnemonicFromText(const QString &text)
if (!m_mnemonic.isEmpty()) {
Qt::ShortcutContext context = Qt::WindowShortcut;
- QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(this, m_mnemonic, context, qShortcutContextMatcher);
+ QGuiApplicationPrivate::instance()->shortcutMap.addShortcut(this, m_mnemonic, context, qMnemonicContextMatcher);
}
}