From 763b51d494b708790acc3c3f797313f29d09976b Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Mon, 28 Jan 2019 13:14:30 +0100 Subject: Menu: fix disabled sub-menu items being highlighted When a menu item with a sub-menu was triggered by key or mouse, it would open the sub-menu with the first menu item highlighted. This doesn't make sense for disabled menu items, so this patch makes it find the first enabled item. Change-Id: I9df1c750749e5a77b027b6f476b8ae1f5ea035bd Fixes: QTBUG-69540 Reviewed-by: Richard Moe Gustavsen --- src/quicktemplates2/qquickmenu.cpp | 27 +++++++++++++++++++++++---- src/quicktemplates2/qquickmenu_p_p.h | 2 ++ 2 files changed, 25 insertions(+), 4 deletions(-) (limited to 'src/quicktemplates2') diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index f52405c9..4bed851c 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -468,10 +468,12 @@ void QQuickMenuPrivate::onItemTriggered() if (!item) return; - if (QQuickMenu *subMenu = item->subMenu()) - subMenu->popup(subMenu->itemAt(0)); - else + if (QQuickMenu *subMenu = item->subMenu()) { + auto subMenuPrivate = QQuickMenuPrivate::get(subMenu); + subMenu->popup(subMenuPrivate->firstEnabledMenuItem()); + } else { q->dismiss(); + } } void QQuickMenuPrivate::onItemActiveFocusChanged() @@ -621,6 +623,22 @@ bool QQuickMenuPrivate::activatePreviousItem() return false; } +QQuickMenuItem *QQuickMenuPrivate::firstEnabledMenuItem() const +{ + for (int i = 0; i < contentModel->count(); ++i) { + QQuickItem *item = itemAt(i); + if (!item || !item->isEnabled()) + continue; + + QQuickMenuItem *menuItem = qobject_cast(item); + if (!menuItem) + continue; + + return menuItem; + } + return nullptr; +} + void QQuickMenuPrivate::contentData_append(QQmlListProperty *prop, QObject *obj) { QQuickMenu *q = qobject_cast(prop->object); @@ -1419,7 +1437,8 @@ void QQuickMenu::keyPressEvent(QKeyEvent *event) } } else { if (QQuickMenu *subMenu = d->currentSubMenu()) { - subMenu->popup(subMenu->itemAt(0)); + auto subMenuPrivate = QQuickMenuPrivate::get(subMenu); + subMenu->popup(subMenuPrivate->firstEnabledMenuItem()); event->accept(); } } diff --git a/src/quicktemplates2/qquickmenu_p_p.h b/src/quicktemplates2/qquickmenu_p_p.h index 6146b960..ec48c919 100644 --- a/src/quicktemplates2/qquickmenu_p_p.h +++ b/src/quicktemplates2/qquickmenu_p_p.h @@ -115,6 +115,8 @@ public: bool activateNextItem(); bool activatePreviousItem(); + QQuickMenuItem *firstEnabledMenuItem() const; + static void contentData_append(QQmlListProperty *prop, QObject *obj); static int contentData_count(QQmlListProperty *prop); static QObject *contentData_at(QQmlListProperty *prop, int index); -- cgit v1.2.3