@@ -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 {
348351void 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
22392246void 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