From e5e9315ea2488131e9d485fe91ce287440466548 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Fri, 8 Feb 2019 09:41:11 -0800 Subject: [PATCH 1/2] fix: display empty menu item for nonvisible submenus --- 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 fe632fe24b333..c0192eec676c9 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -58,6 +58,30 @@ {@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:@""]); + base::string16 empty_menu_title = base::ASCIIToUTF16("(empty)"); + NSString* empty_menu_label = + l10n_util::FixUpWindowsStyleLabel(empty_menu_title); + + [submenu addItemWithTitle:empty_menu_label 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 @@ -226,7 +250,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]; From 5a2cb6ed19d8b3cddbaa5b838c048f2da0138323 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Fri, 8 Feb 2019 11:12:34 -0800 Subject: [PATCH 2/2] use Chromium UI string ID --- atom/browser/ui/cocoa/atom_menu_controller.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/atom/browser/ui/cocoa/atom_menu_controller.mm b/atom/browser/ui/cocoa/atom_menu_controller.mm index c0192eec676c9..04f0e20ba2f97 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -17,6 +17,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; @@ -73,11 +74,10 @@ bool MenuHasVisibleItems(const atom::AtomMenuModel* model) { // "(empty)" into the submenu. Matches Windows behavior. NSMenu* MakeEmptySubmenu() { base::scoped_nsobject submenu([[NSMenu alloc] initWithTitle:@""]); - base::string16 empty_menu_title = base::ASCIIToUTF16("(empty)"); - NSString* empty_menu_label = - l10n_util::FixUpWindowsStyleLabel(empty_menu_title); + NSString* empty_menu_title = + l10n_util::GetNSString(IDS_APP_MENU_EMPTY_SUBMENU); - [submenu addItemWithTitle:empty_menu_label action:NULL keyEquivalent:@""]; + [submenu addItemWithTitle:empty_menu_title action:NULL keyEquivalent:@""]; [[submenu itemAtIndex:0] setEnabled:NO]; return submenu.autorelease(); }