diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-06-08 20:19:50 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-06-09 09:42:39 +0000 |
commit | af96b35bf4487279357a76bd02a926c1b7f528bb (patch) | |
tree | ee9ce38b9080c922f1a13b52d0f05ab0eb093e1d /src/quicktemplates2/qquickmenu.cpp | |
parent | ca3b585bbe88feed516870ce3315c77e2f1b8d2e (diff) |
QQuickMenu: fix key navigation
Skip non-focusable separators, and use a key focus reason
(Qt::TabFocusReason & Qt::BacktabFocusReason) to give the
items visual focus.
[ChangeLog][Controls][Menu] Fixed key navigation to skip separators.
Change-Id: I99affabc50703c7363ab8146e5ced9b45111de00
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickmenu.cpp')
-rw-r--r-- | src/quicktemplates2/qquickmenu.cpp | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index 9e8fabe0..c40c49e1 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -254,6 +254,31 @@ void QQuickMenuPrivate::setCurrentIndex(int index) contentItem->setProperty("currentIndex", index); } +void QQuickMenuPrivate::activateNextItem() +{ + int index = currentIndex(); + int count = contentModel->count(); + while (++index < count) { + QQuickItem *item = itemAt(index); + if (!item || !item->activeFocusOnTab()) + continue; + item->forceActiveFocus(Qt::TabFocusReason); + break; + } +} + +void QQuickMenuPrivate::activatePreviousItem() +{ + int index = currentIndex(); + while (--index >= 0) { + QQuickItem *item = itemAt(index); + if (!item || !item->activeFocusOnTab()) + continue; + item->forceActiveFocus(Qt::BacktabFocusReason); + break; + } +} + void QQuickMenuPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj) { QQuickMenuPrivate *p = static_cast<QQuickMenuPrivate *>(prop->data); @@ -511,23 +536,16 @@ void QQuickMenu::keyReleaseEvent(QKeyEvent *event) // shown at once. switch (event->key()) { case Qt::Key_Up: - if (d->contentItem->metaObject()->indexOfMethod("decrementCurrentIndex()") != -1) - QMetaObject::invokeMethod(d->contentItem, "decrementCurrentIndex"); + d->activatePreviousItem(); break; case Qt::Key_Down: - if (d->contentItem->metaObject()->indexOfMethod("incrementCurrentIndex()") != -1) - QMetaObject::invokeMethod(d->contentItem, "incrementCurrentIndex"); + d->activateNextItem(); break; default: break; } - - int index = d->currentIndex(); - QQuickItem *item = itemAt(index); - if (item) - item->forceActiveFocus(); } QFont QQuickMenu::defaultFont() const |