Skip to content

Commit 5b61baa

Browse files
committed
Fix error spam and skip submenu hidden signals on native menus
1 parent b15a13e commit 5b61baa

1 file changed

Lines changed: 19 additions & 6 deletions

File tree

scene/gui/popup_menu.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ RID PopupMenu::bind_global_menu() {
119119
RID submenu_rid = item.submenu->bind_global_menu();
120120
nmenu->set_item_submenu(global_menu, index, submenu_rid);
121121
item.submenu_bound = true;
122+
if (item.submenu->is_connected("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden))) {
123+
item.submenu->disconnect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
124+
}
122125
}
123126
if (item.checkable_type == Item::CHECKABLE_TYPE_CHECK_BOX) {
124127
nmenu->set_item_checkable(global_menu, index, true);
@@ -348,8 +351,10 @@ int PopupMenu::_get_mouse_over(const Point2 &p_over) const {
348351
void PopupMenu::_activate_submenu(int p_over, bool p_by_keyboard) {
349352
ERR_FAIL_INDEX_MSG(p_over, items.size(), vformat("Invalid submenu index %d in _activate_submenu.", p_over));
350353
PopupMenu *submenu_popup = items[p_over].submenu;
351-
ERR_FAIL_COND_MSG(submenu_popup->is_visible(), vformat("_activate_submenu should not be called on an open submenu - index: %d.", p_over));
352-
354+
if (submenu_popup->is_visible()) {
355+
WARN_VERBOSE(vformat("_activate_submenu should not be called on an open submenu - index: %d.", p_over));
356+
return;
357+
}
353358
submenu_popup->this_submenu_index = p_over;
354359
active_submenu_index = p_over;
355360

@@ -1919,13 +1924,14 @@ void PopupMenu::add_submenu_node_item(const String &p_label, PopupMenu *p_submen
19191924
RID submenu_rid = p_submenu->bind_global_menu();
19201925
nmenu->set_item_submenu(global_menu, index, submenu_rid);
19211926
items.write[index].submenu_bound = true;
1927+
} else {
1928+
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
19221929
}
19231930

19241931
_shape_item(items.size() - 1);
19251932
queue_accessibility_update();
19261933
control->queue_redraw();
19271934

1928-
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
19291935
child_controls_changed();
19301936
notify_property_list_changed();
19311937
_menu_changed();
@@ -2215,8 +2221,9 @@ void PopupMenu::set_item_submenu_node(int p_idx, PopupMenu *p_submenu) {
22152221
NativeMenu::get_singleton()->set_item_submenu(global_menu, p_idx, submenu_rid);
22162222
items.write[p_idx].submenu_bound = true;
22172223
}
2224+
} else {
2225+
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
22182226
}
2219-
p_submenu->connect("popup_hide", callable_mp(this, &PopupMenu::_submenu_hidden));
22202227
control->queue_redraw();
22212228
child_controls_changed();
22222229
_menu_changed();
@@ -2238,8 +2245,14 @@ void PopupMenu::_close_suspended_timeout() {
22382245

22392246
void PopupMenu::_submenu_hidden() {
22402247
// Ensure the submenu_timer is not running to avoid any race conditions between opening and closing submenus.
2241-
ERR_FAIL_COND_MSG(!submenu_timer->is_stopped(), "The submenu_timer should never be running when the _submenu_hidden signal is emitted.");
2242-
ERR_FAIL_COND_MSG(active_submenu_index == -1, "The active_submenu_index should never be -1 when _submenu_hidden is entered.");
2248+
if (!submenu_timer->is_stopped()) {
2249+
WARN_VERBOSE("The submenu_timer should never be running when the _submenu_hidden signal is emitted.");
2250+
return;
2251+
}
2252+
if (active_submenu_index == -1) {
2253+
WARN_VERBOSE("The active_submenu_index should never be -1 when _submenu_hidden is entered.");
2254+
return;
2255+
}
22432256
active_submenu_index = -1;
22442257
submenu_over = -1;
22452258
submenu_mouse_exited_ticks_msec = -1;

0 commit comments

Comments
 (0)