From c994eb1daf96e8c51be33890e7d686806ebea01e Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Tue, 2 Jun 2020 16:37:19 +0300 Subject: [PATCH] [3.2] Fix macOS global menu removal and preserve order. --- platform/osx/os_osx.h | 1 + platform/osx/os_osx.mm | 39 +++++++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h index 190dbcf6620..fb895595e64 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -170,6 +170,7 @@ public: }; Map > global_menus; + List global_menus_order; void _update_global_menu(); diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index df3e57e2829..2b4cf769851 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -1321,34 +1321,39 @@ void OS_OSX::_update_global_menu() { NSMenu *main_menu = [NSApp mainMenu]; - for (int i = 1; i < [main_menu numberOfItems]; i++) { + for (int i = [main_menu numberOfItems] - 1; i > 0; i--) { [main_menu removeItemAtIndex:i]; } - for (Map >::Element *E = global_menus.front(); E; E = E->next()) { - if (E->key() != "_dock") { - NSMenu *menu = [[[NSMenu alloc] initWithTitle:[NSString stringWithUTF8String:E->key().utf8().get_data()]] autorelease]; - for (int i = 0; i < E->get().size(); i++) { - if (E->get()[i].label == String()) { - [menu addItem:[NSMenuItem separatorItem]]; - } else { - NSMenuItem *menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:E->get()[i].label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:@""]; - [menu_item setRepresentedObject:[NSValue valueWithPointer:&(E->get()[i])]]; - } + for (List::Element *E = global_menus_order.front(); E; E = E->next()) { + Vector &items = global_menus[E->get()]; + NSMenu *menu = [[[NSMenu alloc] initWithTitle:[NSString stringWithUTF8String:E->get().utf8().get_data()]] autorelease]; + for (int i = 0; i < items.size(); i++) { + if (items[i].label == String()) { + [menu addItem:[NSMenuItem separatorItem]]; + } else { + NSMenuItem *menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:items[i].label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:@""]; + [menu_item setRepresentedObject:[NSValue valueWithPointer:&(items[i])]]; } - NSMenuItem *menu_item = [main_menu addItemWithTitle:[NSString stringWithUTF8String:E->key().utf8().get_data()] action:nil keyEquivalent:@""]; - [main_menu setSubmenu:menu forItem:menu_item]; } + NSMenuItem *menu_item = [main_menu addItemWithTitle:[NSString stringWithUTF8String:E->get().utf8().get_data()] action:nil keyEquivalent:@""]; + [main_menu setSubmenu:menu forItem:menu_item]; } } void OS_OSX::global_menu_add_item(const String &p_menu, const String &p_label, const Variant &p_signal, const Variant &p_meta) { + if (!global_menus.has(p_menu) && (p_menu != "_dock")) { + global_menus_order.push_back(p_menu); + } global_menus[p_menu].push_back(GlobalMenuItem(p_label, p_signal, p_meta)); _update_global_menu(); } void OS_OSX::global_menu_add_separator(const String &p_menu) { + if (!global_menus.has(p_menu) && (p_menu != "_dock")) { + global_menus_order.push_back(p_menu); + } global_menus[p_menu].push_back(GlobalMenuItem()); _update_global_menu(); } @@ -1363,7 +1368,13 @@ void OS_OSX::global_menu_remove_item(const String &p_menu, int p_idx) { void OS_OSX::global_menu_clear(const String &p_menu) { - global_menus[p_menu].clear(); + if (global_menus.has(p_menu)) { + global_menus[p_menu].clear(); + if (p_menu != "_dock") { + global_menus.erase(p_menu); + global_menus_order.erase(p_menu); + } + } _update_global_menu(); }