mirror of
https://github.com/godotengine/godot.git
synced 2024-11-10 14:12:51 +00:00
Merge pull request #57894 from Sauermann/fix-subviewport-1
Fix unrestricted mouse-event propagation to SubViewports for Physics-Picking
This commit is contained in:
commit
72323a57d0
@ -159,7 +159,11 @@
|
||||
Calling this method will propagate calls to child nodes for following methods in the given order:
|
||||
- [method Node._input]
|
||||
- [method Control._gui_input] for [Control] nodes
|
||||
- [method Node._shortcut_input]
|
||||
- [method Node._unhandled_input]
|
||||
- [method Node._unhandled_key_input]
|
||||
If an earlier method marks the input as handled via [method set_input_as_handled], any later method in this list will not be called.
|
||||
If none of the methods handle the event and [member physics_object_picking] is [code]true[/code], the event is used for physics object picking.
|
||||
</description>
|
||||
</method>
|
||||
<method name="push_text_input">
|
||||
|
@ -262,7 +262,7 @@ void EditorCommandPalette::register_shortcuts_as_command() {
|
||||
ev.instantiate();
|
||||
ev->set_shortcut(shortcut);
|
||||
String shortcut_text = String(shortcut->get_as_text());
|
||||
add_command(command_name, E.key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_unhandled_input), varray(ev, false), shortcut_text);
|
||||
add_command(command_name, E.key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_input), varray(ev, false), shortcut_text);
|
||||
}
|
||||
unregistered_shortcuts.clear();
|
||||
|
||||
@ -283,7 +283,7 @@ Ref<Shortcut> EditorCommandPalette::add_shortcut_command(const String &p_command
|
||||
ev.instantiate();
|
||||
ev->set_shortcut(p_shortcut);
|
||||
String shortcut_text = String(p_shortcut->get_as_text());
|
||||
add_command(p_command, p_key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_unhandled_input), varray(ev, false), shortcut_text);
|
||||
add_command(p_command, p_key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_input), varray(ev, false), shortcut_text);
|
||||
} else {
|
||||
const String key_name = String(p_key);
|
||||
const String command_name = String(p_command);
|
||||
|
@ -221,33 +221,6 @@ bool SubViewportContainer::_is_propagated_in_gui_input(const Ref<InputEvent> &p_
|
||||
return false;
|
||||
}
|
||||
|
||||
void SubViewportContainer::unhandled_input(const Ref<InputEvent> &p_event) {
|
||||
ERR_FAIL_COND(p_event.is_null());
|
||||
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Transform2D xform = get_global_transform_with_canvas();
|
||||
|
||||
if (stretch) {
|
||||
Transform2D scale_xf;
|
||||
scale_xf.scale(Vector2(shrink, shrink));
|
||||
xform *= scale_xf;
|
||||
}
|
||||
|
||||
Ref<InputEvent> ev = p_event->xformed_by(xform.affine_inverse());
|
||||
|
||||
for (int i = 0; i < get_child_count(); i++) {
|
||||
SubViewport *c = Object::cast_to<SubViewport>(get_child(i));
|
||||
if (!c || c->is_input_disabled()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
c->push_unhandled_input(ev);
|
||||
}
|
||||
}
|
||||
|
||||
void SubViewportContainer::add_child_notify(Node *p_child) {
|
||||
if (Object::cast_to<SubViewport>(p_child)) {
|
||||
queue_redraw();
|
||||
@ -290,5 +263,4 @@ void SubViewportContainer::_bind_methods() {
|
||||
|
||||
SubViewportContainer::SubViewportContainer() {
|
||||
set_process_input(true);
|
||||
set_process_unhandled_input(true);
|
||||
}
|
||||
|
@ -55,7 +55,6 @@ public:
|
||||
|
||||
virtual void input(const Ref<InputEvent> &p_event) override;
|
||||
virtual void gui_input(const Ref<InputEvent> &p_event) override;
|
||||
virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
|
||||
void set_stretch_shrink(int p_shrink);
|
||||
int get_stretch_shrink() const;
|
||||
void recalc_force_viewport_sizes();
|
||||
|
@ -2907,6 +2907,10 @@ void Viewport::push_input(const Ref<InputEvent> &p_event, bool p_local_coords) {
|
||||
_gui_cleanup_internal_state(ev);
|
||||
}
|
||||
|
||||
if (!is_input_handled()) {
|
||||
push_unhandled_input(ev, true);
|
||||
}
|
||||
|
||||
event_count++;
|
||||
}
|
||||
|
||||
|
@ -1384,10 +1384,6 @@ void Window::_window_input(const Ref<InputEvent> &p_ev) {
|
||||
if (is_inside_tree()) {
|
||||
push_input(p_ev);
|
||||
}
|
||||
|
||||
if (!is_input_handled() && is_inside_tree()) {
|
||||
push_unhandled_input(p_ev);
|
||||
}
|
||||
}
|
||||
|
||||
void Window::_window_input_text(const String &p_text) {
|
||||
|
Loading…
Reference in New Issue
Block a user