summaryrefslogtreecommitdiffstats
path: root/scene/gui/menu_bar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui/menu_bar.cpp')
-rw-r--r--scene/gui/menu_bar.cpp115
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();
}