diff --git a/ui/widgets/dropdown_menu.cpp b/ui/widgets/dropdown_menu.cpp index 996536ec..00a917e7 100644 --- a/ui/widgets/dropdown_menu.cpp +++ b/ui/widgets/dropdown_menu.cpp @@ -7,6 +7,7 @@ #include "ui/widgets/dropdown_menu.h" #include +#include namespace Ui { @@ -31,6 +32,15 @@ DropdownMenu::DropdownMenu(QWidget *parent, const style::DropdownMenu &st) : Inn //} void DropdownMenu::init() { + QObject::connect( + qApp, + &QApplication::focusChanged, + this, + [this](QWidget *old, QWidget *now) { + if (now && isAncestorOf(now) && old && !isAncestorOf(old)) { + _previousFocusWidget = old; + } + }); InnerDropdown::setHiddenCallback([this] { hideFinish(); }); _menu->resizesFromInner( @@ -233,6 +243,10 @@ void DropdownMenu::childHiding(DropdownMenu *child) { void DropdownMenu::hideFinish() { _menu->clearSelection(); + if (const auto widget = _previousFocusWidget.data()) { + widget->setFocus(); + _previousFocusWidget = nullptr; + } if (const auto onstack = _hiddenCallback) { onstack(); } diff --git a/ui/widgets/dropdown_menu.h b/ui/widgets/dropdown_menu.h index d31451bd..4529483b 100644 --- a/ui/widgets/dropdown_menu.h +++ b/ui/widgets/dropdown_menu.h @@ -94,6 +94,8 @@ class DropdownMenu : public InnerDropdown { SubmenuPointer _activeSubmenu; + QPointer _previousFocusWidget; + bool _deleteOnHide = false; bool _triggering = false; bool _deleteLater = false; diff --git a/ui/widgets/menu/menu_item_base.cpp b/ui/widgets/menu/menu_item_base.cpp index 26d4a330..ffba63b8 100644 --- a/ui/widgets/menu/menu_item_base.cpp +++ b/ui/widgets/menu/menu_item_base.cpp @@ -38,9 +38,9 @@ void ItemBase::setSelected( _selected = selected; update(); if (selected) { - //setFocus(); - //QAccessibleEvent event(this, QAccessible::Focus); - //QAccessible::updateAccessibility(&event); + setFocus(); + QAccessibleEvent event(this, QAccessible::Focus); + QAccessible::updateAccessibility(&event); } } }