Skip to content

Commit c4bc711

Browse files
Restore menu item focus for accessibility, fix DropdownMenu.
Re-enable setFocus() in menu item selection for screen reader support. Save and restore the previously focused widget in DropdownMenu so that focus returns correctly when the menu hides.
1 parent 034d262 commit c4bc711

3 files changed

Lines changed: 19 additions & 3 deletions

File tree

ui/widgets/dropdown_menu.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "ui/widgets/dropdown_menu.h"
88

99
#include <QtGui/QtEvents>
10+
#include <QtWidgets/QApplication>
1011

1112
namespace Ui {
1213

@@ -31,6 +32,15 @@ DropdownMenu::DropdownMenu(QWidget *parent, const style::DropdownMenu &st) : Inn
3132
//}
3233

3334
void DropdownMenu::init() {
35+
QObject::connect(
36+
qApp,
37+
&QApplication::focusChanged,
38+
this,
39+
[this](QWidget *old, QWidget *now) {
40+
if (now && isAncestorOf(now) && old && !isAncestorOf(old)) {
41+
_previousFocusWidget = old;
42+
}
43+
});
3444
InnerDropdown::setHiddenCallback([this] { hideFinish(); });
3545

3646
_menu->resizesFromInner(
@@ -233,6 +243,10 @@ void DropdownMenu::childHiding(DropdownMenu *child) {
233243

234244
void DropdownMenu::hideFinish() {
235245
_menu->clearSelection();
246+
if (const auto widget = _previousFocusWidget.data()) {
247+
widget->setFocus();
248+
_previousFocusWidget = nullptr;
249+
}
236250
if (const auto onstack = _hiddenCallback) {
237251
onstack();
238252
}

ui/widgets/dropdown_menu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ class DropdownMenu : public InnerDropdown {
9494

9595
SubmenuPointer _activeSubmenu;
9696

97+
QPointer<QWidget> _previousFocusWidget;
98+
9799
bool _deleteOnHide = false;
98100
bool _triggering = false;
99101
bool _deleteLater = false;

ui/widgets/menu/menu_item_base.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ void ItemBase::setSelected(
3838
_selected = selected;
3939
update();
4040
if (selected) {
41-
//setFocus();
42-
//QAccessibleEvent event(this, QAccessible::Focus);
43-
//QAccessible::updateAccessibility(&event);
41+
setFocus();
42+
QAccessibleEvent event(this, QAccessible::Focus);
43+
QAccessible::updateAccessibility(&event);
4444
}
4545
}
4646
}

0 commit comments

Comments
 (0)