Browse Source

Fix InputEvent being used twice

A single mouse click can cause multiple actions, which contradicts
the paradigm that a single Input Event should cause only a single
action.

The solution consists of two parts:
1. Physics Picking as the last step during viewport input event
handling, currently doesn't set the event as handled. This PR sets
the event as handled in the case of physics picking.
2. After an InputEvent is processed by a SubVieportContainer, it is
sent to its parent, even if it set as handled within the SubViewport.
This PR adds an additional test to check if the event is handled
before propagating the event to the parent Control.
Markus Sauermann 2 years ago
parent
commit
a9bf3de08e
2 changed files with 7 additions and 0 deletions
  1. 6 0
      scene/main/viewport.cpp
  2. 1 0
      tests/scene/test_text_edit.h

+ 6 - 0
scene/main/viewport.cpp

@@ -1564,6 +1564,11 @@ bool Viewport::_gui_call_input(Control *p_control, const Ref<InputEvent> &p_inpu
 			}
 		}
 
+		if (is_input_handled()) {
+			// Break after Physics Picking in SubViewport.
+			break;
+		}
+
 		if (ci->is_set_as_top_level()) {
 			break;
 		}
@@ -3045,6 +3050,7 @@ void Viewport::push_unhandled_input(const Ref<InputEvent> &p_event, bool p_local
 
 						)) {
 			physics_picking_events.push_back(ev);
+			set_input_as_handled();
 		}
 	}
 }

+ 1 - 0
tests/scene/test_text_edit.h

@@ -38,6 +38,7 @@
 namespace TestTextEdit {
 
 TEST_CASE("[SceneTree][TextEdit] text entry") {
+	SceneTree::get_singleton()->get_root()->set_physics_object_picking(false);
 	TextEdit *text_edit = memnew(TextEdit);
 	SceneTree::get_singleton()->get_root()->add_child(text_edit);
 	text_edit->grab_focus();