@@ -675,18 +675,26 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
675675 if (closest != -1 && (mb->get_button_index () == MouseButton::LEFT || (allow_rmb_select && mb->get_button_index () == MouseButton::RIGHT ))) {
676676 int i = closest;
677677
678+ if (items[i].disabled ) {
679+ // Don't emit any signal or do any action with clicked item when disabled.
680+ return ;
681+ }
682+
678683 if (select_mode == SELECT_MULTI && items[i].selected && mb->is_command_or_control_pressed ()) {
679684 deselect (i);
680685 emit_signal (SNAME (" multi_selected" ), i, false );
681686
682687 } else if (select_mode == SELECT_MULTI && mb->is_shift_pressed () && current >= 0 && current < items.size () && current != i) {
688+ // Range selection.
689+
683690 int from = current;
684691 int to = i;
685692 if (i < current) {
686693 SWAP (from, to);
687694 }
688695 for (int j = from; j <= to; j++) {
689696 if (!CAN_SELECT (j)) {
697+ // Item is not selectable during a range selection, so skip it.
690698 continue ;
691699 }
692700 bool selected = !items[j].selected ;
@@ -698,12 +706,17 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
698706 emit_signal (SNAME (" item_clicked" ), i, get_local_mouse_position (), mb->get_button_index ());
699707
700708 } else {
701- if (!mb->is_double_click () && !mb->is_command_or_control_pressed () && select_mode == SELECT_MULTI && items[i].selectable && !items[i].disabled && items[i].selected && mb->get_button_index () == MouseButton::LEFT ) {
709+ if (!mb->is_double_click () &&
710+ !mb->is_command_or_control_pressed () &&
711+ select_mode == SELECT_MULTI &&
712+ items[i].selectable &&
713+ items[i].selected &&
714+ mb->get_button_index () == MouseButton::LEFT ) {
702715 defer_select_single = i;
703716 return ;
704717 }
705718
706- if (!items[i].selected || allow_reselect) {
719+ if (items[i]. selectable && ( !items[i].selected || allow_reselect) ) {
707720 select (i, select_mode == SELECT_SINGLE || !mb->is_command_or_control_pressed ());
708721
709722 if (select_mode == SELECT_SINGLE ) {
@@ -722,7 +735,9 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
722735
723736 return ;
724737 } else if (closest != -1 ) {
725- emit_signal (SNAME (" item_clicked" ), closest, get_local_mouse_position (), mb->get_button_index ());
738+ if (!items[closest].disabled ) {
739+ emit_signal (SNAME (" item_clicked" ), closest, get_local_mouse_position (), mb->get_button_index ());
740+ }
726741 } else {
727742 // Since closest is null, more likely we clicked on empty space, so send signal to interested controls. Allows, for example, implement items deselecting.
728743 emit_signal (SNAME (" empty_clicked" ), get_local_mouse_position (), mb->get_button_index ());
@@ -886,7 +901,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
886901 search_string = " " ;
887902 } else if (p_event->is_action (" ui_select" , true ) && select_mode == SELECT_MULTI ) {
888903 if (current >= 0 && current < items.size ()) {
889- if (items[ current]. selectable && !items[current]. disabled && !items[current].selected ) {
904+ if (CAN_SELECT ( current) && !items[current].selected ) {
890905 select (current, false );
891906 emit_signal (SNAME (" multi_selected" ), current, true );
892907 } else if (items[current].selected ) {
@@ -897,7 +912,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
897912 } else if (p_event->is_action (" ui_accept" , true )) {
898913 search_string = " " ; // any mousepress cancels
899914
900- if (current >= 0 && current < items.size ()) {
915+ if (current >= 0 && current < items.size () && !items[current]. disabled ) {
901916 emit_signal (SNAME (" item_activated" ), current);
902917 }
903918 } else {
0 commit comments