summaryrefslogtreecommitdiff
path: root/src/controls/Menu.qml
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@digia.com>2013-09-05 17:29:10 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-13 14:56:38 +0200
commit4eb3400843cafcedffa47fb8a272704bca4e9473 (patch)
tree6541694bca4cca47ea8fa8b4cc8db38fb3ead11a /src/controls/Menu.qml
parent82081e737038262c82c2e408d412fc80a607bf9f (diff)
downloadqtquickcontrols-4eb3400843cafcedffa47fb8a272704bca4e9473.tar.gz
Menu: Enable mnemonic menu navigation
We also added a new mnemonic specific shortcut context matcher. This prevents two menu items with the same mnemonic but within different menus to be reported as ambiguous. Task-number: QTBUG-33030 ChangeLog: Added mnemonic navigation for menus Change-Id: I192c9aacba4d15851fe65bf9201251962fe976d5 Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
Diffstat (limited to 'src/controls/Menu.qml')
-rw-r--r--src/controls/Menu.qml51
1 files changed, 39 insertions, 12 deletions
diff --git a/src/controls/Menu.qml b/src/controls/Menu.qml
index 6c9f8fd2..525b0737 100644
--- a/src/controls/Menu.qml
+++ b/src/controls/Menu.qml
@@ -133,7 +133,7 @@ MenuPrivate {
property Component style: Qt.createComponent(Settings.style + "/MenuStyle.qml", root)
/*! \internal */
- property var __menuBar: null
+ property var __parentContentItem: __parentMenu.__contentItem
/*! \internal */
property int __currentIndex: -1
/*! \internal */
@@ -144,6 +144,8 @@ MenuPrivate {
sourceComponent: __menuComponent
active: !root.__isNative && root.__popupVisible
focus: true
+ Keys.forwardTo: item ? [item, root.__parentContentItem] : []
+ property bool altPressed: root.__parentContentItem ? root.__parentContentItem.altPressed : false
}
/*! \internal */
@@ -174,14 +176,30 @@ MenuPrivate {
}
focus: true
- Keys.forwardTo: __menuBar ? [__menuBar] : []
+ property var mnemonicsMap: ({})
+
+ Keys.onPressed: {
+ var item = null
+ if (!(event.modifiers & Qt.AltModifier)
+ && (item = mnemonicsMap[event.text.toUpperCase()])) {
+ if (item.isSubmenu) {
+ root.__currentIndex = item.menuItemIndex
+ item.showSubMenu(true)
+ item.menuItem.__currentIndex = 0
+ } else {
+ triggerAndDismiss(item)
+ }
+ event.accepted = true
+ } else {
+ event.accepted = false
+ }
+ }
+
Keys.onEscapePressed: root.__dismissMenu()
Keys.onDownPressed: {
- if (root.__currentIndex < 0) {
- root.__currentIndex = 0
- return
- }
+ if (root.__currentIndex < 0)
+ root.__currentIndex = -1
for (var i = root.__currentIndex + 1;
i < root.items.length && !canBeHovered(i); i++)
@@ -204,13 +222,13 @@ MenuPrivate {
}
Keys.onLeftPressed: {
- if (root.__parentMenu)
+ if ((event.accepted = root.__parentMenu.hasOwnProperty("title")))
__closeMenu()
}
Keys.onRightPressed: {
var item = itemsRepeater.itemAt(root.__currentIndex)
- if (item && item.isSubmenu) {
+ if ((event.accepted = (item && item.isSubmenu))) {
item.showSubMenu(true)
item.menuItem.__currentIndex = 0
}
@@ -220,8 +238,9 @@ MenuPrivate {
Keys.onReturnPressed: menuFrameLoader.triggerAndDismiss()
Keys.onEnterPressed: menuFrameLoader.triggerAndDismiss()
- function triggerAndDismiss() {
- var item = itemsRepeater.itemAt(root.__currentIndex)
+ function triggerAndDismiss(item) {
+ if (!item)
+ item = itemsRepeater.itemAt(root.__currentIndex)
if (item && !item.isSeparator) {
root.__dismissMenu()
if (!item.isSubmenu)
@@ -261,7 +280,7 @@ MenuPrivate {
var itemUnderMouse = column.childAt(pos.x, pos.y)
if (itemUnderMouse) {
currentItem = itemUnderMouse
- } else {
+ } else if (currentItem) {
var itemItem = currentItem.item
if (!itemItem.contains(itemItem.mapFromItem(column, pos)))
currentItem = null
@@ -294,6 +313,7 @@ MenuPrivate {
readonly property bool isSubmenu: !!menuItem && menuItem.type === MenuItemType.Menu
property bool selected: !isSeparator && root.__currentIndex === index
property string text: isSubmenu ? menuItem.title : !isSeparator ? menuItem.text : ""
+ property bool showUnderlined: __contentItem.altPressed
property int menuItemIndex: index
@@ -328,7 +348,14 @@ MenuPrivate {
}
}
- Component.onCompleted: menuItem.__visualItem = menuItemLoader
+ Component.onCompleted: {
+ menuItem.__visualItem = menuItemLoader
+
+ var title = text
+ var ampersandPos = title.indexOf("&")
+ if (ampersandPos !== -1)
+ menuFrameLoader.mnemonicsMap[title[ampersandPos + 1].toUpperCase()] = menuItemLoader
+ }
}
}