Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions platform/macos/godot_menu_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ enum GlobalMenuCheckType {
bool enabled;
int max_states;
int state;
int indent;
Ref<Image> img;
}

Expand Down
1 change: 1 addition & 0 deletions platform/macos/godot_menu_item.mm
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ - (id)init {
self->checked = false;
self->max_states = 0;
self->state = 0;
self->indent = 0;
self->accel = Key::NONE;

return self;
Expand Down
2 changes: 2 additions & 0 deletions platform/macos/native_menu_macos.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ class NativeMenuMacOS : public NativeMenu {
RID help_menu;
RID dock_menu;

void _update_align(MenuData *p_md);

int _get_system_menu_start(const NSMenu *p_menu) const;
int _get_system_menu_count(const NSMenu *p_menu) const;
bool _is_menu_opened(NSMenu *p_menu) const;
Expand Down
54 changes: 53 additions & 1 deletion platform/macos/native_menu_macos.mm
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,43 @@
return [p_menu numberOfItems];
}

void NativeMenuMacOS::_update_align(MenuData *p_md) {
int item_start = _get_system_menu_start(p_md->menu);
int item_count = _get_system_menu_count(p_md->menu);

int block_start = item_start;
bool has_icon = false;
for (int i = item_start; i <= item_start + item_count; i++) {
bool end_block = false;
if (i < item_start + item_count) {
NSMenuItem *menu_item = [p_md->menu itemAtIndex:i];
if (!menu_item) {
continue;
}
const GodotMenuItem *obj = [menu_item representedObject];
if (obj) {
has_icon = has_icon || obj->img.is_valid();
}
end_block = [menu_item isSeparatorItem];
} else {
end_block = true;
}
if (end_block) {
for (int j = block_start; j < i; j++) {
NSMenuItem *menu_item_b = [p_md->menu itemAtIndex:j];
const GodotMenuItem *obj = [menu_item_b representedObject];
if (has_icon && obj && !obj->img.is_valid()) {
[menu_item_b setIndentationLevel:obj->indent + 2];
} else {
[menu_item_b setIndentationLevel:obj->indent];
}
}
block_start = i + 1;
has_icon = false;
}
}
}

bool NativeMenuMacOS::has_feature(Feature p_feature) const {
switch (p_feature) {
case FEATURE_GLOBAL_MENU:
Expand Down Expand Up @@ -423,6 +460,7 @@

[md_sub->menu setTitle:[NSString stringWithUTF8String:p_label.utf8().get_data()]];
[md->menu setSubmenu:md_sub->menu forItem:menu_item];
_update_align(md);

return p_index - item_start;
}
Expand Down Expand Up @@ -460,6 +498,7 @@
obj->accel = p_accel;
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
[menu_item setRepresentedObject:obj];
_update_align(md);
}
return out;
}
Expand All @@ -479,6 +518,7 @@
obj->accel = p_accel;
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
[menu_item setRepresentedObject:obj];
_update_align(md);
}
return out;
}
Expand Down Expand Up @@ -508,6 +548,7 @@
}
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
[menu_item setRepresentedObject:obj];
_update_align(md);
}
return out;
}
Expand Down Expand Up @@ -538,6 +579,7 @@
}
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
[menu_item setRepresentedObject:obj];
_update_align(md);
}
return out;
}
Expand All @@ -557,6 +599,7 @@
obj->accel = p_accel;
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
[menu_item setRepresentedObject:obj];
_update_align(md);
}
return out;
}
Expand Down Expand Up @@ -587,6 +630,7 @@
}
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
[menu_item setRepresentedObject:obj];
_update_align(md);
}
return out;
}
Expand All @@ -607,6 +651,7 @@
obj->accel = p_accel;
[menu_item setKeyEquivalentModifierMask:KeyMappingMacOS::keycode_get_native_mask(p_accel)];
[menu_item setRepresentedObject:obj];
_update_align(md);
}
return out;
}
Expand All @@ -627,6 +672,7 @@
p_index = CLAMP(p_index, item_start, item_start + item_count);
}
[md->menu insertItem:[NSMenuItem separatorItem] atIndex:p_index];
_update_align(md);
return p_index - item_start;
}

Expand Down Expand Up @@ -1302,6 +1348,7 @@
obj->img = Ref<Image>();
[menu_item setImage:nil];
}
_update_align(md);
}
}

Expand All @@ -1316,7 +1363,11 @@
ERR_FAIL_COND(p_idx >= item_start + item_count);
NSMenuItem *menu_item = [md->menu itemAtIndex:p_idx];
if (menu_item) {
[menu_item setIndentationLevel:p_level];
GodotMenuItem *obj = [menu_item representedObject];
if (obj) {
obj->indent = p_level;
_update_align(md);
}
}
}

Expand Down Expand Up @@ -1372,6 +1423,7 @@
return;
}
[md->menu removeItemAtIndex:p_idx];
_update_align(md);
}

void NativeMenuMacOS::clear(const RID &p_rid) {
Expand Down