From 32ef7306f4fe79430ee1325f9a92bff092d5dadf Mon Sep 17 00:00:00 2001 From: HP van Braam Date: Sat, 21 Dec 2024 21:45:06 +0100 Subject: [PATCH] Handle changing ItemLists from signals We make sure we don't touch the ItemList's items array after signals are emitted as a signal handler might change the item list, causing the index we had to be invalid. This fixes #100663 --- scene/gui/item_list.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index e114aa0452a..302bd0b8d63 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -746,7 +746,19 @@ void ItemList::gui_input(const Ref &p_event) { return; } - if (items[i].selectable && (!items[i].selected || allow_reselect) && select_mode != SELECT_TOGGLE) { + if (select_mode == SELECT_TOGGLE) { + if (items[i].selectable) { + if (items[i].selected) { + deselect(i); + current = i; + emit_signal(SNAME("multi_selected"), i, false); + } else { + select(i, false); + current = i; + emit_signal(SNAME("multi_selected"), i, true); + } + } + } else if (items[i].selectable && (!items[i].selected || allow_reselect)) { select(i, select_mode == SELECT_SINGLE || !mb->is_command_or_control_pressed()); if (select_mode == SELECT_SINGLE) { @@ -756,18 +768,6 @@ void ItemList::gui_input(const Ref &p_event) { } } - if (items[i].selectable && select_mode == SELECT_TOGGLE) { - if (items[i].selected) { - deselect(i); - current = i; - emit_signal(SNAME("multi_selected"), i, false); - } else { - select(i, false); - current = i; - emit_signal(SNAME("multi_selected"), i, true); - } - } - emit_signal(SNAME("item_clicked"), i, get_local_mouse_position(), mb->get_button_index()); if (mb->get_button_index() == MouseButton::LEFT && mb->is_double_click()) {