mirror of https://github.com/godotengine/godot
Fix routing of InputEventScreenDrag events to Control nodes
This commit is contained in:
parent
0ff8742919
commit
3ff7dd2aa4
|
|
@ -1880,9 +1880,11 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
||||||
Ref<InputEventScreenTouch> touch_event = p_event;
|
Ref<InputEventScreenTouch> touch_event = p_event;
|
||||||
if (touch_event.is_valid()) {
|
if (touch_event.is_valid()) {
|
||||||
Size2 pos = touch_event->get_position();
|
Size2 pos = touch_event->get_position();
|
||||||
|
const int touch_index = touch_event->get_index();
|
||||||
if (touch_event->is_pressed()) {
|
if (touch_event->is_pressed()) {
|
||||||
Control *over = gui_find_control(pos);
|
Control *over = gui_find_control(pos);
|
||||||
if (over) {
|
if (over) {
|
||||||
|
gui.touch_focus[touch_index] = over->get_instance_id();
|
||||||
bool stopped = false;
|
bool stopped = false;
|
||||||
if (over->can_process()) {
|
if (over->can_process()) {
|
||||||
touch_event = touch_event->xformed_by(Transform2D()); // Make a copy.
|
touch_event = touch_event->xformed_by(Transform2D()); // Make a copy.
|
||||||
|
|
@ -1899,17 +1901,25 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (touch_event->get_index() == 0 && gui.last_mouse_focus) {
|
} else {
|
||||||
bool stopped = false;
|
bool stopped = false;
|
||||||
if (gui.last_mouse_focus->can_process()) {
|
ObjectID control_id = gui.touch_focus[touch_index];
|
||||||
|
Control *over = control_id.is_valid() ? Object::cast_to<Control>(ObjectDB::get_instance(control_id)) : nullptr;
|
||||||
|
if (over && over->can_process()) {
|
||||||
touch_event = touch_event->xformed_by(Transform2D()); // Make a copy.
|
touch_event = touch_event->xformed_by(Transform2D()); // Make a copy.
|
||||||
touch_event->set_position(gui.focus_inv_xform.xform(pos));
|
if (over == gui.last_mouse_focus) {
|
||||||
|
pos = gui.focus_inv_xform.xform(pos);
|
||||||
|
} else {
|
||||||
|
pos = over->get_global_transform_with_canvas().affine_inverse().xform(pos);
|
||||||
|
}
|
||||||
|
touch_event->set_position(pos);
|
||||||
|
|
||||||
stopped = _gui_call_input(gui.last_mouse_focus, touch_event);
|
stopped = _gui_call_input(over, touch_event);
|
||||||
}
|
}
|
||||||
if (stopped) {
|
if (stopped) {
|
||||||
set_input_as_handled();
|
set_input_as_handled();
|
||||||
}
|
}
|
||||||
|
gui.touch_focus.erase(touch_index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1944,7 +1954,9 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
|
||||||
|
|
||||||
Ref<InputEventScreenDrag> drag_event = p_event;
|
Ref<InputEventScreenDrag> drag_event = p_event;
|
||||||
if (drag_event.is_valid()) {
|
if (drag_event.is_valid()) {
|
||||||
Control *over = gui.mouse_focus;
|
const int drag_event_index = drag_event->get_index();
|
||||||
|
ObjectID control_id = gui.touch_focus[drag_event_index];
|
||||||
|
Control *over = control_id.is_valid() ? Object::cast_to<Control>(ObjectDB::get_instance(control_id)) : nullptr;
|
||||||
if (!over) {
|
if (!over) {
|
||||||
over = gui_find_control(drag_event->get_position());
|
over = gui_find_control(drag_event->get_position());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -354,6 +354,7 @@ private:
|
||||||
bool forced_mouse_focus = false; //used for menu buttons
|
bool forced_mouse_focus = false; //used for menu buttons
|
||||||
bool mouse_in_viewport = true;
|
bool mouse_in_viewport = true;
|
||||||
bool key_event_accepted = false;
|
bool key_event_accepted = false;
|
||||||
|
HashMap<int, ObjectID> touch_focus;
|
||||||
Control *mouse_focus = nullptr;
|
Control *mouse_focus = nullptr;
|
||||||
Control *last_mouse_focus = nullptr;
|
Control *last_mouse_focus = nullptr;
|
||||||
Control *mouse_click_grabber = nullptr;
|
Control *mouse_click_grabber = nullptr;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue