Skip to content

Commit 32ef730

Browse files
committed
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
1 parent bdf625b commit 32ef730

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

scene/gui/item_list.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,19 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
746746
return;
747747
}
748748

749-
if (items[i].selectable && (!items[i].selected || allow_reselect) && select_mode != SELECT_TOGGLE) {
749+
if (select_mode == SELECT_TOGGLE) {
750+
if (items[i].selectable) {
751+
if (items[i].selected) {
752+
deselect(i);
753+
current = i;
754+
emit_signal(SNAME("multi_selected"), i, false);
755+
} else {
756+
select(i, false);
757+
current = i;
758+
emit_signal(SNAME("multi_selected"), i, true);
759+
}
760+
}
761+
} else if (items[i].selectable && (!items[i].selected || allow_reselect)) {
750762
select(i, select_mode == SELECT_SINGLE || !mb->is_command_or_control_pressed());
751763

752764
if (select_mode == SELECT_SINGLE) {
@@ -756,18 +768,6 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
756768
}
757769
}
758770

759-
if (items[i].selectable && select_mode == SELECT_TOGGLE) {
760-
if (items[i].selected) {
761-
deselect(i);
762-
current = i;
763-
emit_signal(SNAME("multi_selected"), i, false);
764-
} else {
765-
select(i, false);
766-
current = i;
767-
emit_signal(SNAME("multi_selected"), i, true);
768-
}
769-
}
770-
771771
emit_signal(SNAME("item_clicked"), i, get_local_mouse_position(), mb->get_button_index());
772772

773773
if (mb->get_button_index() == MouseButton::LEFT && mb->is_double_click()) {

0 commit comments

Comments
 (0)