Skip to content

Commit 19df2e0

Browse files
committed
Merge pull request godotengine#74250 from daBlesr/bugfix-selection-signals-when-disabled-or-not-selectable
ItemList: Clarify distinction between disabled and selected in sending signals
2 parents 0d9f5ed + 90c7f9f commit 19df2e0

1 file changed

Lines changed: 20 additions & 5 deletions

File tree

scene/gui/item_list.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)