diff options
author | Gabriel de Dietrich <gabriel.dedietrich@digia.com> | 2013-09-05 17:29:10 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-13 14:56:38 +0200 |
commit | 4eb3400843cafcedffa47fb8a272704bca4e9473 (patch) | |
tree | 6541694bca4cca47ea8fa8b4cc8db38fb3ead11a /src/controls/Menu.qml | |
parent | 82081e737038262c82c2e408d412fc80a607bf9f (diff) | |
download | qtquickcontrols-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.qml | 51 |
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 + } } } |