|
@@ -675,11 +675,18 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
|
|
if (closest != -1 && (mb->get_button_index() == MouseButton::LEFT || (allow_rmb_select && mb->get_button_index() == MouseButton::RIGHT))) {
|
|
if (closest != -1 && (mb->get_button_index() == MouseButton::LEFT || (allow_rmb_select && mb->get_button_index() == MouseButton::RIGHT))) {
|
|
int i = closest;
|
|
int i = closest;
|
|
|
|
|
|
|
|
+ if (items[i].disabled) {
|
|
|
|
+ // Don't emit any signal or do any action with clicked item when disabled.
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (select_mode == SELECT_MULTI && items[i].selected && mb->is_command_or_control_pressed()) {
|
|
if (select_mode == SELECT_MULTI && items[i].selected && mb->is_command_or_control_pressed()) {
|
|
deselect(i);
|
|
deselect(i);
|
|
emit_signal(SNAME("multi_selected"), i, false);
|
|
emit_signal(SNAME("multi_selected"), i, false);
|
|
|
|
|
|
} else if (select_mode == SELECT_MULTI && mb->is_shift_pressed() && current >= 0 && current < items.size() && current != i) {
|
|
} else if (select_mode == SELECT_MULTI && mb->is_shift_pressed() && current >= 0 && current < items.size() && current != i) {
|
|
|
|
+ // Range selection.
|
|
|
|
+
|
|
int from = current;
|
|
int from = current;
|
|
int to = i;
|
|
int to = i;
|
|
if (i < current) {
|
|
if (i < current) {
|
|
@@ -687,6 +694,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
|
|
}
|
|
}
|
|
for (int j = from; j <= to; j++) {
|
|
for (int j = from; j <= to; j++) {
|
|
if (!CAN_SELECT(j)) {
|
|
if (!CAN_SELECT(j)) {
|
|
|
|
+ // Item is not selectable during a range selection, so skip it.
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
bool selected = !items[j].selected;
|
|
bool selected = !items[j].selected;
|
|
@@ -698,12 +706,17 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
|
|
emit_signal(SNAME("item_clicked"), i, get_local_mouse_position(), mb->get_button_index());
|
|
emit_signal(SNAME("item_clicked"), i, get_local_mouse_position(), mb->get_button_index());
|
|
|
|
|
|
} else {
|
|
} else {
|
|
- 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) {
|
|
|
|
|
|
+ if (!mb->is_double_click() &&
|
|
|
|
+ !mb->is_command_or_control_pressed() &&
|
|
|
|
+ select_mode == SELECT_MULTI &&
|
|
|
|
+ items[i].selectable &&
|
|
|
|
+ items[i].selected &&
|
|
|
|
+ mb->get_button_index() == MouseButton::LEFT) {
|
|
defer_select_single = i;
|
|
defer_select_single = i;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!items[i].selected || allow_reselect) {
|
|
|
|
|
|
+ if (items[i].selectable && (!items[i].selected || allow_reselect)) {
|
|
select(i, select_mode == SELECT_SINGLE || !mb->is_command_or_control_pressed());
|
|
select(i, select_mode == SELECT_SINGLE || !mb->is_command_or_control_pressed());
|
|
|
|
|
|
if (select_mode == SELECT_SINGLE) {
|
|
if (select_mode == SELECT_SINGLE) {
|
|
@@ -722,7 +735,9 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
|
|
|
return;
|
|
return;
|
|
} else if (closest != -1) {
|
|
} else if (closest != -1) {
|
|
- emit_signal(SNAME("item_clicked"), closest, get_local_mouse_position(), mb->get_button_index());
|
|
|
|
|
|
+ if (!items[closest].disabled) {
|
|
|
|
+ emit_signal(SNAME("item_clicked"), closest, get_local_mouse_position(), mb->get_button_index());
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
// Since closest is null, more likely we clicked on empty space, so send signal to interested controls. Allows, for example, implement items deselecting.
|
|
// Since closest is null, more likely we clicked on empty space, so send signal to interested controls. Allows, for example, implement items deselecting.
|
|
emit_signal(SNAME("empty_clicked"), get_local_mouse_position(), mb->get_button_index());
|
|
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) {
|
|
search_string = "";
|
|
search_string = "";
|
|
} else if (p_event->is_action("ui_select", true) && select_mode == SELECT_MULTI) {
|
|
} else if (p_event->is_action("ui_select", true) && select_mode == SELECT_MULTI) {
|
|
if (current >= 0 && current < items.size()) {
|
|
if (current >= 0 && current < items.size()) {
|
|
- if (items[current].selectable && !items[current].disabled && !items[current].selected) {
|
|
|
|
|
|
+ if (CAN_SELECT(current) && !items[current].selected) {
|
|
select(current, false);
|
|
select(current, false);
|
|
emit_signal(SNAME("multi_selected"), current, true);
|
|
emit_signal(SNAME("multi_selected"), current, true);
|
|
} else if (items[current].selected) {
|
|
} else if (items[current].selected) {
|
|
@@ -897,7 +912,7 @@ void ItemList::gui_input(const Ref<InputEvent> &p_event) {
|
|
} else if (p_event->is_action("ui_accept", true)) {
|
|
} else if (p_event->is_action("ui_accept", true)) {
|
|
search_string = ""; //any mousepress cancels
|
|
search_string = ""; //any mousepress cancels
|
|
|
|
|
|
- if (current >= 0 && current < items.size()) {
|
|
|
|
|
|
+ if (current >= 0 && current < items.size() && !items[current].disabled) {
|
|
emit_signal(SNAME("item_activated"), current);
|
|
emit_signal(SNAME("item_activated"), current);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|