Fix error spam and skip submenu hidden signals on native menus
This commit is contained in:
@ -119,6 +119,9 @@ RID PopupMenu::bind_global_menu() {
|
|||||||
RID submenu_rid = item.submenu->bind_global_menu();
|
RID submenu_rid = item.submenu->bind_global_menu();
|
||||||
nmenu->set_item_submenu(global_menu, index, submenu_rid);
|
nmenu->set_item_submenu(global_menu, index, submenu_rid);
|
||||||
item.submenu_bound = true;
|
item.submenu_bound = true;
|
||||||
|
if (item.submenu->is_connected("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden))) {
|
||||||
|
item.submenu->disconnect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (item.checkable_type == Item::CHECKABLE_TYPE_CHECK_BOX) {
|
if (item.checkable_type == Item::CHECKABLE_TYPE_CHECK_BOX) {
|
||||||
nmenu->set_item_checkable(global_menu, index, true);
|
nmenu->set_item_checkable(global_menu, index, true);
|
||||||
@ -348,8 +351,10 @@ int PopupMenu::_get_mouse_over(const Point2 &p_over) const {
|
|||||||
void PopupMenu::_activate_submenu(int p_over, bool p_by_keyboard) {
|
void PopupMenu::_activate_submenu(int p_over, bool p_by_keyboard) {
|
||||||
ERR_FAIL_INDEX_MSG(p_over, items.size(), vformat("Invalid submenu index %d in _activate_submenu.", p_over));
|
ERR_FAIL_INDEX_MSG(p_over, items.size(), vformat("Invalid submenu index %d in _activate_submenu.", p_over));
|
||||||
PopupMenu *submenu_popup = items[p_over].submenu;
|
PopupMenu *submenu_popup = items[p_over].submenu;
|
||||||
ERR_FAIL_COND_MSG(submenu_popup->is_visible(), vformat("_activate_submenu should not be called on an open submenu - index: %d.", p_over));
|
if (submenu_popup->is_visible()) {
|
||||||
|
WARN_VERBOSE(vformat("_activate_submenu should not be called on an open submenu - index: %d.", p_over));
|
||||||
|
return;
|
||||||
|
}
|
||||||
submenu_popup->this_submenu_index = p_over;
|
submenu_popup->this_submenu_index = p_over;
|
||||||
active_submenu_index = p_over;
|
active_submenu_index = p_over;
|
||||||
|
|
||||||
@ -1919,13 +1924,14 @@ void PopupMenu::add_submenu_node_item(const String &p_label, PopupMenu *p_submen
|
|||||||
RID submenu_rid = p_submenu->bind_global_menu();
|
RID submenu_rid = p_submenu->bind_global_menu();
|
||||||
nmenu->set_item_submenu(global_menu, index, submenu_rid);
|
nmenu->set_item_submenu(global_menu, index, submenu_rid);
|
||||||
items.write[index].submenu_bound = true;
|
items.write[index].submenu_bound = true;
|
||||||
|
} else {
|
||||||
|
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
|
||||||
}
|
}
|
||||||
|
|
||||||
_shape_item(items.size() - 1);
|
_shape_item(items.size() - 1);
|
||||||
queue_accessibility_update();
|
queue_accessibility_update();
|
||||||
control->queue_redraw();
|
control->queue_redraw();
|
||||||
|
|
||||||
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
|
|
||||||
child_controls_changed();
|
child_controls_changed();
|
||||||
notify_property_list_changed();
|
notify_property_list_changed();
|
||||||
_menu_changed();
|
_menu_changed();
|
||||||
@ -2215,8 +2221,9 @@ void PopupMenu::set_item_submenu_node(int p_idx, PopupMenu *p_submenu) {
|
|||||||
NativeMenu::get_singleton()->set_item_submenu(global_menu, p_idx, submenu_rid);
|
NativeMenu::get_singleton()->set_item_submenu(global_menu, p_idx, submenu_rid);
|
||||||
items.write[p_idx].submenu_bound = true;
|
items.write[p_idx].submenu_bound = true;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
|
||||||
}
|
}
|
||||||
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
|
|
||||||
control->queue_redraw();
|
control->queue_redraw();
|
||||||
child_controls_changed();
|
child_controls_changed();
|
||||||
_menu_changed();
|
_menu_changed();
|
||||||
@ -2238,8 +2245,14 @@ void PopupMenu::_close_suspended_timeout() {
|
|||||||
|
|
||||||
void PopupMenu::_submenu_hidden() {
|
void PopupMenu::_submenu_hidden() {
|
||||||
// Ensure the submenu_timer is not running to avoid any race conditions between opening and closing submenus.
|
// Ensure the submenu_timer is not running to avoid any race conditions between opening and closing submenus.
|
||||||
ERR_FAIL_COND_MSG(!submenu_timer->is_stopped(), "The submenu_timer should never be running when the _submenu_hidden signal is emitted.");
|
if (!submenu_timer->is_stopped()) {
|
||||||
ERR_FAIL_COND_MSG(active_submenu_index == -1, "The active_submenu_index should never be -1 when _submenu_hidden is entered.");
|
WARN_VERBOSE("The submenu_timer should never be running when the _submenu_hidden signal is emitted.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (active_submenu_index == -1) {
|
||||||
|
WARN_VERBOSE("The active_submenu_index should never be -1 when _submenu_hidden is entered.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
active_submenu_index = -1;
|
active_submenu_index = -1;
|
||||||
submenu_over = -1;
|
submenu_over = -1;
|
||||||
submenu_mouse_exited_ticks_msec = -1;
|
submenu_mouse_exited_ticks_msec = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user