From 93b4d20c592ad22e2a3761d48b5b361d3d1351be Mon Sep 17 00:00:00 2001 From: "trop[bot]" Date: Fri, 8 Feb 2019 15:12:34 -0800 Subject: [PATCH] fix: display empty menu item for non-visible submenus (backport: 4-0-x) (#16847) * fix: display empty menu item for nonvisible submenus * use Chromium UI string ID --- atom/browser/ui/cocoa/atom_menu_controller.mm | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/atom/browser/ui/cocoa/atom_menu_controller.mm b/atom/browser/ui/cocoa/atom_menu_controller.mm index 518b1c0d29414..16136fc435c35 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -15,6 +15,7 @@ #include "ui/base/l10n/l10n_util_mac.h" #include "ui/events/cocoa/cocoa_event_utils.h" #include "ui/gfx/image/image.h" +#include "ui/strings/grit/ui_strings.h" using content::BrowserThread; @@ -56,6 +57,29 @@ {@selector(clearRecentDocuments:), "clearrecentdocuments"}, }; +// Called when adding a submenu to the menu and checks if the submenu, via its +// |model|, has visible child items. +bool MenuHasVisibleItems(const atom::AtomMenuModel* model) { + int count = model->GetItemCount(); + for (int index = 0; index < count; index++) { + if (model->IsVisibleAt(index)) + return true; + } + return false; +} + +// Called when an empty submenu is created. This inserts a menu item labeled +// "(empty)" into the submenu. Matches Windows behavior. +NSMenu* MakeEmptySubmenu() { + base::scoped_nsobject submenu([[NSMenu alloc] initWithTitle:@""]); + NSString* empty_menu_title = + l10n_util::GetNSString(IDS_APP_MENU_EMPTY_SUBMENU); + + [submenu addItemWithTitle:empty_menu_title action:NULL keyEquivalent:@""]; + [[submenu itemAtIndex:0] setEnabled:NO]; + return submenu.autorelease(); +} + } // namespace // Menu item is located for ease of removing it from the parent owner @@ -224,7 +248,9 @@ - (void)addItemToMenu:(NSMenu*)menu [item setAction:nil]; atom::AtomMenuModel* submenuModel = static_cast(model->GetSubmenuModelAt(index)); - NSMenu* submenu = [self menuFromModel:submenuModel]; + NSMenu* submenu = MenuHasVisibleItems(submenuModel) + ? [self menuFromModel:submenuModel] + : MakeEmptySubmenu(); [submenu setTitle:[item title]]; [item setSubmenu:submenu];