|
@@ -63,7 +63,7 @@
|
|
|
|
|
|
const NSMenu *DisplayServerMacOS::_get_menu_root(const String &p_menu_root) const {
|
|
|
const NSMenu *menu = nullptr;
|
|
|
- if (p_menu_root == "") {
|
|
|
+ if (p_menu_root == "" || p_menu_root.to_lower() == "_main") {
|
|
|
// Main menu.
|
|
|
menu = [NSApp mainMenu];
|
|
|
} else if (p_menu_root.to_lower() == "_dock") {
|
|
@@ -84,7 +84,7 @@ const NSMenu *DisplayServerMacOS::_get_menu_root(const String &p_menu_root) cons
|
|
|
|
|
|
NSMenu *DisplayServerMacOS::_get_menu_root(const String &p_menu_root) {
|
|
|
NSMenu *menu = nullptr;
|
|
|
- if (p_menu_root == "") {
|
|
|
+ if (p_menu_root == "" || p_menu_root.to_lower() == "_main") {
|
|
|
// Main menu.
|
|
|
menu = [NSApp mainMenu];
|
|
|
} else if (p_menu_root.to_lower() == "_dock") {
|
|
@@ -714,18 +714,51 @@ String DisplayServerMacOS::get_name() const {
|
|
|
return "macOS";
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_item(const String &p_menu_root, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
- _THREAD_SAFE_METHOD_
|
|
|
+bool DisplayServerMacOS::_has_help_menu() const {
|
|
|
+ if ([NSApp helpMenu]) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ NSMenu *menu = [NSApp mainMenu];
|
|
|
+ const NSMenuItem *menu_item = [menu itemAtIndex:[menu numberOfItems] - 1];
|
|
|
+ if (menu_item) {
|
|
|
+ String menu_name = String::utf8([[menu_item title] UTF8String]);
|
|
|
+ if (menu_name == "Help" || menu_name == RTR("Help")) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
+NSMenuItem *DisplayServerMacOS::_menu_add_item(const String &p_menu_root, const String &p_label, Key p_accel, int p_index, int *r_out) {
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
String keycode = KeyMappingMacOS::keycode_get_native_string(p_accel & KeyModifierMask::CODE_MASK);
|
|
|
NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
+ int item_count = ((menu == [NSApp mainMenu]) && _has_help_menu()) ? [menu numberOfItems] - 1 : [menu numberOfItems];
|
|
|
+ if ((menu == [NSApp mainMenu]) && (p_label == "Help" || p_label == RTR("Help"))) {
|
|
|
+ p_index = [menu numberOfItems];
|
|
|
+ } else if (p_index < 0) {
|
|
|
+ p_index = item_count;
|
|
|
} else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_index++;
|
|
|
+ }
|
|
|
+ p_index = CLAMP(p_index, 0, item_count);
|
|
|
}
|
|
|
+ menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
+ *r_out = (menu == [NSApp mainMenu]) ? p_index - 1 : p_index;
|
|
|
+ return menu_item;
|
|
|
+ }
|
|
|
+ return nullptr;
|
|
|
+}
|
|
|
+
|
|
|
+int DisplayServerMacOS::global_menu_add_item(const String &p_menu_root, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
+ _THREAD_SAFE_METHOD_
|
|
|
+
|
|
|
+ int out = -1;
|
|
|
+ NSMenuItem *menu_item = _menu_add_item(p_menu_root, p_label, p_accel, p_index, &out);
|
|
|
+ if (menu_item) {
|
|
|
GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
obj->callback = p_callback;
|
|
|
obj->meta = p_tag;
|
|
@@ -735,20 +768,15 @@ void DisplayServerMacOS::global_menu_add_item(const String &p_menu_root, const S
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
|
|
[menu_item setRepresentedObject:obj];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_check_item(const String &p_menu_root, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_check_item(const String &p_menu_root, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
- NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
- if (menu) {
|
|
|
- String keycode = KeyMappingMacOS::keycode_get_native_string(p_accel & KeyModifierMask::CODE_MASK);
|
|
|
- NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
- } else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
|
|
- }
|
|
|
+ int out = -1;
|
|
|
+ NSMenuItem *menu_item = _menu_add_item(p_menu_root, p_label, p_accel, p_index, &out);
|
|
|
+ if (menu_item) {
|
|
|
GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
obj->callback = p_callback;
|
|
|
obj->meta = p_tag;
|
|
@@ -758,20 +786,15 @@ void DisplayServerMacOS::global_menu_add_check_item(const String &p_menu_root, c
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
|
|
[menu_item setRepresentedObject:obj];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_icon_item(const String &p_menu_root, const Ref<Texture2D> &p_icon, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_icon_item(const String &p_menu_root, const Ref<Texture2D> &p_icon, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
- NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
- if (menu) {
|
|
|
- String keycode = KeyMappingMacOS::keycode_get_native_string(p_accel & KeyModifierMask::CODE_MASK);
|
|
|
- NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
- } else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
|
|
- }
|
|
|
+ int out = -1;
|
|
|
+ NSMenuItem *menu_item = _menu_add_item(p_menu_root, p_label, p_accel, p_index, &out);
|
|
|
+ if (menu_item) {
|
|
|
GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
obj->callback = p_callback;
|
|
|
obj->meta = p_tag;
|
|
@@ -790,20 +813,15 @@ void DisplayServerMacOS::global_menu_add_icon_item(const String &p_menu_root, co
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
|
|
[menu_item setRepresentedObject:obj];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_icon_check_item(const String &p_menu_root, const Ref<Texture2D> &p_icon, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_icon_check_item(const String &p_menu_root, const Ref<Texture2D> &p_icon, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
- NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
- if (menu) {
|
|
|
- String keycode = KeyMappingMacOS::keycode_get_native_string(p_accel & KeyModifierMask::CODE_MASK);
|
|
|
- NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
- } else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
|
|
- }
|
|
|
+ int out = -1;
|
|
|
+ NSMenuItem *menu_item = _menu_add_item(p_menu_root, p_label, p_accel, p_index, &out);
|
|
|
+ if (menu_item) {
|
|
|
GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
obj->callback = p_callback;
|
|
|
obj->meta = p_tag;
|
|
@@ -822,20 +840,15 @@ void DisplayServerMacOS::global_menu_add_icon_check_item(const String &p_menu_ro
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
|
|
[menu_item setRepresentedObject:obj];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_radio_check_item(const String &p_menu_root, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_radio_check_item(const String &p_menu_root, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
- NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
- if (menu) {
|
|
|
- String keycode = KeyMappingMacOS::keycode_get_native_string(p_accel & KeyModifierMask::CODE_MASK);
|
|
|
- NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
- } else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
|
|
- }
|
|
|
+ int out = -1;
|
|
|
+ NSMenuItem *menu_item = _menu_add_item(p_menu_root, p_label, p_accel, p_index, &out);
|
|
|
+ if (menu_item) {
|
|
|
GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
obj->callback = p_callback;
|
|
|
obj->meta = p_tag;
|
|
@@ -845,20 +858,15 @@ void DisplayServerMacOS::global_menu_add_radio_check_item(const String &p_menu_r
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
|
|
[menu_item setRepresentedObject:obj];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_icon_radio_check_item(const String &p_menu_root, const Ref<Texture2D> &p_icon, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_icon_radio_check_item(const String &p_menu_root, const Ref<Texture2D> &p_icon, const String &p_label, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
- NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
- if (menu) {
|
|
|
- String keycode = KeyMappingMacOS::keycode_get_native_string(p_accel & KeyModifierMask::CODE_MASK);
|
|
|
- NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
- } else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
|
|
- }
|
|
|
+ int out = -1;
|
|
|
+ NSMenuItem *menu_item = _menu_add_item(p_menu_root, p_label, p_accel, p_index, &out);
|
|
|
+ if (menu_item) {
|
|
|
GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
obj->callback = p_callback;
|
|
|
obj->meta = p_tag;
|
|
@@ -877,20 +885,31 @@ void DisplayServerMacOS::global_menu_add_icon_radio_check_item(const String &p_m
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
|
|
[menu_item setRepresentedObject:obj];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_multistate_item(const String &p_menu_root, const String &p_label, int p_max_states, int p_default_state, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_multistate_item(const String &p_menu_root, const String &p_label, int p_max_states, int p_default_state, const Callable &p_callback, const Variant &p_tag, Key p_accel, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
+ int out = -1;
|
|
|
if (menu) {
|
|
|
String keycode = KeyMappingMacOS::keycode_get_native_string(p_accel & KeyModifierMask::CODE_MASK);
|
|
|
NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
+ int item_count = ((menu == [NSApp mainMenu]) && _has_help_menu()) ? [menu numberOfItems] - 1 : [menu numberOfItems];
|
|
|
+ if ((menu == [NSApp mainMenu]) && (p_label == "Help" || p_label == RTR("Help"))) {
|
|
|
+ p_index = [menu numberOfItems];
|
|
|
+ } else if (p_index < 0) {
|
|
|
+ p_index = item_count;
|
|
|
} else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()]];
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_index++;
|
|
|
+ }
|
|
|
+ p_index = CLAMP(p_index, 0, item_count);
|
|
|
}
|
|
|
+ menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:@selector(globalMenuCallback:) keyEquivalent:[NSString stringWithUTF8String:keycode.utf8().get_data()] atIndex:p_index];
|
|
|
+ out = (menu == [NSApp mainMenu]) ? p_index - 1 : p_index;
|
|
|
+
|
|
|
GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
obj->callback = p_callback;
|
|
|
obj->meta = p_tag;
|
|
@@ -900,44 +919,69 @@ void DisplayServerMacOS::global_menu_add_multistate_item(const String &p_menu_ro
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
|
|
|
[menu_item setRepresentedObject:obj];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_submenu_item(const String &p_menu_root, const String &p_label, const String &p_submenu, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_submenu_item(const String &p_menu_root, const String &p_label, const String &p_submenu, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
NSMenu *sub_menu = _get_menu_root(p_submenu);
|
|
|
+ int out = -1;
|
|
|
if (menu && sub_menu) {
|
|
|
if (sub_menu == menu) {
|
|
|
ERR_PRINT("Can't set submenu to self!");
|
|
|
- return;
|
|
|
+ return -1;
|
|
|
}
|
|
|
if ([sub_menu supermenu]) {
|
|
|
ERR_PRINT("Can't set submenu to menu that is already a submenu of some other menu!");
|
|
|
- return;
|
|
|
+ return -1;
|
|
|
}
|
|
|
NSMenuItem *menu_item;
|
|
|
- if (p_index != -1) {
|
|
|
- menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:nil keyEquivalent:@"" atIndex:p_index];
|
|
|
+ int item_count = ((menu == [NSApp mainMenu]) && _has_help_menu()) ? [menu numberOfItems] - 1 : [menu numberOfItems];
|
|
|
+ if ((menu == [NSApp mainMenu]) && (p_label == "Help" || p_label == RTR("Help"))) {
|
|
|
+ p_index = [menu numberOfItems];
|
|
|
+ } else if (p_index < 0) {
|
|
|
+ p_index = item_count;
|
|
|
} else {
|
|
|
- menu_item = [menu addItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:nil keyEquivalent:@""];
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_index++;
|
|
|
+ }
|
|
|
+ p_index = CLAMP(p_index, 0, item_count);
|
|
|
}
|
|
|
+ menu_item = [menu insertItemWithTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()] action:nil keyEquivalent:@"" atIndex:p_index];
|
|
|
+ out = (menu == [NSApp mainMenu]) ? p_index - 1 : p_index;
|
|
|
+
|
|
|
+ GodotMenuItem *obj = [[GodotMenuItem alloc] init];
|
|
|
+ obj->callback = Callable();
|
|
|
+ obj->checkable_type = CHECKABLE_TYPE_NONE;
|
|
|
+ obj->max_states = 0;
|
|
|
+ obj->state = 0;
|
|
|
+ [menu_item setRepresentedObject:obj];
|
|
|
+
|
|
|
[sub_menu setTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()]];
|
|
|
[menu setSubmenu:sub_menu forItem:menu_item];
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
-void DisplayServerMacOS::global_menu_add_separator(const String &p_menu_root, int p_index) {
|
|
|
+int DisplayServerMacOS::global_menu_add_separator(const String &p_menu_root, int p_index) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if (p_index != -1) {
|
|
|
- [menu insertItem:[NSMenuItem separatorItem] atIndex:p_index];
|
|
|
+ if (menu == [NSApp mainMenu]) { // Do not add separators into main menu.
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ if (p_index < 0) {
|
|
|
+ p_index = [menu numberOfItems];
|
|
|
} else {
|
|
|
- [menu addItem:[NSMenuItem separatorItem]];
|
|
|
+ p_index = CLAMP(p_index, 0, [menu numberOfItems]);
|
|
|
}
|
|
|
+ [menu insertItem:[NSMenuItem separatorItem] atIndex:p_index];
|
|
|
+ return p_index;
|
|
|
}
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
int DisplayServerMacOS::global_menu_get_item_index_from_text(const String &p_menu_root, const String &p_text) const {
|
|
@@ -945,7 +989,11 @@ int DisplayServerMacOS::global_menu_get_item_index_from_text(const String &p_men
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- return [menu indexOfItemWithTitle:[NSString stringWithUTF8String:p_text.utf8().get_data()]];
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ return [menu indexOfItemWithTitle:[NSString stringWithUTF8String:p_text.utf8().get_data()]] - 1;
|
|
|
+ } else {
|
|
|
+ return [menu indexOfItemWithTitle:[NSString stringWithUTF8String:p_text.utf8().get_data()]];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return -1;
|
|
@@ -956,12 +1004,16 @@ int DisplayServerMacOS::global_menu_get_item_index_from_tag(const String &p_menu
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- for (NSInteger i = 0; i < [menu numberOfItems]; i++) {
|
|
|
+ for (NSInteger i = (menu == [NSApp mainMenu]) ? 1 : 0; i < [menu numberOfItems]; i++) {
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:i];
|
|
|
if (menu_item) {
|
|
|
const GodotMenuItem *obj = [menu_item representedObject];
|
|
|
if (obj && obj->meta == p_tag) {
|
|
|
- return i;
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ return i - 1;
|
|
|
+ } else {
|
|
|
+ return i;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -975,6 +1027,11 @@ bool DisplayServerMacOS::global_menu_is_item_checked(const String &p_menu_root,
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, false);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], false);
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
return ([menu_item state] == NSControlStateValueOn);
|
|
@@ -988,6 +1045,11 @@ bool DisplayServerMacOS::global_menu_is_item_checkable(const String &p_menu_root
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, false);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], false);
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
@@ -1004,6 +1066,11 @@ bool DisplayServerMacOS::global_menu_is_item_radio_checkable(const String &p_men
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, false);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], false);
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
@@ -1020,6 +1087,11 @@ Callable DisplayServerMacOS::global_menu_get_item_callback(const String &p_menu_
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, Callable());
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], Callable());
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
@@ -1036,6 +1108,11 @@ Variant DisplayServerMacOS::global_menu_get_item_tag(const String &p_menu_root,
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, Variant());
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], Variant());
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
@@ -1052,6 +1129,11 @@ String DisplayServerMacOS::global_menu_get_item_text(const String &p_menu_root,
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, String());
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], String());
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
return String::utf8([[menu_item title] UTF8String]);
|
|
@@ -1065,6 +1147,11 @@ String DisplayServerMacOS::global_menu_get_item_submenu(const String &p_menu_roo
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, String());
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], String());
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
const NSMenu *sub_menu = [menu_item submenu];
|
|
@@ -1085,6 +1172,11 @@ Key DisplayServerMacOS::global_menu_get_item_accelerator(const String &p_menu_ro
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, Key::NONE);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], Key::NONE);
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
String ret = String::utf8([[menu_item keyEquivalent] UTF8String]);
|
|
@@ -1116,6 +1208,11 @@ bool DisplayServerMacOS::global_menu_is_item_disabled(const String &p_menu_root,
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, false);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], false);
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
return ![menu_item isEnabled];
|
|
@@ -1129,6 +1226,11 @@ String DisplayServerMacOS::global_menu_get_item_tooltip(const String &p_menu_roo
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, String());
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], String());
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
return String::utf8([[menu_item toolTip] UTF8String]);
|
|
@@ -1142,6 +1244,11 @@ int DisplayServerMacOS::global_menu_get_item_state(const String &p_menu_root, in
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], 0);
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
@@ -1158,6 +1265,11 @@ int DisplayServerMacOS::global_menu_get_item_max_states(const String &p_menu_roo
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], 0);
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
@@ -1174,6 +1286,11 @@ Ref<Texture2D> DisplayServerMacOS::global_menu_get_item_icon(const String &p_men
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, Ref<Texture2D>());
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], Ref<Texture2D>());
|
|
|
const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
@@ -1187,14 +1304,34 @@ Ref<Texture2D> DisplayServerMacOS::global_menu_get_item_icon(const String &p_men
|
|
|
return Ref<Texture2D>();
|
|
|
}
|
|
|
|
|
|
+int DisplayServerMacOS::global_menu_get_item_indentation_level(const String &p_menu_root, int p_idx) const {
|
|
|
+ _THREAD_SAFE_METHOD_
|
|
|
+
|
|
|
+ const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
+ if (menu) {
|
|
|
+ ERR_FAIL_COND_V(p_idx < 0, 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND_V(p_idx >= [menu numberOfItems], 0);
|
|
|
+ const NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
+ if (menu_item) {
|
|
|
+ return [menu_item indentationLevel];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
void DisplayServerMacOS::global_menu_set_item_checked(const String &p_menu_root, int p_idx, bool p_checked) {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
if (p_checked) {
|
|
@@ -1211,12 +1348,15 @@ void DisplayServerMacOS::global_menu_set_item_checkable(const String &p_menu_roo
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
|
+ ERR_FAIL_COND(!obj);
|
|
|
obj->checkable_type = (p_checkable) ? CHECKABLE_TYPE_CHECK_BOX : CHECKABLE_TYPE_NONE;
|
|
|
}
|
|
|
}
|
|
@@ -1227,12 +1367,15 @@ void DisplayServerMacOS::global_menu_set_item_radio_checkable(const String &p_me
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
|
+ ERR_FAIL_COND(!obj);
|
|
|
obj->checkable_type = (p_checkable) ? CHECKABLE_TYPE_RADIO_BUTTON : CHECKABLE_TYPE_NONE;
|
|
|
}
|
|
|
}
|
|
@@ -1243,12 +1386,15 @@ void DisplayServerMacOS::global_menu_set_item_callback(const String &p_menu_root
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
|
+ ERR_FAIL_COND(!obj);
|
|
|
obj->callback = p_callback;
|
|
|
}
|
|
|
}
|
|
@@ -1259,12 +1405,15 @@ void DisplayServerMacOS::global_menu_set_item_tag(const String &p_menu_root, int
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
|
+ ERR_FAIL_COND(!obj);
|
|
|
obj->meta = p_tag;
|
|
|
}
|
|
|
}
|
|
@@ -1275,9 +1424,11 @@ void DisplayServerMacOS::global_menu_set_item_text(const String &p_menu_root, in
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
[menu_item setTitle:[NSString stringWithUTF8String:p_text.utf8().get_data()]];
|
|
@@ -1299,9 +1450,11 @@ void DisplayServerMacOS::global_menu_set_item_submenu(const String &p_menu_root,
|
|
|
ERR_PRINT("Can't set submenu to menu that is already a submenu of some other menu!");
|
|
|
return;
|
|
|
}
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
[menu setSubmenu:sub_menu forItem:menu_item];
|
|
@@ -1314,9 +1467,11 @@ void DisplayServerMacOS::global_menu_set_item_accelerator(const String &p_menu_r
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_keycode)];
|
|
@@ -1331,9 +1486,11 @@ void DisplayServerMacOS::global_menu_set_item_disabled(const String &p_menu_root
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
[menu_item setEnabled:(!p_disabled)];
|
|
@@ -1346,9 +1503,11 @@ void DisplayServerMacOS::global_menu_set_item_tooltip(const String &p_menu_root,
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
[menu_item setToolTip:[NSString stringWithUTF8String:p_tooltip.utf8().get_data()]];
|
|
@@ -1361,15 +1520,16 @@ void DisplayServerMacOS::global_menu_set_item_state(const String &p_menu_root, i
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
|
- if (obj) {
|
|
|
- obj->state = p_state;
|
|
|
- }
|
|
|
+ ERR_FAIL_COND(!obj);
|
|
|
+ obj->state = p_state;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1379,15 +1539,16 @@ void DisplayServerMacOS::global_menu_set_item_max_states(const String &p_menu_ro
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
|
- if (obj) {
|
|
|
- obj->max_states = p_max_states;
|
|
|
- }
|
|
|
+ ERR_FAIL_COND(!obj);
|
|
|
+ obj->max_states = p_max_states;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1397,12 +1558,15 @@ void DisplayServerMacOS::global_menu_set_item_icon(const String &p_menu_root, in
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not edit Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
if (menu_item) {
|
|
|
GodotMenuItem *obj = [menu_item representedObject];
|
|
|
+ ERR_FAIL_COND(!obj);
|
|
|
if (p_icon.is_valid()) {
|
|
|
obj->img = p_icon->get_image();
|
|
|
obj->img = obj->img->duplicate();
|
|
@@ -1419,12 +1583,33 @@ void DisplayServerMacOS::global_menu_set_item_icon(const String &p_menu_root, in
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void DisplayServerMacOS::global_menu_set_item_indentation_level(const String &p_menu_root, int p_idx, int p_level) {
|
|
|
+ _THREAD_SAFE_METHOD_
|
|
|
+
|
|
|
+ NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
+ if (menu) {
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
+ }
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
+ NSMenuItem *menu_item = [menu itemAtIndex:p_idx];
|
|
|
+ if (menu_item) {
|
|
|
+ [menu_item setIndentationLevel:p_level];
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int DisplayServerMacOS::global_menu_get_item_count(const String &p_menu_root) const {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
const NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- return [menu numberOfItems];
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ return [menu numberOfItems] - 1;
|
|
|
+ } else {
|
|
|
+ return [menu numberOfItems];
|
|
|
+ }
|
|
|
} else {
|
|
|
return 0;
|
|
|
}
|
|
@@ -1435,9 +1620,11 @@ void DisplayServerMacOS::global_menu_remove_item(const String &p_menu_root, int
|
|
|
|
|
|
NSMenu *menu = _get_menu_root(p_menu_root);
|
|
|
if (menu) {
|
|
|
- if ((menu == [NSApp mainMenu]) && (p_idx == 0)) { // Do not delete Apple menu.
|
|
|
- return;
|
|
|
+ ERR_FAIL_COND(p_idx < 0);
|
|
|
+ if (menu == [NSApp mainMenu]) { // Skip Apple menu.
|
|
|
+ p_idx++;
|
|
|
}
|
|
|
+ ERR_FAIL_COND(p_idx >= [menu numberOfItems]);
|
|
|
[menu removeItemAtIndex:p_idx];
|
|
|
}
|
|
|
}
|
|
@@ -1453,6 +1640,9 @@ void DisplayServerMacOS::global_menu_clear(const String &p_menu_root) {
|
|
|
NSMenuItem *menu_item = [menu addItemWithTitle:@"" action:nil keyEquivalent:@""];
|
|
|
[menu setSubmenu:apple_menu forItem:menu_item];
|
|
|
}
|
|
|
+ if (submenu.has(p_menu_root)) {
|
|
|
+ submenu.erase(p_menu_root);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3222,7 +3412,7 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM
|
|
|
|
|
|
[apple_menu addItem:[NSMenuItem separatorItem]];
|
|
|
|
|
|
- title = [NSString stringWithFormat:NSLocalizedString(@"Quit %@", nil), nsappname];
|
|
|
+ title = [NSString stringWithFormat:NSLocalizedString(@"\t\tQuit %@", nil), nsappname];
|
|
|
[apple_menu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
|
|
|
|
|
|
// Add items to the menu bar.
|