Răsfoiți Sursa

Merge pull request #81532 from wlsnmrk/button-focus-loss-event-fix

Fix `button_up` and `button_down` signals with focus changes or multiple inputs
Rémi Verschelde 7 luni în urmă
părinte
comite
f99a465956
2 a modificat fișierele cu 10 adăugiri și 3 ștergeri
  1. 9 2
      scene/gui/base_button.cpp
  2. 1 1
      scene/gui/base_button.h

+ 9 - 2
scene/gui/base_button.cpp

@@ -114,6 +114,11 @@ void BaseButton::_notification(int p_what) {
 			} else if (status.hovering) {
 				queue_redraw();
 			}
+
+			if (status.pressed_down_with_focus) {
+				status.pressed_down_with_focus = false;
+				emit_signal(SNAME("button_up"));
+			}
 		} break;
 
 		case NOTIFICATION_VISIBILITY_CHANGED:
@@ -146,9 +151,10 @@ void BaseButton::_toggled(bool p_pressed) {
 void BaseButton::on_action_event(Ref<InputEvent> 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.pressing_inside = true;
+		status.pressed_down_with_focus = true;
 		emit_signal(SNAME("button_down"));
 	}
 
@@ -175,9 +181,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.pressing_inside = false;
+		status.pressed_down_with_focus = false;
 		emit_signal(SNAME("button_up"));
 	}
 

+ 1 - 1
scene/gui/base_button.h

@@ -61,7 +61,7 @@ private:
 		bool hovering = false;
 		bool press_attempt = false;
 		bool pressing_inside = false;
-
+		bool pressed_down_with_focus = false;
 		bool disabled = false;
 
 	} status;