diff options
Diffstat (limited to 'scene/gui/menu_bar.cpp')
-rw-r--r-- | scene/gui/menu_bar.cpp | 115 |
1 files changed, 66 insertions, 49 deletions
diff --git a/scene/gui/menu_bar.cpp b/scene/gui/menu_bar.cpp index 301de291a4..b8563f2225 100644 --- a/scene/gui/menu_bar.cpp +++ b/scene/gui/menu_bar.cpp @@ -192,31 +192,33 @@ bool MenuBar::is_native_menu() const { } #endif - return (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU) && is_native); + return (NativeMenu::get_singleton()->has_feature(NativeMenu::FEATURE_GLOBAL_MENU) && is_native); } -String MenuBar::bind_global_menu() { +void MenuBar::bind_global_menu() { #ifdef TOOLS_ENABLED if (is_part_of_edited_scene()) { - return String(); + return; } #endif - if (!DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_GLOBAL_MENU)) { - return String(); + if (!NativeMenu::get_singleton()->has_feature(NativeMenu::FEATURE_GLOBAL_MENU)) { + return; } - if (!global_menu_name.is_empty()) { - return global_menu_name; // Already bound. + if (!global_menu_tag.is_empty()) { + return; // Already bound. } - DisplayServer *ds = DisplayServer::get_singleton(); - global_menu_name = "__MenuBar#" + itos(get_instance_id()); + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + + global_menu_tag = "__MenuBar#" + itos(get_instance_id()); int global_start_idx = -1; - int count = ds->global_menu_get_item_count("_main"); + int count = nmenu->get_item_count(main_menu); String prev_tag; for (int i = 0; i < count; i++) { - String tag = ds->global_menu_get_item_tag("_main", i).operator String().get_slice("#", 1); + String tag = nmenu->get_item_tag(main_menu, i).operator String().get_slice("#", 1); if (!tag.is_empty() && tag != prev_tag) { if (i >= start_index) { global_start_idx = i; @@ -231,40 +233,39 @@ String MenuBar::bind_global_menu() { Vector<PopupMenu *> popups = _get_popups(); for (int i = 0; i < menu_cache.size(); i++) { - String submenu_name = popups[i]->bind_global_menu(); + RID submenu_rid = popups[i]->bind_global_menu(); if (!popups[i]->is_system_menu()) { - int index = ds->global_menu_add_submenu_item("_main", menu_cache[i].name, submenu_name, global_start_idx + i); + int index = nmenu->add_submenu_item(main_menu, menu_cache[i].name, submenu_rid, global_menu_tag + "#" + itos(i), global_start_idx + i); menu_cache.write[i].global_index = index; - ds->global_menu_set_item_tag("_main", index, global_menu_name + "#" + itos(i)); - ds->global_menu_set_item_hidden("_main", index, menu_cache[i].hidden); - ds->global_menu_set_item_disabled("_main", index, menu_cache[i].disabled); - ds->global_menu_set_item_tooltip("_main", index, menu_cache[i].tooltip); + nmenu->set_item_hidden(main_menu, index, menu_cache[i].hidden); + nmenu->set_item_disabled(main_menu, index, menu_cache[i].disabled); + nmenu->set_item_tooltip(main_menu, index, menu_cache[i].tooltip); } else { menu_cache.write[i].global_index = -1; } } - - return global_menu_name; } void MenuBar::unbind_global_menu() { - if (global_menu_name.is_empty()) { + if (global_menu_tag.is_empty()) { return; } - DisplayServer *ds = DisplayServer::get_singleton(); + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + Vector<PopupMenu *> popups = _get_popups(); for (int i = menu_cache.size() - 1; i >= 0; i--) { if (!popups[i]->is_system_menu()) { popups[i]->unbind_global_menu(); if (menu_cache[i].global_index >= 0) { - ds->global_menu_remove_item("_main", menu_cache[i].global_index); + nmenu->remove_item(main_menu, menu_cache[i].global_index); } menu_cache.write[i].global_index = -1; } } - global_menu_name = String(); + global_menu_tag = String(); } void MenuBar::_notification(int p_what) { @@ -286,12 +287,13 @@ void MenuBar::_notification(int p_what) { queue_redraw(); } break; case NOTIFICATION_TRANSLATION_CHANGED: { - DisplayServer *ds = DisplayServer::get_singleton(); - bool is_global = !global_menu_name.is_empty(); + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + bool is_global = !global_menu_tag.is_empty(); for (int i = 0; i < menu_cache.size(); i++) { shape(menu_cache.write[i]); if (is_global && menu_cache[i].global_index >= 0) { - ds->global_menu_set_item_text("_main", menu_cache[i].global_index, atr(menu_cache[i].name)); + nmenu->set_item_text(main_menu, menu_cache[i].global_index, atr(menu_cache[i].name)); } } } break; @@ -489,8 +491,9 @@ void MenuBar::shape(Menu &p_menu) { } void MenuBar::_refresh_menu_names() { - DisplayServer *ds = DisplayServer::get_singleton(); - bool is_global = !global_menu_name.is_empty(); + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + bool is_global = !global_menu_tag.is_empty(); Vector<PopupMenu *> popups = _get_popups(); for (int i = 0; i < popups.size(); i++) { @@ -498,7 +501,7 @@ void MenuBar::_refresh_menu_names() { menu_cache.write[i].name = popups[i]->get_name(); shape(menu_cache.write[i]); if (is_global && menu_cache[i].global_index >= 0) { - ds->global_menu_set_item_text("_main", menu_cache[i].global_index, atr(menu_cache[i].name)); + nmenu->set_item_text(main_menu, menu_cache[i].global_index, atr(menu_cache[i].name)); } } } @@ -545,12 +548,14 @@ void MenuBar::add_child_notify(Node *p_child) { p_child->connect("about_to_popup", callable_mp(this, &MenuBar::_popup_visibility_changed).bind(true)); p_child->connect("popup_hide", callable_mp(this, &MenuBar::_popup_visibility_changed).bind(false)); - if (!global_menu_name.is_empty()) { - String submenu_name = pm->bind_global_menu(); + if (!global_menu_tag.is_empty()) { + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + + RID submenu_rid = pm->bind_global_menu(); if (!pm->is_system_menu()) { - int index = DisplayServer::get_singleton()->global_menu_add_submenu_item("_main", atr(menu.name), submenu_name, _find_global_start_index() + menu_cache.size() - 1); + int index = nmenu->add_submenu_item(main_menu, atr(menu.name), submenu_rid, global_menu_tag + "#" + itos(menu_cache.size() - 1), _find_global_start_index() + menu_cache.size() - 1); menu_cache.write[menu_cache.size() - 1].global_index = index; - DisplayServer::get_singleton()->global_menu_set_item_tag("_main", index, global_menu_name + "#" + itos(menu_cache.size() - 1)); } } update_minimum_size(); @@ -578,17 +583,19 @@ void MenuBar::move_child_notify(Node *p_child) { int new_idx = get_menu_idx_from_control(pm); menu_cache.insert(new_idx, menu); - if (!global_menu_name.is_empty()) { + if (!global_menu_tag.is_empty()) { if (!pm->is_system_menu()) { + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + int global_start = _find_global_start_index(); if (menu.global_index >= 0) { - DisplayServer::get_singleton()->global_menu_remove_item("_main", menu.global_index); + nmenu->remove_item(main_menu, menu.global_index); } if (new_idx != -1) { - String submenu_name = pm->bind_global_menu(); - int index = DisplayServer::get_singleton()->global_menu_add_submenu_item("_main", atr(menu.name), submenu_name, global_start + new_idx); + RID submenu_rid = pm->bind_global_menu(); + int index = nmenu->add_submenu_item(main_menu, atr(menu.name), submenu_rid, global_menu_tag + "#" + itos(new_idx), global_start + new_idx); menu_cache.write[new_idx].global_index = index; - DisplayServer::get_singleton()->global_menu_set_item_tag("_main", index, global_menu_name + "#" + itos(new_idx)); } } } @@ -606,11 +613,13 @@ void MenuBar::remove_child_notify(Node *p_child) { menu_cache.remove_at(idx); - if (!global_menu_name.is_empty()) { + if (!global_menu_tag.is_empty()) { if (!pm->is_system_menu()) { pm->unbind_global_menu(); if (menu_cache[idx].global_index >= 0) { - DisplayServer::get_singleton()->global_menu_remove_item("_main", menu_cache[idx].global_index); + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + nmenu->remove_item(main_menu, menu_cache[idx].global_index); menu_cache.write[idx].global_index = -1; } } @@ -746,7 +755,7 @@ bool MenuBar::is_flat() const { void MenuBar::set_start_index(int p_index) { if (start_index != p_index) { start_index = p_index; - if (!global_menu_name.is_empty()) { + if (!global_menu_tag.is_empty()) { unbind_global_menu(); bind_global_menu(); } @@ -808,8 +817,10 @@ void MenuBar::set_menu_title(int p_menu, const String &p_title) { } menu_cache.write[p_menu].name = p_title; shape(menu_cache.write[p_menu]); - if (!global_menu_name.is_empty() && menu_cache[p_menu].global_index >= 0) { - DisplayServer::get_singleton()->global_menu_set_item_text("_main", menu_cache[p_menu].global_index, atr(menu_cache[p_menu].name)); + if (!global_menu_tag.is_empty() && menu_cache[p_menu].global_index >= 0) { + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + nmenu->set_item_text(main_menu, menu_cache[p_menu].global_index, atr(menu_cache[p_menu].name)); } update_minimum_size(); } @@ -824,8 +835,10 @@ void MenuBar::set_menu_tooltip(int p_menu, const String &p_tooltip) { PopupMenu *pm = get_menu_popup(p_menu); pm->set_meta("_menu_tooltip", p_tooltip); menu_cache.write[p_menu].tooltip = p_tooltip; - if (!global_menu_name.is_empty() && menu_cache[p_menu].global_index >= 0) { - DisplayServer::get_singleton()->global_menu_set_item_tooltip("_main", menu_cache[p_menu].global_index, p_tooltip); + if (!global_menu_tag.is_empty() && menu_cache[p_menu].global_index >= 0) { + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + nmenu->set_item_tooltip(main_menu, menu_cache[p_menu].global_index, p_tooltip); } } @@ -837,8 +850,10 @@ String MenuBar::get_menu_tooltip(int p_menu) const { void MenuBar::set_menu_disabled(int p_menu, bool p_disabled) { ERR_FAIL_INDEX(p_menu, menu_cache.size()); menu_cache.write[p_menu].disabled = p_disabled; - if (!global_menu_name.is_empty() && menu_cache[p_menu].global_index >= 0) { - DisplayServer::get_singleton()->global_menu_set_item_disabled("_main", menu_cache[p_menu].global_index, p_disabled); + if (!global_menu_tag.is_empty() && menu_cache[p_menu].global_index >= 0) { + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + nmenu->set_item_disabled(main_menu, menu_cache[p_menu].global_index, p_disabled); } } @@ -850,8 +865,10 @@ bool MenuBar::is_menu_disabled(int p_menu) const { void MenuBar::set_menu_hidden(int p_menu, bool p_hidden) { ERR_FAIL_INDEX(p_menu, menu_cache.size()); menu_cache.write[p_menu].hidden = p_hidden; - if (!global_menu_name.is_empty() && menu_cache[p_menu].global_index >= 0) { - DisplayServer::get_singleton()->global_menu_set_item_hidden("_main", menu_cache[p_menu].global_index, p_hidden); + if (!global_menu_tag.is_empty() && menu_cache[p_menu].global_index >= 0) { + NativeMenu *nmenu = NativeMenu::get_singleton(); + RID main_menu = nmenu->get_system_menu(NativeMenu::MAIN_MENU_ID); + nmenu->set_item_hidden(main_menu, menu_cache[p_menu].global_index, p_hidden); } update_minimum_size(); } |