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/MenuBar.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/MenuBar.qml')
-rw-r--r-- | src/controls/MenuBar.qml | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/src/controls/MenuBar.qml b/src/controls/MenuBar.qml index eabb4d48..a126c7c6 100644 --- a/src/controls/MenuBar.qml +++ b/src/controls/MenuBar.qml @@ -82,6 +82,8 @@ MenuBarPrivate { sourceComponent: __menuBarComponent active: !root.__isNative focus: true + Keys.forwardTo: [item] + property bool altPressed: item ? item.altPressed : false } /*! \internal */ @@ -118,7 +120,51 @@ MenuBarPrivate { value: menuMouseArea.z - 1 } - focus: openedMenuIndex !== -1 + focus: true + + property bool altPressed: false + property bool altPressedAgain: false + property var mnemonicsMap: ({}) + + Keys.onPressed: { + var action = null + if (event.key === Qt.Key_Alt) { + if (!altPressed) + altPressed = true + else + altPressedAgain = true + } else if (altPressed && (action = mnemonicsMap[event.text.toUpperCase()])) { + preselectMenuItem = true + action.trigger() + event.accepted = true + } + } + + function dismissActiveFocus(event, reason) { + if (reason) { + altPressedAgain = false + altPressed = false + openedMenuIndex = -1 + root.__contentItem.parent.forceActiveFocus() + } else { + event.accepted = false + } + } + + Keys.onReleased: dismissActiveFocus(event, altPressedAgain && openedMenuIndex === -1) + Keys.onEscapePressed: dismissActiveFocus(event, openedMenuIndex === -1) + + function maybeOpenFirstMenu(event) { + if (altPressed && openedMenuIndex === -1) { + preselectMenuItem = true + openedMenuIndex = 0 + } else { + event.accepted = false + } + } + + Keys.onUpPressed: maybeOpenFirstMenu(event) + Keys.onDownPressed: maybeOpenFirstMenu(event) Keys.onLeftPressed: { if (openedMenuIndex > 0) { @@ -128,7 +174,7 @@ MenuBarPrivate { } Keys.onRightPressed: { - if (openedMenuIndex < root.menus.length - 1) { + if (openedMenuIndex !== -1 && openedMenuIndex < root.menus.length - 1) { preselectMenuItem = true openedMenuIndex++ } @@ -177,6 +223,7 @@ MenuBarPrivate { property var menuItem: modelData property bool selected: menuMouseArea.hoveredItem === menuItemLoader property bool sunken: menuItem.__popupVisible || menuBarLoader.openedMenuIndex === index + property bool showUnderlined: menuBarLoader.altPressed sourceComponent: menuBarLoader.menuItemStyle property int menuItemIndex: index @@ -203,9 +250,18 @@ MenuBarPrivate { } } + Connections { + target: menuItem.__action + onTriggered: menuBarLoader.openedMenuIndex = menuItemIndex + } + Component.onCompleted: { menuItem.__visualItem = menuItemLoader - menuItem.__menuBar = menuBarLoader + + var title = menuItem.title + var ampersandPos = title.indexOf("&") + if (ampersandPos !== -1) + menuBarLoader.mnemonicsMap[title[ampersandPos + 1].toUpperCase()] = menuItem.__action } } } |