Merge pull request #39243 from bruvzg/mac_menu_3
[3.2] Fix macOS global menu removal and preserve order.
This commit is contained in:
commit
519fbbfdd4
|
@ -170,6 +170,7 @@ public:
|
|||
};
|
||||
|
||||
Map<String, Vector<GlobalMenuItem> > global_menus;
|
||||
List<String> global_menus_order;
|
||||
|
||||
void _update_global_menu();
|
||||
|
||||
|
|
|
@ -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<String, Vector<GlobalMenuItem> >::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()) {
|
||||
for (List<String>::Element *E = global_menus_order.front(); E; E = E->next()) {
|
||||
Vector<GlobalMenuItem> &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:E->get()[i].label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:@""];
|
||||
[menu_item setRepresentedObject:[NSValue valueWithPointer:&(E->get()[i])]];
|
||||
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:@""];
|
||||
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) {
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue