mirror of https://github.com/godotengine/godot
Fix button up and down events with focus changes
Adds a flag to guard button_up and button_down events based on whether button_down has been previously emitted. Buttons now emit button_up signals if they have emitted button_down and subsequently lose focus, do not emit button_up if they gain focus while ui_accept is still pressed, and do not emit multiple up/down signals if multiple ui_accept keys are pressed simultaneously.
This commit is contained in:
parent
506d6e427a
commit
6a12fac44c
|
|
@ -115,6 +115,11 @@ void BaseButton::_notification(int p_what) {
|
||||||
} else if (status.hovering) {
|
} else if (status.hovering) {
|
||||||
queue_redraw();
|
queue_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status.pressed_down_with_focus) {
|
||||||
|
status.pressed_down_with_focus = false;
|
||||||
|
emit_signal(SNAME("button_up"));
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case NOTIFICATION_VISIBILITY_CHANGED:
|
case NOTIFICATION_VISIBILITY_CHANGED:
|
||||||
|
|
@ -147,9 +152,10 @@ void BaseButton::_toggled(bool p_pressed) {
|
||||||
void BaseButton::on_action_event(Ref<InputEvent> p_event) {
|
void BaseButton::on_action_event(Ref<InputEvent> p_event) {
|
||||||
Ref<InputEventMouseButton> mouse_button = p_event;
|
Ref<InputEventMouseButton> mouse_button = p_event;
|
||||||
|
|
||||||
if (p_event->is_pressed() && (mouse_button.is_null() || status.hovering)) {
|
if (!status.pressed_down_with_focus && p_event->is_pressed() && (mouse_button.is_null() || status.hovering)) {
|
||||||
status.press_attempt = true;
|
status.press_attempt = true;
|
||||||
status.pressing_inside = true;
|
status.pressing_inside = true;
|
||||||
|
status.pressed_down_with_focus = true;
|
||||||
emit_signal(SNAME("button_down"));
|
emit_signal(SNAME("button_down"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -176,9 +182,10 @@ void BaseButton::on_action_event(Ref<InputEvent> p_event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!p_event->is_pressed()) {
|
if (status.pressed_down_with_focus && !p_event->is_pressed()) {
|
||||||
status.press_attempt = false;
|
status.press_attempt = false;
|
||||||
status.pressing_inside = false;
|
status.pressing_inside = false;
|
||||||
|
status.pressed_down_with_focus = false;
|
||||||
emit_signal(SNAME("button_up"));
|
emit_signal(SNAME("button_up"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ private:
|
||||||
bool hovering = false;
|
bool hovering = false;
|
||||||
bool press_attempt = false;
|
bool press_attempt = false;
|
||||||
bool pressing_inside = false;
|
bool pressing_inside = false;
|
||||||
|
bool pressed_down_with_focus = false;
|
||||||
bool disabled = false;
|
bool disabled = false;
|
||||||
|
|
||||||
} status;
|
} status;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue